Editor de menús


Disponible a través del menú Eines-->Editor de menús o quan s'afegeix un recurs de menú (Projecte-->Afegir un Recurs-->Menú).

Mostra la finestra que es pot veure tot seguit i us permet dissenyar un menú per l'objecte finestra que estigui actiu (només als projectes visuals). Quan l'Editor de menús s'obre per un menú dissenyat com un recurs (vegeu Recursos), l'opció Accelerador no està disponible per què els Recursos tenen el seu propi dissenyador d'Acceleradors.

Als projectes visuals, cada objecte finestra pot tenir un objecte menú. Aquest objecte menú és el menú de nivell superior (top menu) que és assignat a l'objecte finestra (el que s'indica a la capçalera de l'Editor de menús) i no es mostra a la barra de menú (diguem que ell mateix és la barra de menú). Un objecte menú és un menú popup, que pot tenir altres menús popup dins seu. D'altra banda, dins dels menús popup hi pot haver ítems de menú o altres menús popup. Els menús popup que estan al primer nivell, és a dir, que són directament fills de l'objecte menú, seran mostrats a la barra de menú. Els altres menús popup o ítems de menú només es veuen quan es fa clic al seu menú popup pare. Un menú popup no té identificador perquè no envia missatges WM_COMMAND a la "owner window". Els ítems de menú es mostren quan es fa clic al seu menú popup pare i sí que tenen un identificador o ID. Un cop es mostren, podem fer clic a qualsevol menú ítem per tal de portar a terme una acció. Quan es fa clic en un menú ítem, s'envia un missatge WM_COMMAND amb el seu valor ID a la paraula baixa ("low word") del paràmetre wParam (la paraula alta, "high word", de wParam és 0). La finestra que rep el missatge és la finestra que té el menú assignat. Podem obtenir fàcilment el nom constant de cada item de menú simplement aplicant la següent norma:

La constant ID d'un ítem de menú està formada per 'IDM_' més el nom de l'objecte finestra, més '_', més el text que hagiu escrit a al quadre de text ID (aquest quadre de text no està disponible per menús popup i separadors). Per exemple, suposem que hem escrit SURT com a ID d'un ítem que és dins de l'objecte menú que pertany a la finestra anomenada wndMain. El nom constant per aquest ítem de menú serà (tot majúscules):

IDM_WNDMAIN_SURT

Per defecte, l'Easy Code assigna cada menú a la seva "owner window" (la que s'indica a la capçalera de l'Editor de menús en temps de disseny). El nom d'aquesta "owner window" s'utilitza per formar la constant ID. Si assigneu un menú a qualsevol altra finestra al llarg del codi (funció de l'API SetMenu), els missatges WM_COMMAND s'enviaran a la nova "owner window" del menú, però la seva constant ID NO CANVIARÀ. Per tant, heu d'utilitzar aquesta constant ID al llarg de tot el codi per l'ítem de menú en qüestió, per exemple quan s'escriu el codi del missatge WM_COMMAND a la finestra que té l'objecte menú assignat:

.ElseIf uMsg == WM_COMMAND
    ;Obtenir la "low word" de wParam (es necessita per tal que funcionin els acceleradors)
    LoWord wParam
    .If Ax == IDM_WNDMAIN_SURT
        ......
        Fer alguna operació...
        ······
        Return
TRUE
    .EndIf
.EndIf

A l'Editor de menús, una línia pot ser un menú popup només quan té ítems de menú, és a dir, quan almenys la línia immediatament següent té un tabulador més (>>). Fent clic als botons (>>) i (<<) podeu dissenyar un menú. Cada ítem de menú pot estar marcat, deshabilitat, o totes dues coses, i pot tenir un accelerador. Un accelerador és la tecla (o comibnació de tecles) que porta a terme la mateixa acció que fer clic a l'ítem de menú. Per exemple, a la majoria d'aplicacions, prémer la tecla <F1> és el mateix que obrir el menú Ajuda i fer click a l'ítem de menú Veure ajuda. Per aquells ítems de menú que vulgueu que apareixin com a separadors, escriviu només un guió (-) al seu text (el quadre de text anomenat Text). Per exemple, suposem que tenim les següents línies :

&Fitxer
    >>&Obrir
    >>&Tancar
    >>-
    >>Sortir

La primera línia (&Fitxer) és un menú popup (perquè les quatre línies següents tenen un tabulador més >>). Com que està al primer nivell (no té tabuladors), apareixerà a la barra de menú. Quan es faci clic damunt d'ell, es mostraran els seus quatre ítems de menú. El tercer ítem (quarta línia) és un separador. Els separadors no fan res més que separar les opcions. D'altra banda, fixeu-vos que els ampersands (&) no són visibles als menús popup o items de menú en temps d'execució, però fan que el caràcter immediatament a continuació de l'ampersand apareixi subratllat.

Ara suposem que volem afegir un altre menú popup, diguem per exemple, Edició. Haurem d'afegir les següents línies (les línies afegides en lletra negreta):

&Fitxer
    >>&Obrir
    >>&Tancar
    >>-
    >>Sortir
&Edició
    >>&Copia
    >>&Talla
    >>E&nganxa
    >>&Elimina

Com podeu veure, la sisena línia (&Edició) està al mateix nivell que la primera (&Fitxer) i té items de menú, per tant és un menú popup. Com que també està al primer nivell, apareixerà a la barra de menú, que es veurà més o menys així:

Fitxer   Edició

Després de crear un objecte menú, és fàcil escriure codi pels seus ítems de menú utilitzant els seus noms de constant. Pels ítems de menú de l'exemple anterior, suposem que hem assignat (al quadre de text anomenat ID) els següents ID's (recordeu que els menús popup i els separadors no tenen ID):

&Obre    ID:  OBRE
&Tanca   ID:  TANCA
&Surt    ID:  SURT

&Copia   ID: 
COPIA
&Talla   ID:  
TALLA
E&hganxa ID:  
ENGANXA
&Elimina ID:  ELIMINA

Com que l'objecte menú (top menu) pertany a la finestra anomenada wndMain, tots aquests ítems de menú tindran, respectivament, els següents noms de constant ID:

IDM_WNDMAIN_OBRE
IDM_WNDMAIN_TANCA
IDM_WNDMAIN_SURT

IDM_WNDMAIN_COPIA
IDM_WNDMAIN_TALLA
IDM_WNDMAIN_ENGANXA
IDM_WNDMAIN_ELIMINA

A més, a cada ítem de menú se li pot assignar (o no) una tecla acceleradora utilitzant el "combo box" anomenat Accelerador. Quan s'assigna almenys un accelerador, l'Easy Code crea una taula d'Acceleradors. Podeu aconseguir el "handle" d'aquesta taula, en temps d'execució, a través de l'objecte App.Accel, tot i que normalment no es necessita per què l'Easy Code també es cuida dels acceleradors (només en mode visual).

Quan treballeu amb aplicacions MDI (vegeu Aplicacions MDI), tingueu en compte que cada finestra MDI filla que s'activa, assigna el seu menú (si en té) a la finestra MDI frame. L'MDI frame (un objecte MDIWindow) serà llavors el propietari d'aquest menú, per tant els missatges dels ítems de menú s'enviaran a l'MDI frame, no a la MDI filla que originalment era la propietària del menú. Això no afecta per res als noms de constant ID dels ítems de menú, que continuen sent els mateixos. Quan l'MDI filla es desactiva, se li torna a assignar el seu menú i llavors l'MDI frame rebrà el menú de la nova finestra MDI filla activa.

IMPORTANT: Quan el quadre de verificació Owner draw està seleccionat, l'ítem de menú corresponent no es dibuixat pel Windows, sinó que s'envia un missatge WM_DRAWITEM a la finestra pare per tal que l'ítem de menú sigui dibuixat per l'aplicació.

NOTA: Tot el que acabem de veure només és vàlid pels projectes visuals. Quan l'Editor de menús s'obre per un menú dissenyat com a recurs, l'ID de cada ítem serà exactament el nom que s'hagi indicat al quadre de text ID, i els acceleradors s'hauran d'assignar de la manera clàssica, és a dir, creant una taula d'acceleradors on es relacioni cada combinació de tecles amb l'ítem de menú corresponent.

OBSERVACIONS: Per tal de ser encara més flexibles, els menús (popup i ítems) accepten IDentificadors de cadena al seu Text (vegeu Recursos).