ตัวอย่างในหัวข้อนี้กำหนดบิตแมปเครื่องหมายที่กำหนดเองไปที่เมนูสินค้าในเมนูสอง รายการในเมนูในเมนูแรกระบุคุณลักษณะอักขระ: ตัว หนา ตัวเอียง และการขีดเส้นใต้ แต่ละรายการในเมนูสามารถตรวจสอบ หรือไม่ได้ตรวจสอบ สำหรับสินค้าเหล่านี้เมนู ตัวอย่างการใช้บิตแมปกาเครื่องหมายที่คล้ายกับการตรวจสอบ และไม่ได้ตรวจสอบสถานะของตัวควบคุมกล่องกาเครื่องหมาย.
รายการในเมนูในเมนูที่สองระบุการตั้งค่าการจัดตำแหน่งย่อหน้า: ซ้าย กึ่งกลาง และขวา เดียวของรายการเมนูเหล่านี้มีการตรวจสอบเวลาที่กำหนด สำหรับสินค้าเหล่านี้เมนู ตัวอย่างการใช้บิตแมปกาเครื่องหมายที่คล้ายกับการตรวจสอบ และไม่ได้ตรวจสอบสถานะของตัวควบคุมปุ่มวิทยุ.
หน้าต่างกระบวนงานประมวลผลข้อความ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);
}