דוגמה לשימוש מפות סיביות של סימון מותאם אישית

הדוגמה בנושא זה מקצה מפות סיביות מותאמות אישית של סימן הביקורת פריטי התפריט שני תפריטים. פריטי התפריט בתפריט הראשון לציין תכונות תו: מודגש, נטוי וקו תחתון. כל פריט תפריט יכול להיות מסומן או לא מסומן. עבור פריטי תפריט אלה, הדוגמה עושה שימוש במפות סיביות של סימן הביקורת המזכירים את מצבי שסומנו והן לא מסומן של פקד תיבת סימון.

פריטי התפריט בתפריט השני לציין הגדרות יישור פיסקה:, למרכז, לימין ולשמאל. היחיד של פריטי תפריט אלה נבדקת בכל זמן נתון. עבור פריטי תפריט אלה, הדוגמה עושה שימוש במפות סיביות של סימן הביקורת המזכירים את מצבי שסומנו והן לא מסומן של פקד לחצן רדיו.

ההליך חלון מעבד את הודעת WM_CREATE על-ידי קריאה המוגדרת OnCreate שנוצרו על-ידי היישום. OnCreate יוצרת ארבע מפות סיביות של סימן הביקורת ולאחר מכן מקצה להם לפריטי התפריט המתאים שלהם באמצעות הפונקציה SetMenuItemBitmaps.

כדי ליצור כל מפת סיביות, OnCreate קוראת לפונקציה CreateMenuBitmaps מוגדר על-ידי יישום, ציון מצביע לפונקציה ציור ספציפיים מפת סיביות. CreateMenuBitmaps יוצר bitmap בשחור-לבן של הגודל הנדרש, שחושף אותה לתוך בהקשר התקן זיכרון, תמחק את הרקע. לאחר מכן הוא קורא לפונקציה הציור שצוין כדי למלא בקידמה.

ארבע המוגדר על-ידי היישום הציור פונקציות הן DrawCheck, DrawUncheck, DrawRadioCheck, DrawRadioUncheck. הם צייר מלבן עם סימן X, מלבן ריק, אליפסה ממולאת קטן המכיל אליפסה ריקה, בהתאמה.

ההליך חלון מעבד את הודעת WM_DESTROY על-ידי מחיקת מפות סיביות של סימן ביקורת. זה מאחזר את כל נקודת אחיזה של מפת סיביות על-ידי שימוש בפונקציה GetMenuItemInfo ולאחר מכן מעבירה את נקודת האחיזה DeleteObject פונקציה.

כאשר המשתמש בוחר פריט בתפריט, נשלחת הודעה WM_COMMAND אל חלון הבעלים. עבור פריטי התפריט בתפריט תו, קריאות שגרה חלון המוגדרת CheckCharacterItem שנוצרו על-ידי היישום. פריטים בתפריט פיסקה, קריאות שגרה חלון הפונקציה המוגדרת על-ידי יישום CheckParagraphItem.

כל פריט בתפריט תו יכול להיות שסומנו והן באופן עצמאי לא מסומן. לכן, CheckCharacterItem עובר פשוט מצב הסימון של פריט התפריט שצוין. ראשית, הפונקציה קוראת את הפונקציה GetMenuItemInfo כדי לקבל את התפריט הנוכחי המדינה פריט. לאחר מכן הוא עובר את דגל המדינה MFS_CHECKED ומגדיר המדינה החדשה על-ידי קריאה לפונקציה SetMenuItemInfo.

שלא כמו תכונות אופי, ניתן לבחור יישור פיסקה אחת בלבד בכל פעם. לכן, CheckParagraphItem בודק את פריט התפריט שצוין, מסירה את סימן הביקורת של כל שאר הפריטים בתפריט. כדי לעשות זאת, היא קוראת לפונקציה CheckMenuRadioItem.

להלן החלקים הרלוונטיים של קובץ הכותרת של היישום.

 / / מזהים פריט תפריט בתפריט ' תו ' # הגדרת 10 IDM_CHARACTER # הגדרת IDM_BOLD 11 # הגדרת IDM_ITALIC 12 # הגדרת IDM_UNDERLINE 13 / / מזהים פריט תפריט מתפריט ' פסקה ' # הגדרת 20 IDM_PARAGRAPH # הגדרת IDM_LEFT 21 # הגדרת 22 IDM_CENTER # הגדרת IDM_RIGHT 23 / / סוג מצביע פונקציה עבור ציור פונקציות typedef VOID (WINAPI * DRAWFUNC) (HDC hdc, גודל גודל) 

 

להלן החלקים הרלוונטיים של חלון הליך ופונקציות קרובים של היישום.

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