ตัวอย่างการใช้บิตแมปแบบกำหนดเองเครื่อง

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

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

หน้าต่างกระบวนงานประมวลผลข้อความWM_CREATEโดยการเรียกฟังก์ชัน OnCreate การกำหนดโปรแกรมประยุกต์ OnCreate สร้างบิตแมปเครื่องหมายสี่ จากนั้น มอบหมายให้รายการเมนูที่เหมาะสมของตนเอง โดยใช้ฟังก์ชันSetMenuItemBitmaps.

เมื่อต้องการสร้างแต่ละบิตแมป OnCreate เรียกฟังก์ชัน CreateMenuBitmaps กำหนดโปรแกรมประยุกต์ การระบุตัวชี้ไปยังฟังก์ชันการวาดรูปบิตแมปเฉพาะ CreateMenuBitmaps สร้างบิตแมปขาวดำขนาดที่ต้องการ เลือกลงในบริบทอุปกรณ์หน่วยความจำ และลบพื้นหลัง แล้ว เรียกฟังก์ชันรูปวาดที่ระบุเพื่อกรอกข้อมูลในเบื้องหน้า.

สี่โปรแกรมประยุกต์รูปวาดฟังก์ชันที่กำหนดเองได้ 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 #กำหนด 12 IDM_ITALIC #กำหนด IDM_UNDERLINE 13 / / ตัวระบุรายการเมนูสำหรับเมนูย่อหน้า#กำหนด 20 IDM_PARAGRAPH #กำหนด 21 IDM_LEFT #กำหนด 22 IDM_CENTER #กำหนด IDM_RIGHT 23 / / ฟังก์ชันชี้ชนิดสำหรับรูปวาดฟังก์ชัน typedef โมฆะ (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