הדוגמה בנושא זה יוצר שני תפריטים, שכל אחד מהם מכיל מספר פריטים של תפריט מפת סיביות. עבור כל תפריט, היישום מוסיף שם תפריט מתאים שורת התפריטים של החלון הראשי.
התפריט הראשון מכיל פריטי התפריט מציג את כל אחד מסוגי התרשים שלושה: עוגה, הקו וסרגל. מפת סיביות עבור פריטי תפריט אלה מוגדרים משאבים ו נטענים באמצעות LoadBitmap פונקציה. המשויך לתפריט זה הוא שם תפריט "תרשים" בשורת התפריטים.
התפריט השני מכיל פריטי התפריט מציג כל אחד מסגנונות קו חמש עם CreatePen פונקציה: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, ו PS_DASHDOTDOT. היישום יוצר מפות סיביות עבור פריטי תפריט אלה בזמן ריצה תוך שימוש בפונקציות הציור של GDI. המשויך לתפריט זה הוא שם תפריט "קווים" בשורת התפריטים.
הגדרה בהליך חלון היישום הם שני מערכים סטטי של נקודות אחיזה של מפת סיביות. מערך אחד מכיל את נקודות האחיזה של שלוש מפות סיביות המשמש עבור התפריט תרשים. השני מכיל את נקודות האחיזה של חמש מפות סיביות המשמש עבור תפריט ה-קווים. בעת עיבוד הודעה WM_CREATE , ההליך חלון טעינת מפות סיביות של התרשים, יוצר מפות סיביות של קו ולאחר מכן מוסיף את פריטי התפריט המתאים. בעת עיבוד הודעה WM_DESTROY , ההליך חלון מוחקת את כל מפות הסיביות.
להלן החלקים הרלוונטיים של קובץ הכותרת של היישום.
/ / מזהי פריט התפריט # הגדרת IDM_PIE 1 # הגדרת IDM_LINE 2 # הגדרת IDM_BAR 3 # הגדרת IDM_SOLID 4 # הגדרת IDM_DASH 5 # הגדרת IDM_DASHDOT 6 # הגדרת IDM_DASHDOTDOT 7 / / מספר פריטים בתפריטים תרשים וקווים # הגדרת C_LINES 5 # הגדרת C_CHARTS 3 / / מפת סיביות מזהים משאב # הגדרת IDB_PIE 1 # הגדרת IDB_LINE 2 # הגדרת IDB_BAR 3 / / ממדים של מפות סיביות של קו הגדר # CX_LINEBMP 40 # הגדרת CY_LINEBMP 10
להלן החלקים הרלוונטיים של הפרוצדורה של החלון. ההליך חלון מבצע את רוב האתחול שלו על-ידי קריאה ' מוגדר על-ידי יישום LoadChartBitmaps, CreateLineBitmaps ו- AddBitmapMenu הפונקציות, שיתואר בהמשך נושא זה.
MainWindowProc LRESULT להתקשרות חזרה (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {סטטי HBITMAP aHbmLines [C_LINES];
aHbmChart HBITMAP סטטי [C_CHARTS];
int;
מתג (uMsg) {מקרה WM_CREATE: / / קוראים פונקציות המוגדרות על-ידי היישום כדי לטעון / / מפות סיביות עבור התפריט תרשים וליצור אלה עבור / / תפריט קווי.
LoadChartBitmaps(aHbmChart);
CreateLineBitmaps(aHbmLines);
/ / לפונקציה מוגדרת על-ידי יישום כדי ליצור / / תפריטים המכילה את פריטי תפריט מפת סיביות. הפונקציה / / מוסיף גם שם תפריט בשורת התפריטים של החלון.
AddBitmapMenu (hwnd, / / חלון הבעלים 'כח של שורת התפריטים;תרשים", / / טקסט של תפריט שם בתפריט בר IDM_PIE, / / מזהה של הפריט הראשון על תפריט aHbmChart, / / מערך של מפת סיביות מטפל C_CHARTS / / מספר פריטים בתפריט);
AddBitmapMenu (hwnd, "קווים", IDM_SOLID, aHbmLines, C_LINES);
מעבר;
מקרה WM_DESTROY: עבור (אני = 0; אני < C_LINES; i + +) DeleteObject(aHbmLines[i]);
עבור (אני = 0; אני < C_CHARTS; i + +) DeleteObject(aHbmChart[i]);
PostQuitMessage(0);
מעבר;
/ / תהליך נוסף של הודעות כאן.
ברירת מחדל: להחזיר (DefWindowProc (hwnd, uMsg, wParam, lParam));
} להחזיר 0;
}
הפונקציה המוגדרת על-ידי יישום LoadChartBitmaps טוען את המשאבים מפת סיביות עבור התפריט תרשים על-ידי קריאה LoadBitmap פעולה, כדלקמן.
LoadChartBitmaps(HBITMAP *paHbm) WINAPI האין {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, ומצייר בה.
Create&LineBitmaps(HBITMAP *paHbm) WINAPI האין {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;
/ / יצירת מברשת באמצעות צבע רקע בתפריט, / / ובחר אותו לזיכרון ה-DC.
hbrOld = SelectObject (hdcMem, CreateSolidBrush(clrMenu));
/ / ליצור את מפות סיביות. בחר כל אחת מהן לתוך הזיכרון / / DC אשר נוצר וצייר בו.
עבור (אני = 0; אני בהיר; 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 יוצר תפריט, מוסיף לו המספר שצוין של פריטים בתפריט מפת סיביות. לאחר מכן הוא מוסיף שם תפריט מתאים שורת התפריטים של החלון שצוין.
VOID WINAPI AddBitmapMenu (HWND hwnd, / / חלון אשר בבעלות על התפריט בר lpszText כלי שירות, / / טקסט של תפריט שם בתפריט בר UINT uID, / / מזהה של התפריט הראשון של מפת סיביות פריט HBITMAP * paHbm, / / מפות סיביות עבור התפריט פריטים int cItems) / / מספר פריטי תפריט מפת סיביות {HMENU hmenuBar = GetMenu(hwnd);
HMENU hmenuPopup = CreatePopupMenu();
MENUITEMINFO אומנות וידאו;
int;
/ / להוסיף לתפריט פריטי תפריט מפת סיביות.
עבור (אני = 0; אני lt; cItems; i + +) {mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA;
mii.fType = MFT_BITMAP;
mii.wID = uID + I;
mii.dwTypeData = (כלי שירות) (paHbm[i]);
InsertMenuItem (hmenuPopup, i, TRUE, & ומיאי);
} / / הוספת שם תפריט בשורת התפריטים.
mii.fMask = MIIM_TYPE | MIIM_DATA | MIIM_SUBMENU;
mii.fType = MFT_STRING;
mii.hSubMenu = hmenuPopup;
mii.dwTypeData = lpszText;
InsertMenuItem (hmenuBar, GetMenuItemCount(hmenuBar), אמת, & ומיאי);
}