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