0から始めるVisualStudio2022:ソフト開発塾

前回のつづきで
画像を拡大してみる。
背景の画像を拡大(2倍)で表示する。
その場合、拡大表示する方法(場所)としては
 1.WM_PAINT は、そのままで、初期化 WM_INITDIALOG (WM_CREATE) などで、拡大(2倍)したBMPを用意しておく。
 2.WM_PAINT で、拡大(2倍)する。
1.2.共に拡大するには、StretchBlt を、使用する。
1.の具体的ソース
    case WM_INITDIALOG:
        mm_hbitmap1 = LoadBitmapA(g_hInst, MAKEINTRESOURCEA(IDB_BITMAP1));
        mm_hbitmap2 = LoadBitmapA(g_hInst, MAKEINTRESOURCEA(IDB_BITMAP2));
        
        rc = GetObject(mm_hbitmap1, sizeof(BITMAP), &mm_bitmap1);
        rc = GetObject(mm_hbitmap2, sizeof(BITMAP), &mm_bitmap2);
        mm_hdc1 = CreateCompatibleDC(NULL);
        mm_hdc2 = CreateCompatibleDC(NULL);
        mm_hdc3 = CreateCompatibleDC(NULL);
        obj = SelectObject(mm_hdc1, mm_hbitmap1);
        //obj = SelectObject(mm_hdc2, mm_hbitmap2);
        obj = SelectObject(mm_hdc3, mm_hbitmap2);

        mm_hbitmap3 = CreateCompatibleBitmap(mm_hdc3, mm_bitmap2.bmWidth * 2, mm_bitmap2.bmHeight * 2);
        obj = SelectObject(mm_hdc2, mm_hbitmap3);

        //関数が失敗した場合は、0 を返します。
        rc = StretchBlt(mm_hdc2, 0, 0, mm_bitmap2.bmWidth * 2, mm_bitmap2.bmHeight * 2, mm_hdc3, 0, 0, mm_bitmap2.bmWidth, mm_bitmap2.bmHeight, SRCCOPY);

        //SetTimer(hDlg, IDT_TIMER1, 1000 / 4, (TIMERPROC)NULL);
        break;
2.の具体的ソース
    case WM_PAINT:
        cross_cursor(hDlg, 1);
        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);
        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);
        //関数が失敗した場合は、0 を返します。
	// 単純に元データを1/2するだけでは、奇数の場合の誤差で、問題あり
        //rc = StretchBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, mm_xx, mm_yy, mm_hdc2, (mm_scroll_bar_x + ps.rcPaint.left)/2, (mm_scroll_bar_y + ps.rcPaint.top)/2, mm_xx/2, mm_yy/2, SRCCOPY);
        int mm_x0, mm_y0;
        mm_x0 = ps.rcPaint.left - (ps.rcPaint.left % 2);
        mm_y0 = ps.rcPaint.top - (ps.rcPaint.top % 2);
        mm_xx += (ps.rcPaint.left % 2);
        mm_xx += (mm_xx % 2);
        mm_yy += (ps.rcPaint.top % 2);
        mm_yy += (mm_yy % 2);
        rc = StretchBlt(ps.hdc, mm_x0, mm_y0, mm_xx, mm_yy, mm_hdc2, (mm_scroll_bar_x + ps.rcPaint.left) / 2, (mm_scroll_bar_y + ps.rcPaint.top) / 2, mm_xx / 2, mm_yy / 2, 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);
        cross_cursor(hDlg, 2);
        break;
当然。1.2.の両方を行うと4倍になる。また1.の場合と2.の場合の2倍でもスクロースの設定は変更する必要がある。
    case WM_SIZE:
    {
        cross_cursor(hDlg, 1);
        static  int  mm_size_mode = 0;
        if (mm_size_mode)    break;
        mm_size_mode = 1;
        int mm_size_x;
        int mm_size_y;

        mm_size_x = LOWORD(lPara);
        mm_size_y = HIWORD(lPara);

        //if (mm_bitmap2.bmWidth > mm_size_x) {
            //mm_max_bar_x = mm_bitmap2.bmWidth - mm_size_x;
        //if (mm_bitmap2.bmWidth * 2 > mm_size_x) {
            //mm_max_bar_x = mm_bitmap2.bmWidth * 2 - mm_size_x;
        if (mm_bitmap2.bmWidth * 4 > mm_size_x) {
            mm_max_bar_x = mm_bitmap2.bmWidth * 4 - 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.nMax = mm_bitmap2.bmWidth * 2;
        si.nMax = mm_bitmap2.bmWidth * 4;
        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;
        //if (mm_bitmap2.bmHeight * 2 > mm_size_y) {
            //mm_max_bar_y = mm_bitmap2.bmHeight * 2 - mm_size_y;
        if (mm_bitmap2.bmHeight * 4 > mm_size_y) {
            mm_max_bar_y = mm_bitmap2.bmHeight * 4 - 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.nMax = mm_bitmap2.bmHeight * 2;
        si.nMax = mm_bitmap2.bmHeight * 4;
        si.nPage = mm_size_y;
        si.nPos = mm_scroll_bar_y;
        SetScrollInfo(hDlg, SB_VERT, &si, TRUE);

        mm_size_mode = 0;
        break;
    }









Top