Sviluppo

Come faccio? - parte IV

Gianni Ceccarelli
 

stesura originale in inglese di Eric Slaats - liberamente tradotto da Gianni Ceccarelli
comparso per la prima volta su Os/2 e-Zine! volume 2 numero 1

Benvenuti a questa nuova lezione sulla programmazione PM. In questi articoli saranno discussi semplici problemi di programmazione Presentation Manager. Questi articoli sono indirizzati a persone interessate alla programmazione PM o semplicemente curiose di sapere come funzionano i programmi PM. Per comprendere questi articoli, è utile un po' di esperienza di programmazione (preferibilmente in C++).

Il mese scorso abbiamo brevemente trattato le risorse. Abbiamo scoperto che le risorse possono rendere la vita molto più semplice. Per esempio, non abbiamo bisogno di programmare i menu, basta definirli e lasciar fare il resto al PM. Prima di addentrarci ulteriormente nelle possibilità degli altri tipi di risorsa, esploreremo ancora un po' la risorsa MENU.

I menu sono una parte molto importante delle applicazioni. Devono essere trattai con un certo rispetto e normalmente bisogna pensarci bene prima di crearli. Molti di voi avranno visto programmi mastodontici come WordPerfect o Microsoft Word. Questi progrrammi hanno enormi alberi di menu ed è spesso molto difficile (se non impossibile) trovare quello che state cerrcando. I menu di tanti programmi sono strapieni, illogici, con scorciatoie non segnalate, senza tasti di scelta rapida, ecc.

In questo articolo vedremo delle tecniche che renderanno i nostri menu piè attraenti e facili da usare. Ma prima, due parole sulle raccomandazioni CUA.

CUA significa Common User Access, che possiamo tradurre come "interfaccia utente uniforme". CUA è un insieme di raccomandazioni che fanno parte del SAA (System Application Architecture, architettura delle applicazioni di sistema) dell'IBM. Queste raccomandazioni furono introdotte nel 1987 e sono state modifcate molte volte nel corso degli anni. Ogni giorno vengono inventati nuovi controlli e il modo in cui dovrebbero apparire viene aggiunto alle raccomandazioni CUA. Sostanzialmente, CUA è un tentativo di rendere le interfacce utente coerenti, in modo che gli utenti trovino ciò che hanno imparato ad aspettarsi.

CUA descrive anche l'aspetto dei menu. Un esempio di ciò è che CUA dice che una voce di menu che farà aprire un box di dialogo dovrebbe essere seguita da tre puntini (...). Negli esempi di questo articolo cercheremo di seguire le raccomandazioni CUA.

Torniamo ai menu. Cosa abbiamo a disposizione per fare dei menu? Sfortunatamente non tutto può gestito tramite risorse, ma il codice richiesto sarà ridotto al minimo. Ricordate, non fate niente che il sistema può fare al posto vostro. In aggiunta a quanto discusso nell'articolo del mese scorso, vedremo:

  • Tasti di scelta rapida
  • Separatori
  • Interruzioni e interruzioni con separatori
  • Immagini nei menu
  • Colonne nei menu (segnalare gli acceleratori)
  • Sottomenu
  • Menu permanenti (il mese prossimo)
Anche i seguenti argomenti saranno trattati (il mese prossimo), ma richiederanno un po' di programmazione:
  • Voci di menu con spunta (checked)
  • Sottomenu condizionali
  • Disabilitare/abilitare voci di menu
È utile avviare l'esempio (sample4.exe nel file ZIP, 16k) mentre leggete l'articolo. In questo modo potrete vedere tutti gli stili trattati mentre leggete. Se tenete aperto anche il file RC, alcune note potrebbero essere lì. Ora, prendiamo i punti precedenti uno alla volta.

Tasti di scelta rapida

I tasti di scelta rapida funzionano quasi come gli acceleratori: attivano un menu con la pressione di un tasto. La differenza è che un acceleratore attiverà immediatamente l'azione relativa. Un tasto di scelta rapida attiverà la voce di menu cui è collegato solo quando il menu è visibile. I tasti di scelta rapida nei menu possono essere riconosciuti perché sono sottolineati. In molti casi è la prima lettera della voce di menu, e quindi tale voce può essere attivata premendo la lettera sottolineata. Se due voci nello stesso menu hanno lo stesso tasto, questo non attiverà nessuna delle due, quindi è meglio evitare i doppioni. Questo effetto può essere osservato nell'esempio nel menu "separators", dove ci sono due voci con "8" come tasto di scelta rapida.

I tasti di scelta rapida sono molto facili da creare, basta mettere una ~ (tilde) prima della lettera che vogliamo sia sottolineata. È buona pratica implementare tasti di scelta rapida per ogni voce di menu.

Nota: i tasti di scelta rapida possono essere usati anche nei box di dialogo per pulsanti, ecc.

Separatori

I separatori sono linee tra le voci di menu. OS/2 supporta tre diversi tipi di separatore. (Quattro, se consideriamo il normale BREAK come un separatore).

MENUITEM SEPARATOR - un separatore normalmente usato per tracciare una linea tra gruppi di voci che formano un blocco funzionale. Per esempio, nel menu Modifica le voci Elimina, Copia, Taglia, Incolla sono separate dalle altre da una linea. Nell'esempio, potete vedere queste linee nel menu "separators". Una linea di questo tipo può essere inserita creando una voce con il nome SEPARATOR.

MIS_BUTTONSEPARATOR - un separatore usato da molti programmi usano per disporre il menu Guida sulla destra con una piccola linea verticale davanti. Il menu Help dell'esempio è fatto in questo modo. CUA diceche si dovrebbe fare sempre così, ma personalmente la ritengo una questione di gusto (SmallEd infatti non è così).

MIS_BUTTONSEPARATOR è uno stile per la voce di menu (per questo comincia con MIS_, Menu Item Style). SEPARATOR è un vera e propria voce di menu, anche se non può essere selezionata. Gli attributi MIS_ possono essere applicati solo a voci di menu esistenti.

MIS_BREAKSEPARATOR - spezza un sottomenu prima della voce cui è applicato. In questo modo più colonne (o linee di menu) possono essere create. MIS_BREAKSEPARATOR traccia una linea tra le colonne. È anche possibile usare MIS_BREAK. In questo modo la linea non sarà tracciata. Entrambi gli stili sono visibili nel menu "separators" dell'esempio.

Immagini / voci riquadrate

Una delle cose belle a proposito dei menu è che possono contenere anche immagini. Questo dà un modo semplice per creare le barre di pulsanti che vediamo in tante applicazioni. (La barra pulsanti di SmallEd è un buon esempio. È un menu con immagini e si comporta come tale. Se vi interessa come ciò sia ottenuto, leggete EDM/2 3.4, "Building custom controls" e EDM/2 3.8, "Easy buttonbars".) In un prossimo articolo mostrerò come costruire facilmente una barra pulsanti; per il momento ci limiteremo a inserire una piccola immagine in un menu.

Le immagini (bitmap) possono essere trattate come risorse. Per l'esempio di questo mese ho creato due immagini con l'editor di icone e le ho incluse nel file RC. Per fare questo sono state aggiunte le seguenti linee:

   // identificatori delle immagini
        BITMAP 1001   "FILEBUT.BMP"
        BITMAP 1002   "DIRBUT.BMP"
Con l'inserimento di queste linee, le immagini possono essere gestite come risorse. Per mettere queste immagini in una voce di menu la prima cosa da fare è creare una voce di menu con lo stile "bitmap". Due voci del menu "Bitmap" sono create in questo modo. Le voci di testo sono state aggiunte per mostrare che testo e immagini possono essere combinati. Potete anche osservare come una voce di menu con immagine viene dimensionata secondo le dimensioni dell'immagine.
SUBMENU "~Bitmaps", IDM_MENU
        BEGIN
                MENUITEM "Text", IDM_ITEM
                MENUITEM "#1001", IDM_ITEM, MIS_BITMAP
                MENUITEM "#1002", IDM_ITEM, MIS_BITMAP, MIA_FRAMED
                MENUITEM "Text", IDM_ITEM
        END
Nell'esempio potete vedere come il testo per la voce con immagine contenga un # seguito dall'ID dell'immagine. Il # è una direttiva per il compilatore di risorse che indica quale immagine usare.

La terza voce ha anche l'attributo MIA_FRAMED. (MIA sta per Menu Item Attribute.) Se osservate il menu "bitmap" potrete notare l'effetto di questo attributo: traccia una sottile linea attorno alla voce di menu. Questo produce un piacevole effetto visivo che è particolarmente utile con le immagini.

Colonne nei menu

In molte applicazioni vengono usati gli acceleratori. È buona pratica elencare questi tasti accanto alle voci di menu che eseguono la stessa azione. Normalmente la voce di menu è mostrata sulla sinistra e l'acceleratore sulla destra. OS/2 supporta due modi per fare ciò. Nel menu "columns" dell'esempio possiamo osservare entrambi i metodi. In breve, ci si riduce ad allineare a sinistra la colonna di destra (esempio di sinistra) o allinearla a destra (esempio di destra).

Per allineare a sinistra una parte di testo, aggiungiamo un \t nella dichiarazione (potete riconoscerlo come la sequenza per il Tab nell'istruzione printf del C/C++.) Per allineare a destra, aggiungamo un \a.

SUBMENU "~Columns", IDM_MENU
        BEGIN
                MENUITEM "1 \t****", IDM_ITEM
                MENUITEM "22 \t***", IDM_ITEM
                MENUITEM "333 \t**", IDM_ITEM
                MENUITEM "4444 \t*", IDM_ITEM
                MENUITEM "5 \a****", IDM_ITEM, MIS_BREAKSEPARATOR
                MENUITEM "66 \a***", IDM_ITEM
                MENUITEM "777 \a**", IDM_ITEM
                MENUITEM "8888 \a*", IDM_ITEM
        END

Semplici sottomenu in cascata

I menu a cascata sono un modo elegante per aggiungere sottomenu indicando visivamente che un sottomenu è disponibile. L'indicazione è data da una piccola freccia a destra della voce. Queste frecce si presentano in due varietà, una semplice immagine e una che è anche un pulsante. Se aprite il menu della Scrivania vedrete esempi di entrambi. La voce "Visualizzare" ha una semplice freccia, mentre "Aprire" ha un piccolo pulsante. La prima è un normale sottomenu, quella con il pulsante è chiamata sottomenu condizionale. Ciascuna reagisce in maniera diversa quando viene selezionata: la prima mostra semplicemente il sottomenu, mentre l'altra attiva la prima voce del sottomenu senza mostrarlo. Per vedere il sottomenu condizonale, bisogna premere il pulsante. Questo mese ci occuperemo solo dei sottomenu normali. (I sottomenu condizionali richiedono un po' di programmazione aggiuntiva e saranno trattati il mese prossimo.)

Cosa dobbiamo fare per creare un sottomenu normale? Beh, niente. Se creiamo un sottomenu in un sottomenu il compilatore di risorse aggiungera la freccetta mostrandoci così che esiste un altro sottomenu.

Per ora è tutto. Il mese prossimo ci addentreremo più a fondo nelle possibilità dei menu. Aggiungeremo un po' di programmazione e vedremo che possiamo fare molto altro con le risorse di menu.


[Pagina precedente] [Sommario] [Pagina successiva]