Beispiel des Menüelement Bitmaps

Das Beispiel in diesem Thema erstellt zwei Menüs, jeweils mehrere Bitmap-Menüelemente. Für jedes Menü fügt die Anwendung einen entsprechenden Menünamen im auf der Menüleiste des Hauptfensters.

Das erste Menü enthält Menüelemente zeigt alle drei Diagrammtypen: Kreis-, Linien- und Bar. Die Bitmaps für diese Menüelemente werden als Ressourcen definiert und werden geladen, indem Sie die LoadBitmap Funktion. Dieses Menü zugeordnet ist, ein Namen im Menü "Diagramm" in der Menüleiste.

Das zweite Menü enthält Menüelemente anzeigen jedes der fünf Linienarten mit verwendet die CreatePen Funktion: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, und PS_DASHDOTDOT. Die Anwendung erstellt die Bitmaps für diese Menüelemente zur Laufzeit mit GDI-Zeichenfunktionen. Ein Namen im Menü "Lines" auf der Menüleiste ist dieses Menü zugeordnet.

Definiert in der Anwendung Fensterprozedur sind zwei statische Arrays der Bitmap Handles. Ein Array enthält die Griffe von den drei Bitmaps für das Menü Diagramm verwendet. Die andere enthält die Griffe von den fünf Bitmaps verwendet für das Linien-Menü. Bei der Verarbeitung der Nachricht WM_CREATE die Fensterprozedur lädt die Diagramm-Bitmaps, die Linie Bitmaps erstellt, und fügt dann die entsprechenden Menüpunkte. Bei der Verarbeitung der WM_DESTROY -Nachricht löscht die Fensterprozedur, die alle die bitmaps.

Im folgenden werden die relevanten Teile der Header-Datei der Anwendung.

/ / Menü-Element-IDs # define # define # define # define # define # define # define IDM_DASHDOT-6 IDM_DASH-5 IDM_SOLID-4 IDM_BAR-3 IDM_LINE-2 IDM_PIE-1 IDM_DASHDOTDOT 7 / / Anzahl der Elemente auf das Diagramm und Linien Menüs # define C_LINES 5 # define C_CHARTS 3 / / Bitmap-Resource identifier # define # define # define IDB_LINE-2 IDB_PIE-1 IDB_BAR 3 / / Abmessungen von Bitmaps die Zeile # define CX_LINEBMP 40 # define CY_LINEBMP 10 

 

Im folgenden werden die relevanten Teile der Fensterprozedur. Die Fensterprozedur führt die meisten seiner Initialisierung durch Aufruf der Anwendung definierten LoadChartBitmaps, CreateLineBitmaps und AddBitmapMenu, später in diesem Thema beschriebenen.

LRESULT CALLBACK MainWindowProc (HWND Hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {statischen HBITMAP aHbmLines [C_LINES]; 
    statische HBITMAP aHbmChart [C_CHARTS]; 
    Int I; 
 
    Switch (uMsg) {case WM_CREATE: / / Anwendung definierte Funktionen aufrufen, um zu laden der / / Bitmaps für das Menü Diagramm und erstellen für / / Menü Linien. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             / / Call eine anwendungsdefinierte Funktion erstellen / / Menüs, die die Bitmap im Menüelemente enthält. Die Funktion / / die Fenster-Menüleiste auch einen Menünamen hinzugefügt. 
 
            AddBitmapMenu (Hwnd, / / Menu Bar Besitzer Fenster "Amp;Chart", / / Text des Menüs name im Menü bar IDM_PIE, / / ID des ersten Elements auf Menü aHbmChart, / / Array der Bitmap handles C_CHARTS / / Anzahl der Elemente im Menü); 
            AddBitmapMenu (Hwnd, "& Lines", IDM_SOLID, aHbmLines, C_LINES); 
            brechen; 
 
        Case WM_DESTROY: für (i = 0; i < C_LINES; i++) DeleteObject(aHbmLines[i]); 
            für (i = 0; i < C_CHARTS; i++) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            brechen; 
 
        / / Prozess zusätzliche Nachrichten hier. 
 
        Standard: Rückkehr (DefWindowProc (Hwnd, uMsg, wParam, lParam)); 
    } return 0; 
} 

 

Die Anwendung benutzerdefinierte LoadChartBitmaps-Funktion lädt die Bitmapressourcen für das Kartenmenü durch Aufrufen der LoadBitmap Funktion wie folgt.

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

 

Die Anwendung benutzerdefinierte CreateLineBitmaps-Funktion erstellt die Bitmaps für das Linien-Menü mithilfe von GDI-Zeichenfunktionen. Die Funktion erstellt einen Speicher-Gerätekontext (DC) mit den gleichen Eigenschaften wie das desktop-Fenster DC. Für jeden Stil die Funktion erstellt eine Bitmap, wählt es im Speicher DC und zeichnet darin.

VOID WINAPI Create&LineBitmaps(HBITMAP *paHbm) {HWND HwndDesktop = GetDesktopWindow(); 
    HDC-HdcDesktop = GetDC(hwndDesktop); 
    HDC Speichergerätekontext = CreateCompatibleDC(hdcDesktop); 
    COLORREF ClrMenu = GetSysColor(COLOR_MENU); 
    HBRUSH HbrOld; 
    HPEN HpenOld; 
    HBITMAP HbmOld; 
    Int FnDrawMode; 
    Int I; 
 
     / / Erstellen eines Pinsels mit der Hintergrundfarbe Menü / /, und wählen Sie es im Speicher DC. 
 
    HbrOld = SelectObject (Speichergerätekontext, CreateSolidBrush(clrMenu)); 
 
     / / Die Bitmaps erstellen. Wählen Sie jeweils in den Speicher / / DC, die geschaffen wurde, und es ziehen. 
 
    für (i = 0; ich Lt; C_LINES; i++) {/ / erstellen die Bitmap, und wählen Sie es in der DC. 
 
        PaHbm [i] = CreateCompatibleBitmap (HdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        HbmOld = SelectObject (Speichergerätekontext, paHbm[i]); 
 
        / / Füllen den Hintergrund mit dem Pinsel. 
 
        PatBlt (Speichergerätekontext, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / Erstellen den Stift und wählen Sie es in der DC. 
 
        HpenOld = SelectObject (Speichergerätekontext, CreatePen (PS_SOLID + i, 1, RGB (0, 0, 0))); 
 
         / / Draw the Line. Um die Hintergrundfarbe zu bewahren wo / / der Stift ist weiß, verwenden Sie den R2_MASKPEN-Zeichenmodus. 
 
        FnDrawMode = SetROP2 (Speichergerätekontext, R2_MASKPEN); 
        MoveToEx (Speichergerätekontext, 0, CY_LINEBMP/2, NULL); 
        LineTo (Speichergerätekontext, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (Speichergerätekontext, FnDrawMode); 
 
        / / Löschen den Stift, und wählen Sie die alte Feder und Bitmap. 
 
        DeleteObject (SelectObject Speichergerätekontext (HpenOld)); 
        AuswählenObjekt (Speichergerätekontext, HbmOld); 
    } / / Den Pinsel löschen und wählen Sie den ursprünglichen Pinsel. 
 
    DeleteObject (SelectObject Speichergerätekontext (HbrOld)); 
 
    / / Löschen den Speicher DC und lassen Sie den desktop DC. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (HwndDesktop, HdcDesktop); 
} 

 

Die Anwendung benutzerdefinierte AddBitmapMenu-Funktion erstellt ein Menü und die angegebene Anzahl von Bitmap-Menüelemente hinzugefügt. Dann fügt es einen entsprechenden Menünamen im das angegebene Fenster-Menüleiste.

 VOID WINAPI AddBitmapMenu (HWND Hwnd, / / Fenster, die im Besitz der Menüleiste LPSTR LpszText, / / Text des Menüs auf der Menüleiste UINT uID, name / / ID der ersten Bitmap Menü item HBITMAP * PaHbm, / / Bitmaps für das Menü Elemente Int cItems) / / Anzahl Bitmap Menüelemente {HMENU HmenuBar = GetMenu(hwnd); 
    HMENU HmenuPopup = CreatePopupMenu(); 
    MENUITEMINFO Mii; 
    Int I; 
 
    / / Bitmap Menüelemente zum Menü hinzufügen. 
 
    für (i = 0; ich 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); 
    } / / Hinzufügen einen Menünamen im auf der Menüleiste. 
 
    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