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つめの引数については、次回に。