STM_IMAGEをビットマップでコントロールに送信してイメージを設定している静的コントロールがあります。これは正常に動作しますが、私はビットマップが透明な背景を持つことを望みます。 (これはそうSTM_SETIMAGEを使用する前のビットマップの透明度の設定
case WM_CREATE:
{
HWND newGameText = CreateWindowW(
L"STATIC",
L"",
WS_VISIBLE | WS_CHILD | SS_BITMAP | SS_NOTIFY, // Styles
150, // x position
150, // y position
74, // width
24, // height
hWnd, // Parent window
(HMENU)ID_BUTTONNEWGAME,
(HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
NULL); // Pointer not needed.
}
break;
私がコントロールの特定の位置にビットマップをコピーする必要があります:
case WM_PAINT:
{
HBITMAP hbmBmp, hbmMask;
BITMAP bm;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HWND hCtrl = GetDlgItem(hWnd, ID_BUTTONNEWGAME);
hbmBmp = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_NEWGAMEBUTTONBITMAP));
GetObject(hbmBmp, sizeof(BITMAP), &bm);
hbmMask = CreateBitmapMask(hbmBmp, RGB(0, 0, 0));
HDC hDCMem = CreateCompatibleDC(hdc);
HDC hDCMem2 = CreateCompatibleDC(hdc);
HDC hdcResult = CreateCompatibleDC(hdc);
SelectObject(hDCMem, hbmMask);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hDCMem, 0, 0, SRCAND);
SelectObject(hDCMem, hbmBmp);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hDCMem, 0, 0, SRCPAINT);
// At this point I can see the bitmap with a transparent background at (0,0)
// The following code attempts to copy from hdc into a memory DCand to form a new bitmap
//that I use in the STM_SETIMAGE message
HBITMAP newBitmap = CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight); // create blank bitmap
SelectObject(hdcResult, newBitmap); // store in memory DC
BitBlt(hdcResult, 0, 0, bm.bmWidth, bm.bmHeight, hdc, 0, 0, SRCCOPY); // copy from hdc to memory DC
// This line is just for checking that hdcResult contains the correct data
// It copies back from the memory DC into hdc to the right of the original bitmap
// I now see two bitmaps with transparent bitmaps next to each other as I expected
BitBlt(hdc, bm.bmWidth, 0, bm.bmWidth, bm.bmHeight, hdcResult, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
// sending this does not set the bitmap on the static control
// I do not see anything where the control should be
SendMessage(hCtrl, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)newBitmap);
}
break;
静的コントロールは、次のコードでSS_BITMAPスタイルで作成されています。私は、次のコードを持っています私は何かを完全に不可能/愚かなことをしていますか?
私は、使用後にデバイスのコンテキストも削除する必要があります。 – Paul
(アルファ)透明のビットマップを作成していません。 'BitBlt'への最初の2回の呼び出しは、マスクされていないピクセルに書き込むだけで、透明度の**錯覚**を作成します。いったん終了すると、まだ変更されていないピクセルは背景色を持ちます。透明化したい場合は、[STM_SETIMAGE](https://msdn.microsoft.com/en-us/library/windows/desktop/bb760782.aspx)と 'IMAGE_ICON'を使用してください。アイコンは透明度をサポートしています(PNGサポートの紹介ではアルファ透明度さえも可能です)(https://blogs.msdn.microsoft.com/oldnewthing/20101022-00/?p=12473))。 – IInspectable
ありがとうございますが、私はボタン上に何も表示されていません。透過性のないビットマップさえありません。 OPを編集してより明確にする。 – Paul