이 항목의 예제는 두 메뉴의 메뉴 항목에 비트맵 사용자 지정 확인란을 할당합니다. 문자 특성을 지정 하는 첫 번째 메뉴의 메뉴 항목: 굵게, 기울임꼴 및 밑줄. 각 메뉴 항목 선택 또는 선택 취소 될 수 있습니다. 이러한 메뉴 항목에 대 한 예제는 유사한 확인란 컨트롤의 checked 및 unchecked 상태 체크 마크 비트맵 사용.
두 번째 메뉴의 메뉴 항목 단락 맞춤 설정을 지정: 왼쪽, 가운데 및 오른쪽. 이러한 메뉴 항목 중 하나만 어떤 주어진된 시간에 확인 됩니다. 이러한 메뉴 항목에 대 한 예제에서는 라디오 단추 컨트롤의 checked 및 unchecked 상태를 닮은 체크 마크 비트맵 사용.
창 프로시저 OnCreate 응용 프로그램 정의 함수를 호출 하 여 WM_CREATE 메시지를 처리 합니다. OnCreate 4 체크 마크 비트맵을 만들고 SetMenuItemBitmaps 함수를 사용 하 여 그들을 그들의 적절 한 메뉴 항목을 할당.
각 비트맵을 만들려면 OnCreate 비트맵 특정 그리기 기능에 대 한 포인터를 지정 하면 응용 프로그램 정의 CreateMenuBitmaps 함수를 호출 합니다. Createmenubitmaps은 필요한 크기의 단색 비트맵 만들고 메모리 장치 컨텍스트에 선택 하 고 배경을 지웁니다. 다음 전경에서 채우기 위해 지정한 드로잉 함수 호출.
4 개의 응용 프로그램 정의 그리기 함수는 DrawCheck, DrawUncheck, DrawRadioCheck, 및 DrawRadioUncheck. 그들은 각각 X, 빈 사각형, 포함 하는 작은 채워진된 타원 타원와 빈 타원, 사각형을 그립니다.
창 프로시저는 체크 마크 비트맵을 삭제 하 여 WM_DESTROY 메시지를 처리 합니다. 그것은 GetMenuItemInfo 함수를 사용 하 여 각 비트맵 핸들을 검색 하 고 다음에 핸들을 전달 합니다 DeleteObject 함수.
사용자가 메뉴 항목을 선택 하는 경우 소유자 창으로 WM_COMMAND 메시지가 보내집니다. 문자 메뉴에서 메뉴 항목에 대 한 창 프로시저는 응용 프로그램 정의 CheckCharacterItem 함수를 호출합니다. 창 프로시저 응용 프로그램 정의 CheckParagraphItem 함수를 호출 하는 단락 메뉴에서 항목에 대 한.
문자 메뉴에서 각 항목은 체크 하 고 독립적으로 확인 되지 않은 될 수 있습니다. 따라서 Checkcharacteritem는 단순히 지정 된 메뉴 항목의 선택 상태를 전환합니다. 첫째, 함수 GetMenuItemInfo 함수가 현재 메뉴 항목 상태 호출 됩니다. MFS_CHECKED 상태 플래그를 전환 하 고 SetMenuItemInfo 함수를 호출 하 여 새 상태를 설정 하는 다음.
문자 특성을 달리 한 번에 하나의 단락 맞춤을 선택할 수 있습니다. 따라서, CheckParagraphItem 지정 된 메뉴 항목을 확인 하 고 메뉴의 기타 모든 항목에서 확인 표시를 제거 합니다. 이렇게 하려면 CheckMenuRadioItem 함수를 호출.
다음은 응용 프로그램의 헤더 파일의 관련 부분.
/ / 문자 메뉴의 메뉴 항목 식별자 # define IDM_CHARACTER 10 # define IDM_BOLD 11 # define IDM_ITALIC 12 # define IDM_UNDERLINE 13 / / 단락 메뉴의 메뉴 항목 식별자 # define IDM_PARAGRAPH 20 # define IDM_LEFT 21 # define IDM_CENTER 22 # define IDM_RIGHT 23 / / 그리기 함수 포인터 형식을 typedef VOID 함수 (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);
}