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 次