ビットマップメニュー


メニューにビットマップを使う

メニューのポップアップや項目にビットマップを指定することもできる
通常のテキストメニューに慣れてしまっている人には、かなり斬新に見えるでしょう

メニューにビットマップを割り当てる方法は、以外と簡単です
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 に処理を要求します



前のページへ戻る次のページへ