Esempio di voce di Menu bitmap

L'esempio in questo argomento crea due menu, ciascuna contenente diverse voci di menu di bitmap. Per ciascuna voce di menu, l'applicazione aggiunge un nome di menu corrispondente alla barra dei menu della finestra principale.

Primo menu contiene voci di menu, mostrando di ciascuno dei tre tipi di grafico: torta, linea e bar. Le bitmap per queste voci di menu sono definite come risorse e vengono caricate utilizzando il LoadBitmap funzione. Associato a questo menu Ŕ un nome di menu "Chart" sulla barra dei menu.

Secondo menu contiene voci di menu mostrando ciascuno degli stili cinque linea utilizzati con il CreatePen funzione: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT e PS_DASHDOTDOT. L'applicazione crea le bitmap per queste voci di menu in fase di esecuzione utilizzando le funzioni di disegno GDI. Associato a questo menu Ŕ un nome di menu "Linee" sulla barra dei menu.

Definito nella routine della finestra dell'applicazione sono due array statico delle maniglie di bitmap. Una matrice contiene le maniglie delle tre bitmap utilizzate per il menu grafico. L'altro contiene le maniglie delle cinque bitmap utilizzate per il menu di linee. Durante l'elaborazione del messaggio WM_CREATE , la routine della finestra carica le bitmap grafico, crea le bitmap di linea e quindi aggiunge le voci di menu corrispondente. Durante l'elaborazione del messaggio WM_DESTROY , la routine di finestra elimina tutte le bitmap.

Di seguito sono le parti pertinenti del file di intestazione dell'applicazione.

/ / Gli identificatori di voci di menu # define IDM_PIE 1 # define IDM_LINE 2 # define IDM_BAR 3 # define IDM_SOLID 4 # define IDM_DASH 5 # define IDM_DASHDOT 6 # define IDM_DASHDOTDOT 7 / / numero di articoli sui menu grafico e linee # define C_LINES 5 # define C_CHARTS 3 / / Bitmap resource Identifier # define IDB_PIE 1 # define IDB_LINE 2 # define IDB_BAR 3 / / dimensioni di bitmap la riga # define CX_LINEBMP 40 # define CY_LINEBMP 10 
 

Di seguito sono le parti pertinenti della routine di finestra. La routine della finestra esegue la maggior parte della sua inizializzazione chiamando l'applicazione LoadChartBitmaps, CreateLineBitmaps e AddBitmapMenu funzioni definite, descritte pi¨ avanti in questo argomento.

MainWindowProc LRESULT CALLBACK (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {static HBITMAP aHbmLines [C_LINES]; 
    statico HBITMAP aHbmChart [C_CHARTS]; 
    int i; 
 
    interruttore (uMsg) {caso WM_CREATE: / / Call funzioni definite dall'applicazione per caricare il / / bitmap per il menu grafico e quelli per creare / / il menu di linee. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             / / Chiama una funzione definita dall'applicazione per creare / / menu contenenti le voci di menu di bitmap. La funzione / / aggiunge anche un nome di menu alla barra dei menu della finestra. 
 
            AddBitmapMenu (hwnd, / / amp"della barra dei menu proprietario finestra;Grafico", / / testo del menu nome dal menu bar IDM_PIE, / / ID del primo elemento sul men¨ aHbmChart, / / matrice della bitmap gestisce C_CHARTS / / numero di elementi del menu); 
            AddBitmapMenu (hwnd, "& linee", IDM_SOLID, aHbmLines, C_LINES); 
            pausa; 
 
        caso WM_DESTROY: per (i = 0; ho < C_LINES; i + +) DeleteObject(aHbmLines[i]); 
            per (i = 0; i < C_CHARTS; i + +) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            pausa; 
 
        / / Processo ulteriore messaggi qui. 
 
        impostazione predefinita: ritorno (DefWindowProc (hwnd, uMsg, wParam, lParam)); 
    } return 0; 
} 
 

La funzione LoadChartBitmaps definita dall'applicazione carica le risorse bitmap per il menu grafico chiamando il LoadBitmap funzionare, come segue.

VOID WINAPI LoadChartBitmaps(HBITMAP *paHbm) {paHbm [0] = LoadBitmap (g_hinst, MAKEINTRESOURCE(IDB_PIE)); 
    paHbm [1] = LoadBitmap (g_hinst, MAKEINTRESOURCE(IDB_LINE)); 
    paHbm [2] = LoadBitmap (g_hinst, MAKEINTRESOURCE(IDB_BAR)); 
} 
 

La funzione CreateLineBitmaps definita dall'applicazione crea le bitmap per il menu di linee tramite funzioni di disegno GDI. La funzione crea un contesto di periferica di memoria (DC) con le stesse proprietÓ DC della finestra del desktop. Per ogni stile della linea, la funzione crea un oggetto bitmap, seleziona nella memoria DC e richiama in esso.

VOID WINAPI Create&LineBitmaps(HBITMAP *paHbm) {HWND hwndDesktop = GetDesktopWindow(); 
    HDC hdcDesktop = GetDC(hwndDesktop); 
    HDC hdcMem = CreateCompatibleDC(hdcDesktop); 
    COLORREF clrMenu = GetSysColor(COLOR_MENU); 
    HBRUSH hbrOld; 
    HPEN hpenOld; 
    HBITMAP hbmOld; 
    int fnDrawMode; 
    int i; 
 
     / / Creare un pennello utilizzando il colore di sfondo dal menu, / / e selezionarlo nella memoria DC. 
 
    hbrOld = SelectObject (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / Create le bitmap. Selezionare ognuna nella memoria / / DC che Ŕ stato creato e disegnare in esso. 
 
    per (i = 0; ho lt; C_LINES; i + +) {/ / crea la bitmap e selezionarlo nella DC. 
 
        paHbm [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = SelectObject (hdcMem, paHbm[i]); 
 
        / / Riempire lo sfondo con il pennello. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / Crea la penna e selezionarlo nella DC. 
 
        hpenOld = SelectObject (hdcMem, CreatePen (PS_SOLID + i, 1, RGB (0, 0, 0))); 
 
         / / Disegnare la linea. Per preservare il colore di sfondo dove / / la penna Ŕ bianca, utilizzare la modalitÓ di disegno R2_MASKPEN. 
 
        fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN); 
        MoveToEx (hdcMem, 0, CY_LINEBMP/2, NULL); 
        LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (hdcMem, fnDrawMode); 
 
        / / Eliminare la penna e selezionare la vecchia penna e bitmap. 
 
        DeleteObject (SelectObject (hdcMem, hpenOld)); 
        SelectObject (hdcMem, hbmOld); 
    } / / Eliminare il pennello e selezionate il pennello originale. 
 
    DeleteObject (SelectObject (hdcMem, hbrOld)); 
 
    / / Eliminare la memoria DC e rilasciare il desktop DC. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 
 

La funzione AddBitmapMenu definita dall'applicazione crea un menu e aggiunge il numero specificato di voci di menu bitmap ad esso. Poi aggiunge un nome di menu corrispondente alla barra dei menu della finestra specificata.

 VOID WINAPI AddBitmapMenu (HWND hwnd, / / finestra che possedeva il menu bar LPSTR lpszText, / / nome del testo del menu menu bar UINT uID, / / ID del primo menu bitmap voce HBITMAP * paHbm, / / bitmap per il menu articoli int cItems) / / numero di voci di menu bitmap {HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup = CreatePopupMenu(); 
    Mii MENUITEMINFO; 
    int i; 
 
    / / Aggiungere le voci di menu bitmap al menu. 
 
    per (i = 0; ho lt; cItems; i + +) {mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA; 
        Mii.fType = MFT_BITMAP; 
        Mii.wid = uID + i; 
        Mii.dwTypeData = (LPSTR) (paHbm[i]); 
        InsertMenuItem (hmenuPopup, i, TRUE & mii); 
    } / / Aggiungere un nome di menu alla barra dei menu. 
 
    Mii.fMask = MIIM_TYPE | MIIM_DATA | MIIM_SUBMENU; 
    Mii.fType = MFT_STRING; 
    Mii.hSubMenu = hmenuPopup; 
    Mii.dwTypeData = lpszText; 
    InsertMenuItem (hmenuBar, GetMenuItemCount(hmenuBar), TRUE e mii); 
} 
 

Rimedio: Inserire il CD-ROM CD di MSDN Library.

Index