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