กล่องกาเครื่องหมายในเมนูการจำลอง

หัวข้อนี้ประกอบด้วยตัวอย่างที่แสดงวิธีการจำลองกล่องกาเครื่องหมายในเมนู ตัวอย่างประกอบด้วยอักขระเมนูรายการอนุญาตให้ผู้ใช้สามารถตั้งค่าตัวหนา ตัวเอียง และคุณลักษณะของแบบอักษรปัจจุบันที่ขีดเส้นใต้ เมื่อคุณลักษณะของแบบอักษรมีผลบังคับ จะแสดงเครื่องหมายถูกในกล่องกาเครื่องหมายถัดจากรายการเมนูสอดคล้องกัน มิฉะนั้น กล่องกาเครื่องหมายว่างเปล่าจะแสดงถัดจากรายการ.

ตัวอย่างแทนบิตแมปเครื่องเริ่มต้นกับบิตแมปที่สอง: บิตแมปกับกล่องตรวจสอบและบิตแมปกับช่องว่าง บิตแมปที่กล่องกาเครื่องหมายตรวจสอบจะแสดงถัดจากรายการเมนูตัวหนา ตัวเอียง หรือขีดเส้นใต้เมื่อแอตทริบิวต์การกาเครื่องหมายของรายการถูกตั้งค่าเป็น MF_CHECKED บิตแมปที่ไม่ได้ตรวจสอบ หรือเปล่ากล่องกาเครื่องหมายจะปรากฏขึ้นเมื่อแอตทริบิวต์เครื่องถูกตั้งค่าเป็น MF_UNCHECKED.

ระบบแสดงเป็นบิตแมปที่กำหนดไว้ล่วงหน้าซึ่งประกอบด้วยรูปภาพที่ใช้สำหรับกล่องกาเครื่องหมายและปุ่มตัวเลือก ตัวอย่างแยกกล่องกาเครื่องหมายตรวจสอบ และว่างเปล่า คัดลอกรายการนั้นไปยังบิตแมปที่แยกต่างหากสอง จากนั้น ใช้เหล่านั้นเป็นบิตแมปไม่ได้ตรวจสอบ และการตรวจสอบสำหรับรายการในเมนูอักขระ.

ในการเรียกหมายเลขอ้างอิงกับบิตแมปที่กล่องกาเครื่องหมายที่กำหนดโดยระบบ เรียกตัวอย่าง LoadBitmapฟังก์ชัน การระบุค่า NULL เป็นพารามิเตอร์ของhInstanceและ OBM_CHECKBOXES เป็นพารามิเตอร์lpBitmapName เนื่องจากรูปในบิตแมปมีขนาดเท่ากันทั้งหมด ตัวอย่างสามารถแยกเหล่านั้น โดยแบ่งความกว้างและความสูงของบิตแมปโดยจำนวนของรูปที่อยู่ในแถวและคอลัมน์.

ส่วนของแฟ้มคำจำกัดความทรัพยากรต่อไปนี้แสดงวิธีกำหนดรายการในเมนูในเมนูอักขระ โปรดทราบว่า ไม่มีแอตทริบิวต์แบบอักษรมีผลเริ่ม เพื่อให้แอตทริบิวต์การกาเครื่องหมายสำหรับสินค้าทั่วไปมีการตั้งค่าการตรวจสอบ และ ตามค่าเริ่มต้น แอตทริบิวต์ของเครื่องหมายสินค้าคงเหลือถูกตั้งค่าเป็นไม่ได้ตรวจสอบ.

#รวม "men3.h" MainMenu เมนูเริ่มผุด "แอมป์อักขระ"เริ่ม MENUITEM "& ปกติ" IDM_REGULAR ตรวจสอบ MENUITEM คั่น MENUITEM "& ตัวหนา" IDM_BOLD MENUITEM "& ตัวเอียง" IDM_ITALIC MENUITEM "และขีดเส้นใต้" IDM_ULINE สิ้นสุดท้าย 

 

นี่คือเนื้อหาที่เกี่ยวข้องของแฟ้มส่วนหัวของโปรแกรมประยุกต์.

/ / ตัวระบุรายการเมนู#กำหนด IDM_REGULAR 0x1 #กำหนด IDM_BOLD 0x2 #กำหนด IDM_ITALIC 0x4 #กำหนด IDM_ULINE 0x8 / / การตรวจสอบสถานะเครื่องหมายกำหนด#1 #กำหนดยกเลิกตรวจสอบ 2 / / อักษรแอตทริบิวต์ข้อมูล#กำหนด ATTRIBMASK 0xe / / ฟังก์ชันแบบตัว LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM) 
HBITMAP GetMyCheckBitmaps(UINT) 
CheckOrUncheckMenuItem ไบต์ (BYTE, HMENU) 

 

ตัวอย่างต่อไปนี้แสดงส่วนของหน้าต่างกระบวนงานที่สร้างบิตแมปเครื่องหมาย การตั้งค่าแอตทริบิวต์ของเครื่องหมายของรายการเมนูตัวหนา ตัวเอียง และขีดเส้นใต้ และทำลายเครื่องบิตแมป.

LRESULT APIENTRY MainWndProc(HWND hwndMain, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
 
    static HBITMAP hbmpCheck;   // handle to checked bitmap    
    static HBITMAP hbmpUncheck; // handle to unchecked bitmap  
    static HMENU hmenu;         // handle to main menu         
    BYTE fbFontAttrib;          // font-attribute flags        
 
    switch (uMsg) 
    { 
        case WM_CREATE: 
 
            // Call the application-defined GetMyCheckBitmaps 
            // function to get the predefined checked and 
            // unchecked check box bitmaps. 
 
            hbmpCheck = GetMyCheckBitmaps(CHECK); 
            hbmpUncheck = GetMyCheckBitmaps(UNCHECK); 
 
            // Set the checked and unchecked bitmaps for the menu 
            // items. 
 
            hmenu = GetMenu(hwndMain); 
            SetMenuItemBitmaps(hmenu, IDM_BOLD, MF_BYCOMMAND, 
                hbmpUncheck, hbmpCheck); 
            SetMenuItemBitmaps(hmenu, IDM_ITALIC, MF_BYCOMMAND, 
                hbmpUncheck, hbmpCheck); 
            SetMenuItemBitmaps(hmenu, IDM_ULINE, MF_BYCOMMAND, 
                hbmpUncheck, hbmpCheck); 
 
            return 0; 
 
        case WM_COMMAND: 
            switch (LOWORD(wParam)) 
            { 
                // Process the menu commands.  
 
                case IDM_REGULAR: 
                case IDM_BOLD: 
                case IDM_ITALIC: 
                case IDM_ULINE: 
 
                    // CheckOrUncheckMenuItem is an application- 
                    // defined function that sets the menu item 
                    // check marks and returns the user-selected 
                    // font attributes. 
 
                    fbFontAttrib = CheckOrUncheckMenuItem( 
                        (BYTE) LOWORD(wParam), hmenu); 
 
                    // Set the font attributes.  
 
                    return 0; 
 
                // Process other command messages.  
 
                default: 
                    break; 
            } 
 
            break; 
 
        // Process other window messages.  
 
        case WM_DESTROY: 
 
            // Destroy the checked and unchecked bitmaps.  
 
            DeleteObject(hbmpCheck); 
            DeleteObject(hbmpUncheck); 
 
            PostQuitMessage(0); 
            break; 
 
        default: 
            return DefWindowProc(hwndMain, uMsg, wParam, lParam); 
    } 
    return NULL; 
} 
 
HBITMAP GetMyCheckBitmaps(UINT fuCheck) 
{ 
    COLORREF crBackground;  // background color                  
    HBRUSH hbrBackground;   // background brush                  
    HBRUSH hbrTargetOld;    // original background brush         
    HDC hdcSource;          // source device context             
    HDC hdcTarget;          // target device context             
    HBITMAP hbmpCheckboxes; // handle to check-box bitmap        
    BITMAP bmCheckbox;      // structure for bitmap data         
    HBITMAP hbmpSourceOld;  // handle to original source bitmap  
    HBITMAP hbmpTargetOld;  // handle to original target bitmap  
    HBITMAP hbmpCheck;      // handle to check-mark bitmap       
    RECT rc;                // rectangle for check-box bitmap    
    WORD wBitmapX;          // width of check-mark bitmap        
    WORD wBitmapY;          // height of check-mark bitmap       
 
    // Get the menu background color and create a solid brush 
    // with that color. 
 
    crBackground = GetSysColor(COLOR_MENU); 
    hbrBackground = CreateSolidBrush(crBackground); 
 
    // Create memory device contexts for the source and 
    // destination bitmaps. 
 
    hdcSource = CreateCompatibleDC((HDC) NULL); 
    hdcTarget = CreateCompatibleDC(hdcSource); 
 
    // Get the size of the the system default check-mark bitmap and 
    // create a compatible bitmap of the same size. 
 
    wBitmapX = GetSystemMetrics(SM_CXMENUCHECK); 
    wBitmapY = GetSystemMetrics(SM_CYMENUCHECK); 
 
    hbmpCheck = CreateCompatibleBitmap(hdcSource, wBitmapX, 
        wBitmapY); 
 
    // Select the background brush and bitmap into the target DC. 
 
    hbrTargetOld = SelectObject(hdcTarget, hbrBackground); 
    hbmpTargetOld = SelectObject(hdcTarget, hbmpCheck); 
 
    // Use the selected brush to initialize the background color 
    // of the bitmap in the target device context. 
 
    PatBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY, PATCOPY); 
 
    // Load the predefined check box bitmaps and select it 
    // into the source DC. 
 
    hbmpCheckboxes = LoadBitmap((HINSTANCE) NULL, 
        (LPTSTR) OBM_CHECKBOXES); 
 
    hbmpSourceOld = SelectObject(hdcSource, hbmpCheckboxes); 
 
    // Fill a BITMAP structure with information about the 
    // check box bitmaps, and then find the upper-left corner of 
    // the unchecked check box or the checked check box. 
 
    GetObject(hbmpCheckboxes, sizeof(BITMAP), &bmCheckbox); 
 
    if (fuCheck == UNCHECK) 
    { 
        rc.left = 0; 
        rc.right = (bmCheckbox.bmWidth / 4); 
    } 
    else 
    { 
        rc.left = (bmCheckbox.bmWidth / 4); 
        rc.right = (bmCheckbox.bmWidth / 4) * 2; 
    } 
 
    rc.top = 0; 
    rc.bottom = (bmCheckbox.bmHeight / 3); 
 
    // Copy the appropriate bitmap into the target DC. If the 
    // check-box bitmap is larger than the default check-mark 
    // bitmap, use StretchBlt to make it fit; otherwise, just 
    // copy it. 
 
    if (((rc.right - rc.left) > (int) wBitmapX) || 
            ((rc.bottom - rc.top) > (int) wBitmapY)) 
    {
        StretchBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY, 
            hdcSource, rc.left, rc.top, rc.right - rc.left, 
            rc.bottom - rc.top, SRCCOPY); 
    }
 
    else 
    {
        BitBlt(hdcTarget, 0, 0, rc.right - rc.left, 
            rc.bottom - rc.top, 
            hdcSource, rc.left, rc.top, SRCCOPY); 
    }
 
    // Select the old source and destination bitmaps into the 
    // source and destination DCs, and then delete the DCs and 
    // the background brush. 
 
    SelectObject(hdcSource, hbmpSourceOld); 
    SelectObject(hdcTarget, hbrTargetOld); 
    hbmpCheck = SelectObject(hdcTarget, hbmpTargetOld); 
 
    DeleteObject(hbrBackground); 
    DeleteObject(hdcSource); 
    DeleteObject(hdcTarget); 
 
    // Return the handle to the new check-mark bitmap.  
 
    return hbmpCheck; 
} 
 
 
BYTE CheckOrUncheckMenuItem(BYTE bMenuItemID, HMENU hmenu) 
{ 
    DWORD fdwMenu; 
    static BYTE fbAttributes; 
 
    switch (bMenuItemID) 
    { 
        case IDM_REGULAR: 
 
            // Whenever the Regular menu item is selected, add a 
            // check mark to it and then remove check marks from 
            // any font-attribute menu items. 
 
            CheckMenuItem(hmenu, IDM_REGULAR, MF_BYCOMMAND | 
                MF_CHECKED); 
 
            if (fbAttributes & ATTRIBMASK) 
            { 
                CheckMenuItem(hmenu, IDM_BOLD, MF_BYCOMMAND | 
                    MF_UNCHECKED); 
                CheckMenuItem(hmenu, IDM_ITALIC, MF_BYCOMMAND | 
                    MF_UNCHECKED); 
                CheckMenuItem(hmenu, IDM_ULINE, MF_BYCOMMAND | 
                    MF_UNCHECKED); 
            } 
            fbAttributes = IDM_REGULAR; 
            return fbAttributes; 
 
        case IDM_BOLD: 
        case IDM_ITALIC: 
        case IDM_ULINE: 
 
            // Toggle the check mark for the selected menu item and 
            // set the font attribute flags appropriately. 
 
            fdwMenu = GetMenuState(hmenu, (UINT) bMenuItemID, 
                MF_BYCOMMAND); 
            if (!(fdwMenu & MF_CHECKED)) 
            { 
                CheckMenuItem(hmenu, (UINT) bMenuItemID, 
                    MF_BYCOMMAND | MF_CHECKED); 
                fbAttributes |= bMenuItemID; 
            }
            else 
            { 
                CheckMenuItem(hmenu, (UINT) bMenuItemID, 
                    MF_BYCOMMAND | MF_UNCHECKED); 
                fbAttributes ^= bMenuItemID; 
            } 
 
            // If any font attributes are currently selected, 
            // remove the check mark from the Regular menu item; 
            // if no attributes are selected, add a check mark 
            // to the Regular menu item. 
 
            if (fbAttributes & ATTRIBMASK) 
            { 
                CheckMenuItem(hmenu, IDM_REGULAR, 
                    MF_BYCOMMAND | MF_UNCHECKED); 
                fbAttributes &= (BYTE) ~IDM_REGULAR; 
            }
            else 
            { 
                CheckMenuItem(hmenu, IDM_REGULAR, 
                    MF_BYCOMMAND | MF_CHECKED); 
                fbAttributes = IDM_REGULAR; 
            } 
 
            return fbAttributes; 
    } 
} 
 

Index