ตัวอย่างในหัวข้อนี้สร้างเมนูสอง แต่ละที่ประกอบด้วยหลายรายการเมนูบิตแมป สำหรับแต่ละเมนู แอปพลิเคชันเพิ่มชื่อเมนูที่เกี่ยวข้องกับแถบเมนูของหน้าต่างหลัก.
เมนูแรกประกอบด้วยรายการเมนูที่แสดงแต่ละชนิดของแผนภูมิสาม: วงกลม บรรทัด และแถบงาน บิตแมปสำหรับรายการเมนูเหล่านี้ถูกกำหนดเป็นทรัพยากร และถูกโหลด โดยใช้ LoadBitmapฟังก์ชัน เกี่ยวข้องกับเมนูนี้คือ "ภูมิ" ชื่อเมนูบนแถบเมนู.
เมนูที่สองประกอบด้วยรายการเมนูที่แสดงแต่ละบรรทัดห้าลักษณะที่ใช้กับการ CreatePenฟังก์ชัน: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT และ PS_DASHDOTDOT โปรแกรมประยุกต์ที่สร้างบิตแมปสำหรับรายการเมนูเหล่านี้เวลาเรียกใช้งานโดยใช้ฟังก์ชันรูปวาดของ GDI เกี่ยวข้องกับเมนูนี้คือ "บรรทัด" ชื่อเมนูบนแถบเมนู.
กำหนดไว้ในขั้นตอนของหน้าต่างของโปรแกรมประยุกต์คือ 2 คงที่อาร์เรย์ของบิตแมปที่จับ อาร์เรย์ที่หนึ่งประกอบด้วยการจับของบิตแมปสามที่ใช้สำหรับเมนูแผนภูมิ อื่น ๆ ประกอบด้วยการจับของบิตแมปห้าที่ใช้สำหรับบรรทัดเมนู เมื่อการประมวลผลข้อความWM_CREATEหน้าต่างขั้นตอนโหลดบิตแมปแผนภูมิ สร้างบิตแมปบรรทัด แล้ว เพิ่มรายการเมนูที่สอดคล้องกัน เมื่อการประมวลผลข้อความWM_DESTROYกระบวนการหน้าต่างลบทั้งหมดของบิตแมป.
ต่อไปนี้เป็นส่วนเกี่ยวข้องของแอพลิเคชันของส่วนหัวของแฟ้ม.
/ / #กำหนด 1 IDM_PIE #กำหนด 2 IDM_LINE #กำหนด 3 IDM_BAR #กำหนด IDM_SOLID 4 #กำหนด 5 IDM_DASH #กำหนด IDM_DASHDOT 6 #กำหนดตัวบ่งชี้ของรายการเมนู IDM_DASHDOTDOT 7 / / จำนวนของรายการบนเมนูแผนภูมิและบรรทัด #กำหนด C_LINES 5 #กำหนด C_CHARTS 3 / / บิตแมป#กำหนด 1 IDB_PIE #กำหนด 2 IDB_LINE #กำหนดตัวบ่งชี้ของทรัพยากร IDB_BAR 3 / / ขนาดของบิตแมปบรรทัด #กำหนด CX_LINEBMP 40 #กำหนด CY_LINEBMP 10
ต่อไปนี้เป็นส่วนเกี่ยวข้องของกระบวนงานหน้าต่าง ขั้นตอนในหน้าต่างทำการเตรียมใช้งานมากที่สุด โดยการเรียกโปรแกรมประยุกต์กำหนด LoadChartBitmaps, CreateLineBitmaps และ AddBitmapMenu ฟังก์ชัน อธิบายไว้ในหัวข้อนี้ในภายหลัง.
ติดต่อกลับ LRESULT MainWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {คง HBITMAP aHbmLines [C_LINES];
คง HBITMAP aHbmChart [C_CHARTS];
int I
สวิตช์ (uMsg) {กรณี WM_CREATE: / / เรียกใช้ฟังก์ชันต่าง ๆ ที่โปรแกรมประยุกต์กำหนดโหลดการ / / บิตแมปสำหรับเมนูแผนภูมิ และสร้างความ / / เมนูเส้นทาง
LoadChartBitmaps(aHbmChart)
CreateLineBitmaps(aHbmLines)
/ / เรียกใช้ฟังก์ชันการกำหนดโปรแกรมประยุกต์เพื่อสร้าง / / เมนูที่ประกอบด้วยรายการเมนูบิตแมป ฟังก์ชัน / / เพิ่มชื่อเมนูแถบเมนูของหน้าต่าง
AddBitmapMenu (hwnd, / / แถบเมนูเจ้าของหน้าต่าง "แอมป์แผนภูมิ", / / ข้อความของเมนูชื่อบนเมนูบาร์ IDM_PIE, / / ID ของรายการแรกบนเมนู aHbmChart, / / อาร์เรย์ของบิตแมปจับ C_CHARTS / / จำนวนของรายการในเมนู);
AddBitmapMenu (hwnd, "& บรรทัด" IDM_SOLID, aHbmLines, C_LINES);
break
กรณี WM_DESTROY: สำหรับ (ฉัน = 0 ฉัน < C_LINES; i ++) DeleteObject(aHbmLines[i])
สำหรับ (ฉัน = 0 ฉัน < C_CHARTS; i ++) DeleteObject(aHbmChart[i])
PostQuitMessage(0)
break
/ / กระบวนการเพิ่มเติมข้อความที่นี่
เริ่มต้น: กลับ (DefWindowProc (hwnd, uMsg, wParam, lParam));
} กลับ 0
}
โปรแกรมประยุกต์กำหนดฟังก์ชัน LoadChartBitmaps โหลดบิตแมปทรัพยากรสำหรับเมนูแผนภูมิ โดยการเรียกการ LoadBitmapฟังก์ชัน เป็นดังนี้.
โมฆะ WINAPI LoadChartBitmaps(HBITMAP *paHbm) { paHbm [0] = LoadBitmap (g_hinst, MAKEINTRESOURCE(IDB_PIE))
paHbm [1] = LoadBitmap (g_hinst, MAKEINTRESOURCE(IDB_LINE))
paHbm [2] = LoadBitmap (g_hinst, MAKEINTRESOURCE(IDB_BAR))
}
โปรแกรมประยุกต์กำหนดฟังก์ชัน CreateLineBitmaps สร้างบิตแมปสำหรับเมนูเส้น โดยใช้ฟังก์ชันรูปวาดของ GDI ฟังก์ชันสร้างบริบทอุปกรณ์หน่วยความจำ (DC) พร้อม ด้วยคุณสมบัติเหมือนกันเป็นของหน้าต่างเดสก์ท็อป DC สำหรับแต่ละลักษณะเส้น ฟังก์ชันสร้างบิตแมป เลือกลงในหน่วยความจำ DC และวาดในนั้น.
โมฆะ WINAPI Create&LineBitmaps(HBITMAP *paHbm) { HWND hwndDesktop = GetDesktopWindow()
HDC hdcDesktop = GetDC(hwndDesktop)
HDC hdcMem = CreateCompatibleDC(hdcDesktop)
COLORREF clrMenu = GetSysColor(COLOR_MENU)
HBRUSH hbrOld
HPEN hpenOld
HBITMAP hbmOld
int fnDrawMode
int I
/ / สร้างแปรงโดยใช้สีพื้นหลังเมนู, / / เลือกลงในหน่วยความจำ DC
hbrOld = SelectObject (hdcMem, CreateSolidBrush(clrMenu))
/ / สร้างบิตแมป เลือกแต่ละตัวในหน่วยความจำ / / DC ที่ที่สร้าง และวาดในนั้น
สำหรับ (ฉัน = 0 ฉัน lt C_LINES i ++) { / / สร้างบิตแมป และเลือกลงใน DC
paHbm [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP);
hbmOld = SelectObject (hdcMem, paHbm[i])
/ / เติมพื้นหลังโดยใช้แปรง
PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY);
/ / สร้างปากกา และเลือกลงใน DC
hpenOld = SelectObject (hdcMem, CreatePen (PS_SOLID + I, 1, RGB (0, 0, 0)));
/ / วาดเส้น การรักษาสีพื้นหลังที่ / / ปากกาเป็นสีขาว ใช้โหมดการวาด R2_MASKPEN
fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN);
MoveToEx (hdcMem, 0, CY_LINEBMP/2, NULL);
LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2);
SetROP2 (hdcMem, fnDrawMode);
/ / ลบปากกา และเลือกปากกาเก่าและบิตแมป
DeleteObject (SelectObject (hdcMem, hpenOld));
SelectObject (hdcMem, hbmOld);
} / / แปรงลบ และเลือกแปรงต้นฉบับ
DeleteObject (SelectObject (hdcMem, hbrOld));
/ / ลบหน่วยความจำ DC และปล่อย DC เดสก์ท็อป
DeleteDC(hdcMem)
ReleaseDC (hwndDesktop, hdcDesktop);
}
โปรแกรมประยุกต์กำหนดฟังก์ชัน AddBitmapMenu สร้างเมนู และเพิ่มจำนวนที่ระบุของรายการเมนูของบิตแมปนั้น จากนั้น มีเพิ่มชื่อเมนูที่เกี่ยวข้องกับแถบเมนูของหน้าต่างที่ระบุ.
โมฆะ WINAPI AddBitmapMenu (HWND hwnd, / / เจ้าของหน้าต่างที่เป็นแถบ LPSTR lpszText เมนู / / ข้อความของเมนูชื่อบนเมนูบาร์ UINT uID, / / ID ของเมนูแรกของบิตแมปสินค้า HBITMAP * paHbm, / / บิตแมปสำหรับเมนูรายการ int cItems) / / จำนวนรายการเมนูของบิตแมป { HMENU hmenuBar = GetMenu(hwnd)
HMENU hmenuPopup = CreatePopupMenu()
MENUITEMINFO mii
int I
/ / เพิ่มรายการเมนูบิตแมปไปยังเมนู
สำหรับ (ฉัน = 0 ฉัน lt; cItems; i ++) { mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA
mii.fType = MFT_BITMAP
mii.wID = uID + I
mii.dwTypeData = (LPSTR) (paHbm[i])
InsertMenuItem (hmenuPopup, i, TRUE, & mii);
} / / เพิ่มชื่อเมนูบนแถบเมนู
mii.fMask = MIIM_TYPE | MIIM_DATA | MIIM_SUBMENU
mii.fType = MFT_STRING
mii.hSubMenu = hmenuPopup
mii.dwTypeData = lpszText
InsertMenuItem (hmenuBar, GetMenuItemCount(hmenuBar), TRUE และ mii);
}