ビットマップメニュー
メニューにビットマップを使う
メニューのポップアップや項目にビットマップを指定することもできる
通常のテキストメニューに慣れてしまっている人には、かなり斬新に見えるでしょう
メニューにビットマップを割り当てる方法は、以外と簡単です
MENUITEMINFO 構造体の fType メンバに MFT_BITMAP を指定し
dwTypeData の下位ワードに、ビットマップのハンドルを指定します
あとは、この構造体を InsertMenuItem() 関数でメニューに挿入します
//リソーススクリプト
RENA BITMAP "rena.bmp"
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
HINSTANCE hInstance;
static HMENU hMenu , hSub;
static HBITMAP hRena;
MENUITEMINFO miInfo;
switch (msg) {
case WM_DESTROY:
DeleteObject(hRena);
PostQuitMessage(0);
return 0;
case WM_CREATE:
hInstance = ((LPCREATESTRUCT)lp)->hInstance;
hRena = LoadBitmap(hInstance , TEXT("RENA"));
hMenu = CreateMenu();
hSub = CreateMenu();
miInfo.cbSize = sizeof (MENUITEMINFO);
miInfo.fMask = MIIM_TYPE | MIIM_SUBMENU;
miInfo.fType = MFT_STRING;
miInfo.hSubMenu = hSub;
miInfo.dwTypeData = TEXT("Kitty on your lap");
InsertMenuItem(hMenu , 1 , TRUE , &miInfo);
miInfo.fMask = MIIM_TYPE;
miInfo.fType = MFT_BITMAP;
miInfo.dwTypeData = (LPTSTR)hRena;
InsertMenuItem(hSub , 1 , TRUE , &miInfo);
SetMenu(hwnd , hMenu);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
このように、メニュー項目にビットマップを使うことができます
しかし、それが本質的に必要になることはほとんどないと言えるでしょう
比較的大きなビットマップを使う場合、解像度にも注意する必要があります
ビットマップとテキストの項目の最大の違いはキーボード処理です
ビットマップメニューを Alt + 文字キー に対応させたい場合は
WM_MENUCHAR メッセージを処理し、戻り値から Windows に処理を要求します