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 次