contextmenu — u_pbt_contextmenu #
← Référence des composants · Sommaire du guide
Le menu contextuel de Windows, au thème de l'application : une liste en cascade qui s'ouvre au curseur, sous un contrôle ou à un point de l'écran — icônes, raccourcis affichés, coches, entrées radio, en-têtes de section, longues listes qui défilent et répondent à la frappe.
▶ Le voir en vrai — Application de démonstration, tuile Context menu : l'aperçu, le code qui le produit et cette page, côte à côte.
En bref #
| Userobject | u_pbt_contextmenu |
| Classe d'items | n_pbt_contextmenu_item (of_item(keys)) |
| Sert à | Offrir, au clic droit ou sous un bouton, les commandes qui valent pour ce qui est sous la main |
| Principe | Vous décrivez les entrées par leur adresse ; la fenêtre, le clavier et les cascades sont à nous |
| Option opt-in | ib_track_hover |
Démarrage rapide #
// The menu of a grid : three commands, a separator, a cascade
uo_menu.of_add_item(/*keys*/ "copy", /*text*/ "&Copy")
uo_menu.of_add_item(/*keys*/ "paste", /*text*/ "&Paste")
uo_menu.of_add_item(/*keys*/ "delete", /*text*/ "&Delete")
uo_menu.of_add_separator(/*keys*/ "")
uo_menu.of_add_item(/*keys*/ "export", /*text*/ "&Export")
uo_menu.of_add_item(/*keys*/ "export/pdf", /*text*/ "PDF")
uo_menu.of_add_item(/*keys*/ "export/csv", /*text*/ "CSV")
// It opens from the right-click event of the grid : see Where to call of_show
// event ue_item_selected of uo_menu : (string as_keys)
// as_keys is the ADDRESS of the chosen entry
choose case as_keys
case "copy"
of_copy_selection()
case "export/pdf"
of_export("pdf")
end choose
Ouvrir le menu #
Le composant lui-même est invisible : il ne prend aucune place dans la fenêtre. Posez-le n'importe où, largeur et hauteur nulles — il n'existe que tant que le menu est ouvert. Quatre façons de l'ouvrir :
of_show()— au curseur, depuis le clic droit du contrôle qui reçoit le geste — voir le tableau ci-dessous.of_show_under(contrôle)— sous un contrôle : le menu pend de son bord bas, calé sur son bord de début (son bord droit en lecture de droite à gauche), et s'ouvre au-dessus quand l'écran s'arrête dessous. Ce qu'il faut à un bouton Plus ou … — et au clavier :of_show_under(contrôle, true)désigne la première entrée active.of_show(x, y)— à un point de l'écran, en pixels. Des coordonnées négatives sont un vrai point : un écran placé à gauche ou au-dessus du principal.of_show_at(contrôle, x, y)— à un point dans un contrôle, en unités PowerBuilder depuis son coin haut gauche : le point que prenaitPopMenu, rien à convertir.of_source()nomme ensuite ce contrôle dansue_item_selected— un seul menu pour plusieurs contrôles.
// event rbuttondown of a DataWindow : the row under the cursor first
if row > 0 then dw_list.SetRow(/*row*/ row)
uo_menu.of_show()
// event ue_clicked of a "More" button : the menu hangs from it
uo_menu.of_show_under(/*control*/ uo_more)
// event rbuttondown of a DataWindow, another way : the point in the control, in
// PowerBuilder units, as PopMenu took it
uo_menu.of_show_at(/*control*/ dw_list, /*x*/ dw_list.PointerX(), /*y*/ dw_list.PointerY())
Où appeler of_show #
| Contrôle | Événement | À savoir |
|---|---|---|
| DataWindow | rbuttondown | Rendez d'abord courante la ligne cliquée (SetRow(row)). L'appui convient : seul un appui choisit une entrée, jamais le relâchement qui le suit |
| ListView, TreeView | rightclicked | L'événement donne l'élément cliqué |
| Composant PBToolboxAI | ue_rclicked | Un composant à éléments a aussi un événement de clic droit d'élément, qui le nomme par son adresse |
| Champ de saisie | un événement utilisateur sur pbm_contextmenu | Il arrive au clic droit ; return 1 empêche le champ d'ouvrir aussi son propre menu Windows (Couper, Copier, Coller). Le clavier n'y arrive pas sous PowerBuilder 10 : voir la recette ci-dessous |
of_show() s'ouvre où se trouve le curseur, c'est-à-dire là où l'utilisateur a cliqué : aucune unité à convertir. of_show(x, y) attend des pixels de l'écran, jamais les unités PowerBuilder d'un xpos/ypos relatif au contrôle. Pour un point dans un contrôle, en unités PowerBuilder, c'est of_show_at(contrôle, x, y).
Au clavier — Maj+F10 ou la touche Menu — la souris est n'importe où : ouvrez le menu sous le contrôle qui a le focus, par of_show_under(contrôle, true). Comme dans Windows, sa première entrée active est alors désignée : Entrée la choisit, les flèches partent de là. Sous PowerBuilder 10, pbm_contextmenu ne reçoit que le clic droit, et Maj+F10 n'atteint pas un champ de saisie (mesuré : ni pbm_contextmenu, ni pbm_keydown, ni pbm_syskeydown). La touche du clavier qui ouvre le menu sur un contrôle PowerBuilder est donc la touche Menu (KeyApps!), prise dans un événement utilisateur sur pbm_keydown — pbm_dwnkey pour un DataWindow, dont le clic droit passe par son événement rbuttondown : pbm_contextmenu n'y arrive pas pour un clic dans une cellule (mesuré). Maj+F10 reste reçu par les composants PBToolboxAI eux-mêmes (leur ue_rclicked).
// User event ue_contextmenu of an edit field, mapped on pbm_contextmenu :
// the right-click opens the menu at the cursor
uo_menu.of_show()
// The field does not open its own Windows menu as well
return 1
// User event ue_key of the same field, mapped on pbm_keydown : the Menu key
// opens the menu under the field, its first entry highlighted
if key = KeyApps! then
uo_menu.of_show_under(/*control*/ this, /*keyboard*/ true)
return 1
end if
// User event ue_key of a DataWindow, mapped on pbm_dwnkey : the Menu key
if key = KeyApps! then
uo_menu.of_show_under(/*control*/ this, /*keyboard*/ true)
return 1
end if
Une seule réponse par ouverture : un menu ouvert se termine par un choix (ue_item_selected) ou sans choix (ue_dismissed — un clic dehors, Échap, of_close). Un menu qui n'a rien à montrer ne s'ouvre pas : ue_dismissed arrive tout de suite. Pendant que le menu est à l'écran l'application continue de tourner : une entrée grisée, masquée ou retirée entre-temps ne peut plus être choisie (ue_dismissed à la place), et of_remove_item, of_clear ou of_reset ferment le menu ouvert. ue_dismissed(as_reason) dit pourquoi : REASON_ESCAPE (Échap), REASON_OUTSIDE (un clic dehors), REASON_FOCUS (une autre fenêtre a pris le focus), REASON_USER (une autre façon, un autre menu qui prend la place), REASON_CODE (of_close, une entrée retirée ou le menu vidé), REASON_REPLACED (un second of_show), REASON_EMPTY (rien à montrer), REASON_UNAVAILABLE (l'entrée choisie n'était plus disponible).
Un menu à la fois : un second of_show remplace le menu ouvert, qui répond d'abord ue_dismissed. Et of_close appelé juste après of_show ferme le menu avant même qu'il soit dessiné — ue_dismissed suit aussi.
Au clavier, les flèches parcourent les entrées en sautant les grisées, → ouvre une cascade et ← la referme, Entrée choisit, Échap remonte d'un niveau puis ferme. La lettre soulignée — celle qui suit & dans le libellé, && pour une esperluette — choisit l'entrée directement ; ailleurs, taper les premières lettres d'un libellé va à l'entrée, espaces compris (« report 2 »). Une longue liste (plus de cinq cents entrées comprises) défile et reste fluide. Lu de droite à gauche, le menu s'aligne à droite et les cascades s'ouvrent vers la gauche.
Cascades, sections et marques #
Une entrée se désigne par son adresse : sa clé seule au premier niveau (copy), les clés de ses parents puis la sienne, jointes par /, dans une cascade (export/pdf). Le parent doit exister ; une clé ne contient ni / ni | et ne commence pas par __. ue_item_selected rend cette même adresse : deux cascades peuvent nommer leurs entrées pareil.
Un séparateur (of_add_separator) et un en-tête de section (of_add_header) se posent à la fin du menu (adresse vide) ou de la cascade d'une entrée. Ni l'un ni l'autre n'est une entrée : jamais choisis, jamais comptés. Un séparateur ne s'affiche jamais en tête, en queue ni en double ; un en-tête dont toutes les entrées sont masquées disparaît avec elles.
Une coche (ib_checked) dit qu'une option est active ; une entrée radio (is_group) est un choix parmi plusieurs : les entrées d'un même groupe sous le même parent s'excluent — en cocher une, par le code ou par le choix de l'utilisateur, décoche les autres, et une puce ronde remplace la coche. Le raccourci (is_shortcut) s'affiche à droite de l'entrée ; il est affiché seulement : la touche appartient au contrôle dont parle le menu (un champ de saisie copie déjà sur Ctrl+C), et un menu contextuel qui l'armerait la prendrait à tous les contrôles de la fenêtre.
Une entrée cochée hors groupe ne bascule pas d'elle-même quand l'utilisateur la choisit — comme dans tout menu Windows : basculez-la dans ue_item_selected. Une commande qui détruit se distingue par son ton : is_tone = TONE_DANGER écrit son texte dans le rouge du thème, lisible en clair comme en sombre. Pour qu'une option se bascule d'elle-même au choix, posez ib_auto_check = true : la coche change avant ue_item_selected. Une option est une case à cocher — annoncée « non cochée » par un lecteur d'écran — dès qu'elle a été cochée une fois, ou dès ib_checkable = true.
// A section of three exclusive entries in the View cascade
uo_menu.of_add_header(/*keys*/ "view", /*text*/ "Layout")
uo_menu.of_add_item(/*keys*/ "view/list", /*text*/ "&List")
uo_menu.of_add_item(/*keys*/ "view/details", /*text*/ "&Details")
uo_menu.of_item(/*keys*/ "view/list").is_group = "layout"
uo_menu.of_item(/*keys*/ "view/details").is_group = "layout"
// Checking one unchecks the other
uo_menu.of_item(/*keys*/ "view/details").ib_checked = true
// The shortcut SHOWN at the right of an entry
uo_menu.of_item(/*keys*/ "copy").is_shortcut = "Ctrl+C"
// A command that destroys : the red of the theme
uo_menu.of_item(/*keys*/ "delete").is_tone = uo_menu.TONE_DANGER
// event ue_item_selected : a check mark outside a group is switched by you
if as_keys = "wrap" then uo_menu.of_item(/*keys*/ as_keys).ib_checked = not uo_menu.of_item(/*keys*/ as_keys).ib_checked
// ... or by the entry itself, before ue_item_selected
uo_menu.of_item(/*keys*/ "grid").ib_auto_check = true
Reprendre un menu PowerBuilder #
Vos menus surgissants sont déjà écrits ? of_load_menu en fait le menu du composant : passez l'élément sur lequel vous appeliez PopMenu. Chaque élément devient une entrée, cascades comprises, avec son texte (& compris), son état (Enabled, Checked, Visible), son Shortcut affiché à droite — comme le texte qui suit une tabulation — et son image de barre d'outils quand c'est un fichier présent. Sa clé est le ClassName de l'élément, à chaque niveau. Au choix, le script Clicked de l'élément s'exécute d'abord, puis ue_item_selected : le code écrit pour PopMenu continue de servir. Le menu reste vivant, comme avec PopMenu : chaque ouverture relit les éléments (Text, Enabled, Checked, Visible, Shortcut). Le code qui précédait PopMenu — m_paste.Enabled = (Clipboard() <> "") — et un Clicked qui fait this.Checked = not this.Checked se voient donc à l'ouverture suivante ; un élément grisé ou masqué pendant que le menu est ouvert ne lance pas son Clicked (ue_dismissed(REASON_UNAVAILABLE)). Gardez l'objet menu vivant tant que le composant s'en sert. of_loaded_item rend l'élément d'une entrée, pour lire ce que seul le menu sait (sa MicroHelp) — testez-le par IsValid, une entrée ajoutée à la main n'en a pas. Un script Clicked qui lit ParentWindow y trouve une fenêtre valide — mesuré sous PowerBuilder 10, même pour un menu créé par create et jamais attaché à une fenêtre — mais c'est PowerBuilder qui la choisit : rien ne garantit que ce soit la fenêtre qui porte le menu contextuel. Pour qu'un Clicked atteigne une fenêtre précise, donnez-la au menu dans une variable d'instance, posée avant of_load_menu, ou déplacez ce code dans ue_item_selected.
// Instance variable of the window : the menu lives as long as it does
// m_popup im_popup
// open event of the window : the items of m_popup.m_edit become the menu
im_popup = create m_popup
uo_menu.of_load_menu(/*menu*/ im_popup.m_edit)
// event rbuttondown of the DataWindow : the code before PopMenu stays,
// of_show replaces PopMenu - the items are read again as it opens
im_popup.m_edit.m_paste.Enabled = (Clipboard() <> "")
uo_menu.of_show()
// event ue_item_hover of uo_menu (ib_track_hover = true) : the MicroHelp
if IsValid(uo_menu.of_loaded_item(/*keys*/ as_keys)) then st_help.text = uo_menu.of_loaded_item(/*keys*/ as_keys).MicroHelp
// A Clicked that must reach ONE given window : the menu keeps that window
// itself. Instance variable of m_popup : window iw_owner
// Clicked of m_edit.m_copy
iw_owner.TriggerEvent("ue_copy")
// open event of the window, before of_load_menu
im_popup.iw_owner = this
Propriétés #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
ib_track_hover | boolean | false | Active ue_item_hover, qui dit quelle entrée le pointeur ou le clavier désigne — pour la ligne d'aide d'une barre d'état. Sans lui, le menu ne le rapporte même pas : un événement levé à chaque mouvement n'est envoyé qu'à l'application qui l'a demandé — posez-la avant of_show : changée menu ouvert, elle vaut à l'ouverture suivante |
is_theme_style | string | "" | Style visuel du composant (constantes THEME_STYLE_*) ; vide = celui de l'application, suivi à chaque changement |
is_theme_mode | string | "" | Variante claire ou sombre (constantes THEME_MODE_*) ; vide = celle de l'application, suivie à chaque changement |
il_theme_accent | long | -1 | Couleur d'accent de ce composant (-1 = l'accent de l'application, ou celui du thème) |
Méthodes #
| Méthode | Rôle | |
|---|---|---|
of_add_header (string as_keys, string as_text) | Ajoute un en-tête de section à la fin du menu (adresse vide) ou de la cascade d'une entrée : une ligne de titre au-dessus des entrées qui la suivent. Jamais choisi ni compté. Rend 0 une fois ajouté, -5 quand aucune entrée ne vit à cette adresse, -2 quand le composant n'est pas créé | |
of_add_item (string as_keys, string as_text) | Ajoute une entrée à son adresse : copy dans le menu, export/pdf dans la cascade d'une entrée export existante, aussi profond qu'il faut. Un libellé vide montre la clé ; & désigne la lettre qui la choisit au clavier. Rend 0 une fois ajoutée, -5 quand l'adresse est refusée (parent introuvable, adresse déjà prise, niveau vide comme export/, clé à ` | ou commençant par __), -2` quand le composant n'est pas créé |
of_add_item (string as_keys, string as_text, string as_image, boolean ab_checked) | Pareil, avec l'icône et la coche — l'icône en troisième, comme partout dans la bibliothèque. Une entrée se grise par sa poignée : of_item(keys).ib_enabled = false. Rend 0 une fois ajoutée, -5 quand l'adresse est refusée, -2 quand le composant n'est pas créé | |
of_add_separator (string as_keys) | Ajoute un séparateur à la fin du menu (adresse vide) ou de la cascade d'une entrée. Rend 0 une fois ajouté, -5 quand aucune entrée ne vit à cette adresse, -2 quand le composant n'est pas créé | |
of_clear ( ) | Vide le menu et libère les poignées obtenues par of_item. Un menu ouvert se ferme, et ue_dismissed le dit. Rend 0 une fois appliqué, -2 quand le composant n'est pas créé | |
of_close ( ) | Ferme le menu du composant s'il est à l'écran, sans choix : ue_dismissed suit, comme pour un clic dehors. Rien d'ouvert, rien ne se passe. Rend 0 une fois demandé, -2 quand le composant n'est pas créé | |
of_insert_item (string as_keys, string as_text, long al_index) | Insère une entrée à un rang de sa liste plutôt qu'à sa fin : as_keys est l'adresse qu'elle aura, al_index sa place parmi les entrées de cette liste, à partir de 1 (0 ou moins = la première, au-delà = la fin). Séparateurs et en-têtes ne comptent pas : l'entrée se place juste avant celle qui tenait ce rang. Rend 0 une fois ajoutée, -5 quand l'adresse est refusée (comme of_add_item), -2 quand le composant n'est pas créé | |
of_insert_item (string as_keys, string as_text, string as_image, boolean ab_checked, long al_index) | Pareil, avec l'icône et la coche, comme of_add_item les prend. Rend 0 une fois ajoutée, -5 quand l'adresse est refusée, -2 quand le composant n'est pas créé | |
of_is_open ( ) | true tant qu'un menu du composant est à l'écran — ouvert, et pas encore répondu par un choix ou un renvoi | |
of_item (string as_keys) | Rend la poignée d'une entrée, par son adresse, pour la lire ou la changer plus tard (libellé, état, icône, raccourci, groupe, couleurs). Une clé seule est résolue en l'adresse complète de la seule entrée qui la porte : of_item("pdf") et of_item("export/pdf") rendent alors la même poignée. Ambiguë, ou portée par aucune entrée, elle rend une poignée qui ne change rien plutôt que la mauvaise entrée | |
of_load_menu (menu am_menu) | Construit le menu depuis un menu PowerBuilder : passez l'élément sur lequel vous appeliez PopMenu. Ses éléments deviennent les entrées, cascades comprises, clé = ClassName ; au choix, le Clicked de l'élément s'exécute avant ue_item_selected. Les éléments sont relus à chaque ouverture. Le menu remplace ce que le composant tenait. Rend 0 une fois chargé, -5 quand le menu n'est pas valide, -2 quand le composant n'est pas créé | |
of_loaded_item (string as_keys) | L'élément de menu PowerBuilder d'où vient une entrée (of_load_menu), par son adresse — pour lire sa MicroHelp. Une adresse qui ne vient pas d'un menu rend une référence invalide : testez-la par IsValid | |
of_remove_item (string as_keys) | Retire une entrée et sa cascade ; les autres restent. Ses poignées sont libérées ; un menu ouvert se ferme (ue_dismissed). Rend 0 une fois retirée, -5 quand aucune entrée ne vit à cette adresse, -2 quand le composant n'est pas créé | |
of_reset ( ) | Vide le menu et remet chaque propriété à sa valeur par défaut, sans lever d'événement. Rend 0 une fois appliqué, -2 quand le composant n'est pas créé | |
of_show ( ) | Ouvre le menu au curseur. Appelez-le depuis le clic droit du contrôle qui reçoit le geste. Un menu sans entrée visible ne s'ouvre pas : ue_dismissed est levé. Rend 0 une fois demandé, -2 quand le composant n'est pas créé | |
of_show (long al_x, long al_y) | Pareil, à une position de l'écran en pixels. Des coordonnées négatives sont un vrai point : un écran placé à gauche ou au-dessus du principal. Rend 0 une fois demandé, -2 quand le composant n'est pas créé | |
of_show_at (dragobject ado_control, long al_x, long al_y) | Ouvre le menu à un point dans un contrôle, en unités PowerBuilder depuis son coin haut gauche — le point que prenait PopMenu : of_show_at(dw_list, dw_list.PointerX(), dw_list.PointerY()). Le contrôle est retenu : of_source le nomme. Rend 0 une fois demandé, -5 quand le contrôle n'est pas valide ou qu'une coordonnée est nulle, -2 quand le composant n'est pas créé | |
of_show_under (dragobject ado_control) | Ouvre le menu sous un contrôle : il pend de son bord bas, calé sur son bord de début (son bord droit en lecture de droite à gauche), et s'ouvre au-dessus quand l'écran s'arrête dessous. Rend 0 une fois demandé, -5 quand le contrôle n'est pas valide, -2 quand le composant n'est pas créé — sous un composant à éléments (une buttonbar, une toolbar), le menu pend sous le composant entier, pas sous l'un de ses boutons | |
of_show_under (dragobject ado_control, boolean ab_keyboard) | Pareil, en disant comment le menu a été demandé : true pour le clavier (Maj+F10, touche Menu) — la première entrée active est désignée, Entrée la choisit, comme dans Windows. Rend 0 une fois demandé, -5 quand le contrôle n'est pas valide, -2 quand le composant n'est pas créé | |
of_source ( ) | Le contrôle d'où le menu à l'écran — ou le dernier — a été ouvert : celui donné à of_show_under ou à of_show_at. Lisez-le dans ue_item_selected quand un menu sert plusieurs contrôles. Un menu ouvert au curseur ou à un point de l'écran (of_show) n'en a pas : la référence est invalide, testez-la par IsValid |
Événements #
| Événement | Déclenché quand |
|---|---|
ue_item_selected (string as_keys) | L'utilisateur a choisi une entrée, à la souris ou au clavier. as_keys est son adresse complète (export/pdf). Une entrée d'un groupe est cochée, et les autres de son groupe décochées, avant l'événement |
ue_dismissed (string as_reason) | Le menu s'est fermé sans choix : un clic dehors, Échap, of_close, une entrée retirée ou le menu vidé pendant qu'il était ouvert, un second of_show qui l'a remplacé — et aussi quand of_show n'avait rien à montrer — as_reason dit lequel : REASON_ESCAPE, REASON_OUTSIDE, REASON_FOCUS, REASON_USER, REASON_CODE, REASON_REPLACED, REASON_EMPTY, REASON_UNAVAILABLE (une entrée grisée, masquée ou retirée depuis l'ouverture) |
ue_item_hover (string as_keys) | Avec ib_track_hover = true : l'entrée que le pointeur désigne, par son adresse — une entrée grisée aussi, pour que son aide dise pourquoi ; au clavier, les entrées où il s'arrête, en sautant les grisées. Levé une fois par entrée, puis avec une adresse vide quand le menu se ferme : videz alors la ligne d'aide. of_reset ferme un menu ouvert sans le lever : videz-la vous-même |
Propriétés d'item #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
is_text | string | "" | Libellé de l'entrée. & désigne la lettre qui la choisit au clavier (&& pour une esperluette) ; vide, la clé s'affiche et le libellé se relit vide |
ib_enabled | boolean | true | À false, l'entrée est grisée : affichée, jamais choisie, sa cascade fermée |
ib_visible | boolean | true | À false, l'entrée quitte le menu — cascade comprise — sans être retirée : elle garde sa clé et son état, et revient à sa place. Une cascade dont toutes les entrées sont masquées reste, grisée |
ib_checked | boolean | false | Une coche sur l'entrée — une puce ronde pour une entrée d'un groupe. Cocher une entrée d'un groupe décoche les autres du groupe ; hors groupe, l'entrée ne bascule pas d'elle-même au choix : faites-le dans ue_item_selected, ou posez ib_auto_check |
ib_checkable | boolean | false | Une case à cocher : l'option est montrée et annoncée comme telle même décochée (« non cochée » pour un lecteur d'écran). Une entrée cochée une fois le devient d'elle-même ; posez-la pour une option qui démarre décochée. Une entrée radio (is_group) n'en est jamais une |
ib_auto_check | boolean | false | À true, choisir l'entrée bascule sa coche d'elle-même, avant ue_item_selected — ib_checked y dit le nouvel état. Elle devient une case à cocher ; sans effet sur une entrée d'un groupe |
is_group | string | "" | Fait de l'entrée une entrée radio du groupe nommé : les entrées d'un groupe sous le même parent s'excluent. Vide : une entrée ordinaire |
is_image | string | "" | Icône de l'entrée, changée sur place. Mêmes chemins qu'of_add_item (mono:, tint:, fichier.dll:NOM) ; vide, elle disparaît |
is_shortcut | string | "" | Le raccourci affiché à droite de l'entrée (Ctrl+C). Affiché seulement : la touche appartient au contrôle dont parle le menu. Jamais montré sur une entrée qui ouvre une cascade |
is_tone | string | "" | Le ton de la commande : son texte, au repos, dans une couleur du thème clair ou sombre — TONE_DANGER pour celle qui détruit, TONE_WARN, TONE_SUCCESS, TONE_INFO ; vide ou TONE_NEUTRAL = le texte du thème. Pointée, l'entrée prend les couleurs de survol du thème ; un il_text_color de l'entrée l'emporte. Les constantes sont sur u_pbt_contextmenu |
il_accent | long | -1 | Accent de cette entrée : sa coche, et son bord quand elle est pointée (-1 = celui du thème) |
il_back_color | long | -1 | Fond de cette entrée au repos (-1 = celui du thème). Donné seul, le texte prend une couleur qui se lit dessus |
il_text_color | long | -1 | Couleur du texte de cette entrée (-1 = celle du thème). Une seule couleur ne se lit pas sur le thème clair et le sombre : posez il_back_color avec elle, ou préférez is_tone, qui suit le thème |
il_back_color_hover | long | -1 | Fond de cette entrée quand elle est pointée (-1 = celui du thème) |
il_text_color_hover | long | -1 | Couleur du texte de cette entrée quand elle est pointée (-1 = celle du thème) : posez il_back_color_hover avec elle, le survol du thème change d'un thème à l'autre |
Une entrée n'affiche aucune info-bulle : le menu natif n'en a pas. L'is_tooltip que la poignée hérite est gardé et se relit, mais il n'est jamais montré — pour une aide, ib_track_hover et ue_item_hover.
Exemples #
Un menu selon ce qui est cliqué #
// event ue_rclicked of the list : the menu is rebuilt for the current row
uo_menu.of_clear()
uo_menu.of_add_item(/*keys*/ "open", /*text*/ "&Open")
uo_menu.of_add_item(/*keys*/ "rename", /*text*/ "Re&name")
uo_menu.of_add_separator(/*keys*/ "")
uo_menu.of_add_item(/*keys*/ "delete", /*text*/ "&Delete")
// A row the user may not change : its commands are greyed
uo_menu.of_item(/*keys*/ "rename").ib_enabled = ib_can_edit
uo_menu.of_item(/*keys*/ "delete").ib_enabled = ib_can_edit
// At the cursor
uo_menu.of_show()
Un bouton Plus #
// event ue_clicked of the button : the menu hangs from it
uo_menu.of_show_under(/*control*/ uo_more)
Une aide dans la barre d'état #
// Once, after the menu is built : report the pointed entry
uo_menu.ib_track_hover = true
// event ue_item_hover of uo_menu : (string as_keys), "" when the menu closes
choose case as_keys
case "delete"
st_help.text = "Deletes the row, without the clipboard."
case else
st_help.text = ""
end choose
Bonnes pratiques #
- Ouvrez depuis l'événement de clic droit du contrôle (voir le tableau) : seul un appui choisit une entrée, le relâchement qui suit ne choisit rien.
- Un menu court. Les commandes fréquentes en haut, celles qui détruisent en bas, après un séparateur, avec
TONE_DANGER. - Grisez plutôt que masquer une commande qui existe mais ne s'applique pas ici : l'utilisateur apprend où elle est.
- Affichez les raccourcis de vos commandes : un menu contextuel est l'endroit où on les apprend.
- Une cascade, pas deux : au-delà d'un niveau, une boîte de dialogue se lit mieux.
Version de démonstration #
Sans clé, chaque liste du menu — la racine comme chaque cascade — montre ses six premières entrées visibles ; séparateurs et en-têtes ne comptent pas. La dernière ligne, grisée, dit combien d'entrées ne sont pas affichées — ou, sans coupe, porte la mention « PBToolboxAI — DEMO ». Le modèle garde tout : une clé montre le menu entier à l'ouverture suivante.
Le lanceur n'a pas de surface : des membres hérités ci-dessous, of_save_as_png, of_print et of_focus_webview n'ont rien à capturer, à imprimer ni à recevoir. of_register_shortcut reste utile — un raccourci de la fenêtre qui ouvre le menu par of_show_under.
Hérité du socle commun #
Ces membres existent sur tous les composants visuels — ils ne sont pas propres à celui-ci. Ils sont détaillés une seule fois, dans les chapitres transverses ; cette table dit seulement où les lire.
| Membres | Rôle | Détaillé dans |
|---|---|---|
of_count · of_keys_at · of_has | Parcourir ce que le composant contient | 3.2 Les items |
of_reset | Remettre le composant à zéro | 3.6 Remettre un composant à zéro : of_reset() |
of_register_shortcut · of_clear_shortcuts | Raccourcis clavier du composant | 3.5 Les raccourcis clavier |
of_is_created · of_is_ready · of_get_last_error | S'il est né, s'il est prêt, ce qui a échoué | 3.7 Diagnostic |
of_save_as_png · of_save_as_jpg | Exporter le rendu en image | 3.8 Exporter le rendu en image |
of_set_redraw | Grouper les modifications en un seul repaint | 3.10 Bonnes pratiques |
of_preload_icons | Icônes affichées sans délai | Affichage instantané : of_icon |
of_set_translation | Traduire un libellé du composant | 5.2 Adapter un libellé : of_set_translation |
of_focus_webview | Donner le focus au composant | 6.4 Clavier et focus |
of_print · of_print_to_pdf | Imprimer, ou écrire un PDF | 6.9 Imprimer |
of_set_property · of_get_property · of_component_name | Piloter une propriété par son nom | 3.1 Le moteur de propriétés |
is_accessible_name · is_accessible_description | Le nom et la description que dit un lecteur d'écran | 3.4 Propriétés et events optionnels |
Sur ce lanceur invisible, of_count et of_keys_at parcourent ce que vous avez ajouté, branches masquées comprises — pas ce que la roue dessinera. L'export en image, l'impression, of_focus_webview et of_set_redraw n'y ont pas d'effet utile : le composant ne dessine rien de lui-même, la roue vit dans sa propre fenêtre.
Deux aides ne sont pas héritées : of_icon et of_escape_markup vivent sur n_pbt_utils. Déclarez-en une — n_pbt_utils lnv_utils, rien à créer — et appelez-les dessus.