0から始めるVisualStudio2022:ソフト開発塾
絵を動かす。
とりあえず、前回のにタイマをつけて位置指定を変えてみる。
新しいプロジェクトを選んで
検索にdialogを入力し前に作った、テンプレートを選んで作成
前回のソースなどをコピーして
タイマを追加(参考)
ソースは
#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_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;
}
となる。
TransparentBlt の、第1、第2を変更すれば、表示位置が変わるはず。
やってみる。
変わらない。
SetTimerを忘れていた
SetTimer(hDlg, IDT_TIMER1, 1000 / 4, (TIMERPROC)NULL);
と
KillTimer(hDlg, IDT_TIMER1);
を追加。実行
思った動きじゃない。
WM_TIMERの処理を変更
case WM_TIMER:
switch (wPara) {
case IDT_TIMER1:
mm_zz = (++mm_zz % 48);
InvalidateRect(hDlg, NULL, false);
break;
}
break;
動いているが、ちょっとなぁ。
とりあえず、絵を2つにしてみる。
case WM_PAINT:
mm_hdc = BeginPaint(hDlg, &ps);
TransparentBlt(
ps.hdc, 0+ mm_zz, 0+ mm_zz, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
TransparentBlt(
ps.hdc, 48*2 - mm_zz, 48 + mm_zz, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
EndPaint(hDlg, &ps);
break;
背景の写真が、消えている。
WM_PAINT に、背景画像を再度表示する。
絵を4つにしてみる
case WM_PAINT:
mm_hdc = BeginPaint(hDlg, &ps);
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);
TransparentBlt(
ps.hdc, 0+ mm_zz, 0+ mm_zz, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
TransparentBlt(
ps.hdc, 48*2 - mm_zz, 48 + mm_zz, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
TransparentBlt(
ps.hdc, 0 + mm_zz, 48*3 - mm_zz, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
TransparentBlt(
ps.hdc, 48 * 3 - mm_zz*2, 48*3 - mm_zz, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
EndPaint(hDlg, &ps);
break;
スクロールバーも入れた、最終ソースは
#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;
static int mm_scroll_bar_x;
static int mm_scroll_bar_y;
static int mm_max_bar_x;
static int mm_max_bar_y;
SCROLLINFO si;
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);
SetTimer(hDlg, IDT_TIMER1, 1000 / 4, (TIMERPROC)NULL);
break;
case WM_DESTROY:
KillTimer(hDlg, IDT_TIMER1);
DeleteDC(mm_hdc2);
DeleteDC(mm_hdc1);
DeleteObject(mm_hbitmap2);
DeleteObject(mm_hbitmap1);
break;
//case WM_NCPAINT:
//mm_hdc = GetDC(hDlg);
////RECT rect;
////GetClientRect(hDlg, &rect);
////FillRect(mm_hdc, &rect, (HBRUSH)(COLOR_WINDOW + 1));
////FillRect(mm_hdc, &rect, (HBRUSH)(COLOR_BACKGROUND + 1));
//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);
int mm_xx, mm_yy;
mm_xx = ps.rcPaint.right - ps.rcPaint.left;
mm_yy = ps.rcPaint.bottom - ps.rcPaint.top;
BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, mm_xx, mm_yy, mm_hdc2, mm_scroll_bar_x + ps.rcPaint.left, mm_scroll_bar_y + ps.rcPaint.top, SRCCOPY);
TransparentBlt(
ps.hdc, 0+ mm_zz - mm_scroll_bar_x, 0+ mm_zz- mm_scroll_bar_y, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
TransparentBlt(
ps.hdc, 48*2 - mm_zz - mm_scroll_bar_x, 48 + mm_zz - mm_scroll_bar_y, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
TransparentBlt(
ps.hdc, 0 + mm_zz - mm_scroll_bar_x, 48*3 - mm_zz - mm_scroll_bar_y, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight,
mm_hdc1, 0, 0, mm_bitmap1.bmWidth, mm_bitmap1.bmHeight, RGB(255, 0, 255));
TransparentBlt(
ps.hdc, 48 * 3 - mm_zz*2 - mm_scroll_bar_x, 48*3 - mm_zz - mm_scroll_bar_y, 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_TIMER:
switch (wPara) {
case IDT_TIMER1:
mm_zz = (++mm_zz % 48);
InvalidateRect(hDlg, NULL, false);
break;
}
break;
case WM_SIZE:
{
int mm_size_x;
int mm_size_y;
mm_size_x = LOWORD(lPara);
mm_size_y = HIWORD(lPara);
//if (fBlt) fSize = TRUE;
if (mm_bitmap2.bmWidth > mm_size_x) {
mm_max_bar_x = mm_bitmap2.bmWidth - mm_size_x;
}
else {
mm_max_bar_x = 0;
}
if (mm_scroll_bar_x > mm_max_bar_x) {
mm_scroll_bar_x = mm_max_bar_x;
}
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
si.nMin = 0;
si.nMax = mm_bitmap2.bmWidth;
si.nPage = mm_size_x;
si.nPos = mm_scroll_bar_x;
SetScrollInfo(hDlg, SB_HORZ, &si, TRUE);
if (mm_bitmap2.bmHeight > mm_size_y) {
mm_max_bar_y = mm_bitmap2.bmHeight - mm_size_y;
}
else {
mm_max_bar_y = 0;
}
if (mm_scroll_bar_y > mm_max_bar_y) {
mm_scroll_bar_y = mm_max_bar_y;
}
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
si.nMin = 0;
si.nMax = mm_bitmap2.bmHeight;
si.nPage = mm_size_y;
si.nPos = mm_scroll_bar_y;
SetScrollInfo(hDlg, SB_VERT, &si, TRUE);
break;
}
case WM_HSCROLL:
{
int mm_sub_bar;
int mm_new;
switch (LOWORD(wPara)) {
case SB_PAGEUP:
mm_new = mm_scroll_bar_x - 4;
break;
case SB_PAGEDOWN:
mm_new = mm_scroll_bar_x + 4;
break;
case SB_LINEUP:
mm_new = mm_scroll_bar_x - 1;
break;
case SB_LINEDOWN:
mm_new = mm_scroll_bar_x + 1;
break;
case SB_THUMBPOSITION:
mm_new = HIWORD(wPara);
break;
default:
mm_new = mm_scroll_bar_x;
}
if (mm_new < 0) mm_new = 0;
if (mm_new > mm_max_bar_x) mm_new = mm_max_bar_x;
if (mm_new == mm_scroll_bar_x) break;
mm_sub_bar = mm_new - mm_scroll_bar_x;
mm_scroll_bar_x = mm_new;
ScrollWindowEx(hDlg, -mm_sub_bar, 0, (CONST RECT*) NULL, (CONST RECT*) NULL, (HRGN)NULL, (PRECT)NULL, SW_INVALIDATE);
si.cbSize = sizeof(si);
si.fMask = SIF_POS;
si.nPos = mm_scroll_bar_x;
SetScrollInfo(hDlg, SB_HORZ, &si, TRUE);
break;
}
case WM_VSCROLL:
{
int mm_sub_bar;//yDelta; // yDelta = new_pos - current_pos
int mm_new; //yNewPos; // new position
switch (LOWORD(wPara)) {
case SB_PAGEUP:
mm_new = mm_scroll_bar_y - 4;
break;
case SB_PAGEDOWN:
mm_new = mm_scroll_bar_y + 4;
break;
case SB_LINEUP:
mm_new = mm_scroll_bar_y - 1;
break;
case SB_LINEDOWN:
mm_new = mm_scroll_bar_y + 1;
break;
case SB_THUMBPOSITION:
mm_new = HIWORD(wPara);
break;
default:
mm_new = mm_scroll_bar_y;
}
if (mm_new < 0) mm_new = 0;
if (mm_new > mm_max_bar_y) mm_new = mm_max_bar_y;
if (mm_new == mm_scroll_bar_y) break;
mm_sub_bar = mm_new - mm_scroll_bar_y;
mm_scroll_bar_y = mm_new;
ScrollWindowEx(hDlg, 0, -mm_sub_bar, (CONST RECT*) NULL, (CONST RECT*) NULL, (HRGN)NULL, (PRECT)NULL, SW_INVALIDATE);
si.cbSize = sizeof(si);
si.fMask = SIF_POS;
si.nPos = mm_scroll_bar_y;
SetScrollInfo(hDlg, SB_VERT, &si, TRUE);
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;
}
こんな感じ。
つづく
Top 次