0から始めるVisualStudio2022:ソフト開発塾
前回からの続き
でも、Dialog003 から Dialog004 にコピーする。(.cpp .rc .vcxproj resource.h)
ファイル名も Dialog003 から Dialog004 に変更。(.cpp .rc .vcxproj)
スクロールバーの対応
https://learn.microsoft.com/ja-jp/windows/win32/controls/scroll-a-bitmap-in-scroll-bars
を、参考に
dialog004.cpp のソースは以下の通り
#include <windows.h>
HINSTANCE g_hInst;
BOOL CALLBACK MyDlgProc(
HWND hDlg,
UINT msg,
WPARAM wPara,
LPARAM lPara
) {
static HBITMAP mm_hbitmap;
static BITMAP mm_bitmap;
static HDC mm_hdc_bitmap;
static int mm_scroll_bar_x;
static int mm_scroll_bar_y;
static int mm_max_bar_x;
static int mm_max_bar_y;
HDC hdc;
PAINTSTRUCT ps;
SCROLLINFO si;
switch (msg) {
case WM_INITDIALOG:
mm_hbitmap = LoadBitmapA(g_hInst,"BITMAP_FILENAME");
GetObject(mm_hbitmap, sizeof(BITMAP), &mm_bitmap);
mm_hdc_bitmap = CreateCompatibleDC(NULL);
SelectObject(mm_hdc_bitmap, mm_hbitmap);
break;
case WM_SIZE:
{
int mm_size_x;
int mm_size_y;
mm_size_x = LOWORD(lPara);
mm_size_y = HIWORD(lPara);
if (mm_bitmap.bmWidth > mm_size_x) {
mm_max_bar_x = mm_bitmap.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_bitmap.bmWidth;
si.nPage = mm_size_x;
si.nPos = mm_scroll_bar_x;
SetScrollInfo(hDlg, SB_HORZ, &si, TRUE);
if (mm_bitmap.bmHeight > mm_size_y) {
mm_max_bar_y = mm_bitmap.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_bitmap.bmHeight;
si.nPage = mm_size_y;
si.nPos = mm_scroll_bar_y;
SetScrollInfo(hDlg, SB_VERT, &si, TRUE);
break;
}
case WM_PAINT:
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_hdc_bitmap, mm_scroll_bar_x+ ps.rcPaint.left, mm_scroll_bar_y + ps.rcPaint.top, SRCCOPY);
EndPaint(hDlg, &ps);
break;
case WM_HSCROLL:
{
int mm_sub_bar;
int mm_new;
switch (LOWORD(wPara)) {
case SB_PAGEUP:
mm_new = mm_scroll_bar_x - 50;
break;
case SB_PAGEDOWN:
mm_new = mm_scroll_bar_x + 50;
break;
case SB_LINEUP:
mm_new = mm_scroll_bar_x - 5;
break;
case SB_LINEDOWN:
mm_new = mm_scroll_bar_x + 5;
break;
case SB_THUMBPOSITION:
mm_new = HIWORD(wPara);
break;
default:
mm_new = mm_scroll_bar_x;
}
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;
int mm_new;
switch (LOWORD(wPara)) {
case SB_PAGEUP:
mm_new = mm_scroll_bar_y - 50;
break;
case SB_PAGEDOWN:
mm_new = mm_scroll_bar_y + 50;
break;
case SB_LINEUP:
mm_new = mm_scroll_bar_y - 5;
break;
case SB_LINEDOWN:
mm_new = mm_scroll_bar_y + 5;
break;
case SB_THUMBPOSITION:
mm_new = HIWORD(wPara);
break;
default:
mm_new = mm_scroll_bar_y;
}
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_DESTROY:
DeleteDC(mm_hdc_bitmap);
DeleteObject(mm_hbitmap);
break;
case WM_CLOSE:
EndDialog(hDlg, IDCANCEL);
return TRUE;
return FALSE;
case WM_RBUTTONDOWN:
EndDialog(hDlg, IDCANCEL);
return TRUE;
}
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 次