Beispiel für die Verwendung benutzerdefinierter Häkchen-Bitmaps

Das Beispiel in diesem Thema benutzerdefinierte Häkchen Bitmaps zugewiesen Menüelemente in beiden Menüs. Die Menüelemente im ersten Menü Zeichenattribute angeben: Fett, kursiv und unterstrichen. Jedes Menüelement kann entweder aktiviert oder deaktiviert werden. Für diese Menüelemente verwendet das Beispiel Häkchen Bitmaps, die ähneln die checked und unchecked Staaten eines Kontrollkästchen-Steuerelements.

Die Menüelemente im zweiten Menü angeben Absatzeinstellungen Ausrichtung: Links, zentriert und rechts. Nur einer der diese Menüpunkte wird zu einem bestimmten Zeitpunkt überprüft. Für diese Menüelemente verwendet das Beispiel Häkchen Bitmaps, die ähneln die checked und unchecked Staaten ein Optionsfeld-Steuerelement.

Die Fensterprozedur verarbeitet die WM_CREATE -Nachricht durch die Anwendung definierten OnCreate-Funktion aufrufen. OnCreate der vier Häkchen Bitmaps erstellt und dann weist sie ihre entsprechenden Menüelemente mithilfe der SetMenuItemBitmaps -Funktion.

Um jede Bitmap zu erstellen, ruft OnCreate die anwendungsdefinierte Funktion CreateMenuBitmaps einen Zeiger auf ein Bitmap-spezifische Funktion, Zeichnung angeben. CreateMenuBitmaps erstellt eine monochrome Bitmap der erforderlichen Größe, wählt er einen Speicher-Gerätekontext und löscht den Hintergrund. Anschließend ruft es die angegebene Zeichnung Funktion im Vordergrund füllen.

Die vier anwendungsdefinierte Zeichenfunktionen sind DrawCheck, DrawUncheck, DrawRadioCheck und DrawRadioUncheck. Zeichnen sie ein Rechteck mit einem X, ein leeres Rechteck, eine Ellipse mit eine kleineren gefüllte Ellipse und eine leere Ellipse, bzw.

Die Fensterprozedur verarbeitet die Nachricht WM_DESTROY durch Löschen der Häkchen Bitmaps. Ruft jedes Bitmap-Handle mithilfe der GetMenuItemInfo -Funktion und übergibt Sie dann den Ziehpunkt, um die DeleteObject -Funktion.

Wenn der Benutzer ein Menüelement auswählt, wird eine WM_COMMAND -Meldung an das Besitzerfenster gesendet. Für Menüelemente im Menü Charakter Ruft die Fensterprozedur die Anwendung definierten CheckCharacterItem Funktion. Elemente im Menü Absatz fordert die Fensterprozedur die Anwendung definierte CheckParagraphItem-Funktion.

Jedes Element im Menü Zeichenbedienfelds kann checked und unchecked unabhängig sein. CheckCharacterItem wechselt daher einfach Aktivierungszustand des angegebenen Menüelements. Zunächst Ruft die Funktion die GetMenuItemInfo Funktion um das aktuelle Menü Element Zustand. Dann schaltet das Flag MFS_CHECKED Staat und legt den neuen Zustand durch Aufrufen der SetMenuItemInfo -Funktion.

Im Gegensatz zu Zeichenattribute kann nur ein Absatzausrichtung gleichzeitig ausgewählt werden. Daher CheckParagraphItem überprüft das angegebene Menüelement und alle anderen Elemente im Menü das Häkchen entfernt. Hierzu wird die CheckMenuRadioItem -Funktion.

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

 / / Menü-Element-IDs für im Menü Zeichenbedienfelds # define # define # define # define IDM_ITALIC-12 IDM_BOLD-11 IDM_CHARACTER-10 IDM_UNDERLINE 13 / / Menüpunkt Bezeichner für das Menü des Absatzfensters # define # define # define # define IDM_CENTER-22 IDM_LEFT-21 IDM_PARAGRAPH-20 IDM_RIGHT 23 / / Funktionszeiger Typ für Zeichnung Funktionen Typedef VOID (WINAPI * DRAWFUNC) (HDC Hdc, Größe) 

 

Im folgenden werden die relevanten Teile der Anwendungs Fensterprozedur und verwandte Funktionen.

LRESULT CALLBACK MainWindowProc( 
        HWND hwnd, 
        UINT uMsg, 
        WPARAM wParam, 
        LPARAM lParam 
        ) 
{ 
    switch (uMsg) 
    { 
        case WM_CREATE: 
            if (!OnCreate(hwnd)) 
                return -1; 
            break; 
 
        case WM_DESTROY: 
            OnDestroy(hwnd); 
            PostQuitMessage(0); 
            break; 
 
        case WM_COMMAND: 
            switch (LOWORD(wParam)) 
            { 
                case IDM_BOLD: 
                case IDM_ITALIC: 
                case IDM_UNDERLINE: 
                    CheckCharacterItem(hwnd, LOWORD(wParam)); 
                    break; 
 
                case IDM_LEFT: 
                case IDM_CENTER: 
                case IDM_RIGHT: 
                    CheckParagraphItem(hwnd, LOWORD(wParam)); 
                    break; 
 
                // Process other commands here. 
 
            } 
            break; 
 
        // Process other messages here. 
 
        default: 
            return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 
    return 0; 
} 
 
VOID WINAPI CheckCharacterItem(HWND hwnd, UINT uID) 
{ 
    HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup; 
    MENUITEMINFO mii; 
 
    // Get the handle to the Character menu. 
 
    mii.fMask = MIIM_SUBMENU;  // information to get 
    GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii); 
    hmenuPopup = mii.hSubMenu; 
 
    // Get the state of the specified menu item. 
 
    mii.fMask = MIIM_STATE;    // information to get 
    GetMenuItemInfo(hmenuPopup, uID, FALSE, &mii); 
 
    // Toggle the checked state. 
 
    mii.fState ^= MFS_CHECKED; 
    SetMenuItemInfo(hmenuPopup, uID, FALSE, &mii); 
} 
 
VOID WINAPI CheckParagraphItem(HWND hwnd, UINT uID) 
{ 
    HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup; 
    MENUITEMINFO mii; 
 
    // Get the handle to the Paragraph menu. 
 
    mii.fMask = MIIM_SUBMENU;  // information to get 
    GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, FALSE, &mii); 
    hmenuPopup = mii.hSubMenu; 
 
    // Check the specified item and uncheck all the others. 
 
    CheckMenuRadioItem( 
            hmenuPopup,         // handle to menu 
            IDM_LEFT,           // first item in range 
            IDM_RIGHT,          // last item in range 
            uID,                // item to check 
            MF_BYCOMMAND        // IDs, not positions 
            ); 
} 
 
BOOL WINAPI OnCreate(HWND hwnd) 
{ 
    HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup; 
    MENUITEMINFO mii; 
    UINT uID; 
    HBITMAP hbmChecked; 
    HBITMAP hbmUnchecked; 
 
    // Get the handle to the Character menu. 
 
    mii.fMask = MIIM_SUBMENU;     // information to get 
    GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii); 
    hmenuPopup = mii.hSubMenu; 
 
    // Create the checked and unchecked bitmaps. 
 
    hbmChecked = CreateMenuBitmap(DrawCheck); 
    hbmUnchecked = CreateMenuBitmap(DrawUncheck); 
 
    // Set the checkmark bitmaps for each menu item. 
 
    for (uID = IDM_BOLD; uID <= IDM_UNDERLINE; uID++) 
    { 
        SetMenuItemBitmaps(hmenuPopup, uID, MF_BYCOMMAND, 
                hbmUnchecked, hbmChecked); 
    } 
 
    // Get the handle to the Paragraph pop-up menu. 
 
    mii.fMask = MIIM_SUBMENU;     // information to get 
    GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, FALSE, &mii); 
    hmenuPopup = mii.hSubMenu; 
 
    // Create the checked and unchecked bitmaps. 
 
    hbmChecked = CreateMenuBitmap(DrawRadioCheck); 
    hbmUnchecked = CreateMenuBitmap(DrawRadioUncheck); 
 
    // Set the checkmark bitmaps for each menu item. 
 
    for (uID = IDM_LEFT; uID <= IDM_RIGHT; uID++) 
    { 
        SetMenuItemBitmaps(hmenuPopup, uID, MF_BYCOMMAND, 
                hbmUnchecked, hbmChecked); 
    } 
 
    // Initially check the IDM_LEFT paragraph item. 
 
    CheckMenuRadioItem(hmenuPopup, IDM_LEFT, IDM_RIGHT, 
            IDM_LEFT, MF_BYCOMMAND); 
    return TRUE; 
} 
 
HBITMAP WINAPI CreateMenuBitmap(DRAWFUNC lpfnDraw) 
{ 
    // Create a DC compatible with the desktop window's DC. 
 
    HWND hwndDesktop = GetDesktopWindow(); 
    HDC hdcDesktop = GetDC(hwndDesktop); 
    HDC hdcMem = CreateCompatibleDC(hdcDesktop); 
 
    // Determine the required bitmap size. 
 
    SIZE size = { GetSystemMetrics(SM_CXMENUCHECK), 
                  GetSystemMetrics(SM_CYMENUCHECK) }; 
 
    // Create a monochrome bitmap and select it. 
 
    HBITMAP hbm = CreateBitmap(size.cx, size.cy, 1, 1, NULL); 
    HBITMAP hbmOld = SelectObject(hdcMem, hbm); 
 
    // Erase the background and call the drawing function. 
 
    PatBlt(hdcMem, 0, 0, size.cx, size.cy, WHITENESS); 
    (*lpfnDraw)(hdcMem, size); 
 
    // Clean up. 
 
    SelectObject(hdcMem, hbmOld); 
    DeleteDC(hdcMem); 
    ReleaseDC(hwndDesktop, hdcDesktop); 
    return hbm; 
} 
 
VOID WINAPI DrawCheck(HDC hdc, SIZE size) 
{ 
    HBRUSH hbrOld; 
    hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); 
    Rectangle(hdc, 0, 0, size.cx, size.cy); 
    MoveToEx(hdc, 0, 0, NULL); 
    LineTo(hdc, size.cx, size.cy); 
    MoveToEx(hdc, 0, size.cy - 1, NULL); 
    LineTo(hdc, size.cx - 1, 0); 
    SelectObject(hdc, hbrOld); 
} 
 
VOID WINAPI DrawUncheck(HDC hdc, SIZE size) 
{ 
    HBRUSH hbrOld; 
    hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); 
    Rectangle(hdc, 0, 0, size.cx, size.cy); 
    SelectObject(hdc, hbrOld); 
} 
 
VOID WINAPI DrawRadioCheck(HDC hdc, SIZE size) 
{ 
    HBRUSH hbrOld; 
    hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); 
    Ellipse(hdc, 0, 0, size.cx, size.cy); 
    SelectObject(hdc, GetStockObject(BLACK_BRUSH)); 
    Ellipse(hdc, 2, 2, size.cx - 2, size.cy - 2); 
    SelectObject(hdc, hbrOld); 
} 
 
VOID WINAPI DrawRadioUncheck(HDC hdc, SIZE size) 
{ 
    HBRUSH hbrOld; 
    hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); 
    Ellipse(hdc, 0, 0, size.cx, size.cy); 
    SelectObject(hdc, hbrOld); 
} 
 
VOID WINAPI OnDestroy(HWND hwnd) 
{ 
    HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup; 
    MENUITEMINFO mii; 
 
    // Get the handle to the Character menu. 
 
    mii.fMask = MIIM_SUBMENU;     // information to get 
    GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii); 
    hmenuPopup = mii.hSubMenu; 
 
    // Get the check-mark bitmaps and delete them. 
 
    mii.fMask = MIIM_CHECKMARKS; 
    GetMenuItemInfo(hmenuPopup, IDM_BOLD, FALSE, &mii); 
    DeleteObject(mii.hbmpChecked); 
    DeleteObject(mii.hbmpUnchecked); 
 
    // Get the handle to the Paragraph menu. 
 
    mii.fMask = MIIM_SUBMENU;     // information to get 
    GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, FALSE, &mii); 
    hmenuPopup = mii.hSubMenu; 
 
    // Get the check-mark bitmaps and delete them. 
 
    mii.fMask = MIIM_CHECKMARKS; 
    GetMenuItemInfo(hmenuPopup, IDM_LEFT, FALSE, &mii); 
    DeleteObject(mii.hbmpChecked); 
    DeleteObject(mii.hbmpUnchecked); 
} 
 

Index