0から始めるVisualStudio2022:ソフト開発塾
前回の絵(48x48)の背景部は白になっている。
透明にしてみたい。
VisualStudio2022を起動して
新しいプロジェクトを選んで
検索にdialogを入力し前に作った、テンプレートを選ぶ
プロジェクト名をDialog009にして、作成
透明にするには、透明色を決めてそれを絵(48x48)の背景で塗っておく
例えば、(RGB(255,0,255))
として、BitBlt ではなく TransparentBlt を使う。
TransparentBlt(
ps.hdc, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
ソースはこんな感じ
#include <Windows.h>
#include "resource.h"
#pragma comment(lib,"msimg32.lib")
HINSTANCE g_hInst;
BOOL CALLBACK MyDlgProc(
HWND hDlg,
UINT msg,
WPARAM wPara,
LPARAM lPara
) {
HDC mm_hdc;
PAINTSTRUCT ps;
static int mm_zz = 0;
static HBITMAP mm_hbitmap1, mm_hbitmap2;
static HDC mm_hdc1, mm_hdc2;
static BITMAP mm_bitmap1, mm_bitmap2;
switch (msg) {
case WM_INITDIALOG:
mm_hbitmap1 = LoadBitmapA(g_hInst, MAKEINTRESOURCEA(IDB_BITMAP1));
mm_hbitmap2 = LoadBitmapA(g_hInst, MAKEINTRESOURCEA(IDB_BITMAP2));
GetObject(mm_hbitmap1, sizeof(BITMAP), &mm_bitmap1);
GetObject(mm_hbitmap2, sizeof(BITMAP), &mm_bitmap2);
mm_hdc1 = CreateCompatibleDC(NULL);
mm_hdc2 = CreateCompatibleDC(NULL);
SelectObject(mm_hdc1, mm_hbitmap1);
SelectObject(mm_hdc2, mm_hbitmap2);
break;
case WM_DESTROY:
DeleteDC(mm_hdc2);
DeleteDC(mm_hdc1);
DeleteObject(mm_hbitmap2);
DeleteObject(mm_hbitmap1);
break;
case WM_NCPAINT:
mm_hdc = GetDC(hDlg);
BitBlt(mm_hdc, 0, 0, mm_bitmap2.bmWidth, mm_bitmap2.bmHeight, mm_hdc2, 0, 0, SRCCOPY);
ReleaseDC(hDlg, mm_hdc);
break;
case WM_ERASEBKGND:
return 1;
case WM_PAINT:
mm_hdc = BeginPaint(hDlg, &ps);
TransparentBlt(
ps.hdc, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
EndPaint(hDlg, &ps);
break;
case WM_COMMAND:
switch (LOWORD(wPara)) {
case IDOK:
EndDialog(hDlg, IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
return TRUE;
}
return FALSE;
}
return FALSE;
}
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow) {
g_hInst = hInstance;
DialogBoxA(hInstance, "DIALOGBOX", NULL, (DLGPROC)MyDlgProc);
return 0;
}
絵(48x48)の背景を、透明にすることができた。
ただし、WM_PAINTで、TransparentBltを使用して絵(48x48)を描いていると、
絵を動かうようなことは、むつかしくなる。
Top 次