Voorbeeld van het Menu-item Bitmaps

In het voorbeeld in dit onderwerp maakt twee menu's, elk met verschillende bitmap menu-items. De toepassing wordt voor elk menu, een overeenkomstige menunaam toegevoegd aan de menubalk van het belangrijkste venster.

Het eerste menu bevat menu-items weergegeven: elk van de drie grafiektypen: cirkel-, lijn en bar. De bitmaps voor deze menu-items zijn gedefinieerd als middelen en zijn geladen met behulp van de LoadBitmap functie. Dit menu is gekoppeld, is een "Grafiek" menunaam op de menubalk.

Het tweede menu bevat menu-items weergegeven: elk van de vijf lijnstijlen gebruikt met de CreatePen functie: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, en PS_DASHDOTDOT. De toepassing maakt de bitmaps voor deze menu-items tijdens runtime met behulp van GDI tekening functies. Dit menu is gekoppeld, is een "Lines" menunaam op de menubalk.

Gedefinieerd in het venster van de aanvraagprocedure zijn twee statische matrices van bitmap grepen. De handgrepen van de drie bitmaps gebruikt voor het menu grafiek bevat een array. Anderzijds bevat de handgrepen van de vijf bitmaps gebruikt voor de lijnen menu. Bij de verwerking van het WM_CREATE bericht, de venster procedure ladingen van de grafiek bitmaps, creëert de lijn bitmaps, en vervolgens de bijbehorende menu items toegevoegd. Bij de verwerking van het WM_DESTROY bericht, verwijdert de venster-procedure alle van de bitmaps.

Hier volgen de relevante gedeelten van de toepassing van de headerbestand.

/ / Menu-item-id's # 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 / / nummer van items in het menu grafiek en lijnen's # define C_LINES 5 # define C_CHARTS 3 / / Bitmap resource-id # define IDB_PIE 1 # define IDB_LINE 2 # define IDB_BAR 3 / / afmetingen van de lijn bitmaps # define CX_LINEBMP 40 # define CY_LINEBMP 10 
 

Hier volgen de relevante gedeelten van de procedure venster. Het venster procedure voert het merendeel van de initialisatie door de toepassing gedefinieerde LoadChartBitmaps, CreateLineBitmaps en AddBitmapMenu functies aanroepen, die verderop in dit onderwerp beschreven.

CALLBACK LRESULT MainWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {statische HBITMAP aHbmLines [C_LINES]; 
    statische HBITMAP aHbmChart [C_CHARTS]; 
    int i; 
 
    schakelaar (uMsg) {geval WM_CREATE: / / Call toepassing gedefinieerde functies voor het laden van de / / bitmaps voor het menu grafiek en maken die voor / / het menu lijnen. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             / / Een toepassing gedefinieerde functie aanroepen om te maken / / menu's met de bitmap menu items. De functie / / voegt ook een menunaam op de menubalk van het venster. 
 
            AddBitmapMenu (hwnd, / / van de menubar eigenaar venster "amp;Chart', / / tekst van menu naam menu bar IDM_PIE, / / ID van het eerste item op het menu aHbmChart, / / matrix van bitmap behandelt C_CHARTS / / het aantal items in menu); 
            AddBitmapMenu (hwnd, "& regels", IDM_SOLID, aHbmLines, C_LINES); 
            breken; 
 
        Case WM_DESTROY: voor (i = 0; ik < C_LINES; i ++) DeleteObject(aHbmLines[i]); 
            voor (i = 0; ik < C_CHARTS; i ++) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            breken; 
 
        / / Proces extra berichten hier. 
 
        standaard: keren (DefWindowProc (hwnd, uMsg, wParam, lParam)); 
    } retourneren 0; 
} 
 

De functie LoadChartBitmaps toepassing gedefinieerde ladingen de bitmap middelen voor het menu grafiek door te bellen naar de LoadBitmap werken, als volgt.

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)); 
} 
 

De toepassing gedefinieerde CreateLineBitmaps functie maakt de bitmaps voor het menu lijnen door GDI tekening functies te gebruiken. De functie maakt een geheugen apparaatcontext (DC) met dezelfde eigenschappen als het bureaubladvenster de DC. Voor elke lijnstijl van de, de functie maakt een bitmap, geselecteerd in de Apparaatcontext voor geheugen, en vestigt in het.

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; 
 
     / / Maak een borstel met het menu achtergrondkleur, / / en deze te selecteren in de Apparaatcontext voor geheugen. 
 
    hbrOld = SelectObject (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / De bitmaps maken. Selecteer elke één in het geheugen / / DC die is gemaakt en in het tekenen. 
 
    voor (i = 0; ik lt; C_LINES; i ++) {/ / de bitmap maken en selecteer het in de DC. 
 
        paHbm [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = SelectObject (hdcMem, paHbm[i]); 
 
        / / Vul de achtergrond met behulp van het penseel. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / Maak de pen en selecteer het in de DC. 
 
        hpenOld = SelectObject (hdcMem), CreatePen (PS_SOLID + i, 1, RGB (0, 0, 0)); 
 
         / / De lijn trekken. Om de achtergrondkleur te behouden waar / / de pen is wit, de tekenmodus R2_MASKPEN gebruikt. 
 
        fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN); 
        MoveToEx (hdcMem, 0, CY_LINEBMP/2, NULL); 
        LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (hdcMem, fnDrawMode); 
 
        / / Verwijderen van de pen, en selecteer de oude pen en bitmap. 
 
        ObjectVerwijderen (SelectObject (hdcMem, hpenOld)); 
        SelectObject (hdcMem, hbmOld); 
    } / / Het penseel verwijderen en selecteer het oorspronkelijke penseel. 
 
    ObjectVerwijderen (SelectObject (hdcMem, hbrOld)); 
 
    / / Verwijderen de Apparaatcontext voor geheugen en laat de desktop DC. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 
 

De AddBitmapMenu toepassing gedefinieerde functie een menu wordt gemaakt en voegt u het opgegeven aantal bitmap menu-items aan het. Vervolgens het naam het bijbehorende menu toegevoegd aan het opgegeven venster de menubalk.

 VOID WINAPI AddBitmapMenu (HWND hwnd, / / venster eigendom die de menu bar LPSTR lpszText, / / tekst van het menu op de menubalk UINT uID, naam / / ID van het eerste bitmap menu punt HBITMAP * paHbm, / / bitmaps voor de menu items int cItems) / / aantal bitmap menu-items {HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup = CreatePopupMenu(); 
    MENUITEMINFO de mii; 
    int i; 
 
    / / De bitmap menu items toevoegen aan het menu. 
 
    voor (i = 0; ik 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); 
    } / / Een menunaam toevoegen aan de menubalk. 
 
    Mii.fMask = MIIM_TYPE | MIIM_DATA | MIIM_SUBMENU; 
    Mii.fType = MFT_STRING; 
    Mii.hSubMenu = hmenuPopup; 
    Mii.dwTypeData = lpszText; 
    InsertMenuItem (hmenuBar, GetMenuItemCount(hmenuBar), TRUE, & mii); 
} 
 

Index