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