1

より大きなプロジェクトの一環として、既存の HICON から HICON を作成しようとしています。最初にそのアイコンを HBITMAP にペイントし、次にそれを HICON に変換します。(これにより、アイコンにテキストを描画するなどして、アイコンを変更できます。)

残念ながら、アイコンは黒い四角で表示されています。これが私のコードです:

bool createIcon()
{
  bool ret = false;

  // get context of window
  HDC context = GetDC(window_);
  if (context != NULL)
  {
    // create a buffer context
    HDC buffer = CreateCompatibleDC(context);
    if (buffer != NULL)
    {
      PatBlt(buffer, 0, 0, iconSize_, iconSize_, WHITENESS);

      // create a bitmap for our use
      HBITMAP bitmap = CreateCompatibleBitmap(context, iconSize_, iconSize_);
      if (bitmap != NULL)
      {
        HBITMAP oldBitmap;

        // select the bitmap with the buffer
        oldBitmap = reinterpret_cast<HBITMAP>(SelectObject(buffer, bitmap));
        if (oldBitmap != NULL)
        {          
          // draw the icon
          if (DrawIcon(buffer, 0, 0, icon_))
          {
            if (icon_ != NULL)
              DestroyIcon(icon_);

            ImageList_RemoveAll(imageList_);
            if (ImageList_Add(imageList_, bitmap, NULL) != -1)
            {
              icon_ = ImageList_GetIcon(imageList_, 0, ILD_NORMAL);
              if (icon_ != NULL)
                ret = true;
            }
          }          
          SelectObject(buffer, oldBitmap);
        }
        DeleteObject(bitmap);
      }
      DeleteDC(buffer);
    }
    DeleteDC(context);
  }
  return ret;
}

何か案は?

4

2 に答える 2

1

おそらく、ビットマップ自体が黒かどうか、またはそれが適切でアイコンだけが黒かどうかを確認する必要があります。私の経験から (これについての合理的な説明はありません)、問題は周辺にCreateCompatibleBitmapあり、ビットマップ自体は既に黒くなっていると思います。CreateDIBSection代わりに試してください。これは私のために働いていました:

//HBITMAP hBitmap = CreateCompatibleBitmap(hDc, ResourceIconColorBitmap.bmWidth, ResourceIconColorBitmap.bmHeight);
BITMAPINFO BitmapInformation;
ZeroMemory(&BitmapInformation, sizeof BitmapInformation);
BitmapInformation.bmiHeader.biSize = sizeof BitmapInformation.bmiHeader;
BitmapInformation.bmiHeader.biWidth = ResourceIconColorBitmap.bmWidth;
BitmapInformation.bmiHeader.biHeight = ResourceIconColorBitmap.bmHeight;
BitmapInformation.bmiHeader.biPlanes = 1;
BitmapInformation.bmiHeader.biBitCount = 24;
VOID* pvBits;
HBITMAP hBitmap = CreateDIBSection(hDc, &BitmapInformation, DIB_RGB_COLORS, &pvBits, NULL, 0);
于 2012-09-13T06:45:08.673 に答える
0
ICONINFO nfo;
GetIconInfo(icon_, &nfo);
MyDrawSomethingOnIcon(nfo.hbmColor);
HICON new_icon = CreateIconIndirect(&nfo);

実装するだけですMyDrawSomethingOnIcon。もちろん、使用されなくなったアイコンとビットマップはすべて解放する必要があります。MSDN はそれを処理するのに役立ちます =)

于 2012-09-13T09:22:08.013 に答える