ตัวอย่างของบิตแมปรายการเมนู

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

เมนูแรกประกอบด้วยรายการเมนูที่แสดงแต่ละชนิดของแผนภูมิสาม: วงกลม บรรทัด และแถบงาน บิตแมปสำหรับรายการเมนูเหล่านี้ถูกกำหนดเป็นทรัพยากร และถูกโหลด โดยใช้ 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); 
} 

 

Index