C++でアイコン付きメニューを実現しようとして、昔、オーナードローで全部書き上げた。
それはそれで完成しているのだが・・・
色々と調べていたら、もっと簡単な方法があった。
結論から言うと、
MENUITEMINFO mii ;
mii.cbSize = sizeof(MENUITEMINFO) ;
mii.fMask = MIIM_BITMAP;
mii.hbmpItem = hBitmap ;
SetMenuItemInfo(hMenu , uItem , fByPosition , &mii) ;
でいい。
アイコンを描画したビットマップを用意して、上記のように指定してあげれば、それでいい。
今まで何十年と、何していたんだろう。
アイコンを描画したビットマップを用意する方法で、「透過」部分を作ることが大切。ビットマップだと、不透明度をつけないといけないから、32ビットで作る必要あり。
ということで、
HBITMAP CreateDIBSection(
HDC hdc, // handle to device context
CONST BITMAPINFO *pbmi,
// pointer to structure containing bitmap size,
// format, and color data
UINT iUsage, // color data type indicator: RGB values or
// palette indexes
VOID *ppvBits, // pointer to variable to receive a pointer to
// the bitmap's bit values
HANDLE hSection, // optional handle to a file mapping object
DWORD dwOffset // offset to the bitmap bit values within the
// file mapping object
);
を使用。
hBitmap = CreateDIBSection(
hdc ,
&bmpInfo ,
DIB_RGB_COLORS ,
(void**)&lpPixel ,
NULL ,
0
) ;
と、こんな感じ。
void** のところは、直接操作する場合に必要だが、今回は不要。
2つめの引数については、次回に。