0から始めるVisualStudio2022:ソフト開発塾

復習
VisualStudio2022を起動して
新しいプロジェクトを選んで
検索にdialogを入力し前に作った、テンプレートを選ぶ
プロジェクト名をDialog008にして、作成
メニューより
『プロジェクト』『リソースの追加』
Bitmapで、新規作成
すると、48ドット × 48ドット × 4ビット の絵が現れる(ただし、真っ白)
これで、絵を描けそうだが、描けない。
ソリューションエクスプローラーで、bitmap1.bmpをダブルクリックする。
すると、次の画面が現れた。
これで、絵が描けるようだ。
適当な、絵を描いて、保存
コピーまたは同じ様に絵を描いて、保存
リソースビューの Dialog.rc に合わせてから、
メニューの「編集」「リソースシンボル」で
「新規作成」
IDT_TIMER1 を追加して
ソースを作成
#include 
#include "resource.h"

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;
    switch (msg) {
    case WM_INITDIALOG:
        static BITMAP mm_bitmap1, mm_bitmap2;

        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);

        SetTimer(hDlg, IDT_TIMER1, 1000 / 4, (TIMERPROC)NULL);
        break;
    case WM_DESTROY:
        DeleteDC(mm_hdc2);
        DeleteDC(mm_hdc1);
        DeleteObject(mm_hbitmap2);
        DeleteObject(mm_hbitmap1);
        KillTimer(hDlg, IDT_TIMER1);
        break;
    case WM_PAINT:
        mm_hdc = BeginPaint(hDlg, &ps);
        if (mm_zz) {
            BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, mm_hdc1, 0, 0, SRCCOPY);
        }
        else {
            BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, mm_hdc2, 0, 0, SRCCOPY);
        }
        EndPaint(hDlg, &ps);
        break;
    case WM_TIMER:
        switch (wPara) {
        case IDT_TIMER1:
            mm_zz = (++mm_zz % 4);
            if (mm_zz == 0 || mm_zz == 1) {
                InvalidateRect(hDlg, NULL, false);
            }
            break;
        }
        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;
}
アニメーションGifのような動きができました。
次に、背景に画像を追加
細かいソース追加はここでは省略。
背景の表示は、WM_NCPAINTでやってみる。
    case WM_NCPAINT:
        mm_hdc = GetDC(hDlg);
        RECT rect;
        GetClientRect(hDlg, &rect);
        BitBlt(mm_hdc, 0, 0, mm_bitmap3.bmWidth, mm_bitmap3.bmHeight, mm_hdc3, 0, 0, SRCCOPY);
        ReleaseDC(hDlg, mm_hdc);
        break;
おかしい、背景が表示されない。
その前に、サイズ変更できるように、プロパティを変更
おお、サイズ変更すれば、現れた?
    case WM_ERASEBKGND:
        return 1;
これを、入れると初めから、背景が表示されるようになった。







Top