【问题标题】:Double Buffering and Viewport Origin?双缓冲和视口原点?
【发布时间】:2012-12-18 16:24:20
【问题描述】:

我想把原点放在中间,所以我做了:

SetViewportOrgEx(hdc,width/2,height/2,NULL);

(如下代码所示)

现在,在实施双缓冲后,它似乎无法正常工作。任何想法为什么以及什么应该是这里的最佳实践?非常感谢

代码如下:

case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code here...
            RECT rect;
            GetClientRect(hWnd, &rect);
            int width=rect.right;
            int height=rect.bottom;

                    //Changing Origin position
            SetViewportOrgEx(hdc,width/2,height/2,NULL);


            HDC backbuffDC = CreateCompatibleDC(hdc);

            HBITMAP backbuffer = CreateCompatibleBitmap( hdc, width, height);

            int savedDC = SaveDC(backbuffDC);
            SelectObject( backbuffDC, backbuffer );
            HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255));
            FillRect(backbuffDC,&rect,hBrush);
            DeleteObject(hBrush);

                    //Drawing on backbuffDC


            BitBlt(hdc,0,0,width,height,backbuffDC,0,0,SRCCOPY);
            RestoreDC(backbuffDC,savedDC);
            DeleteObject(backbuffer);
            DeleteDC(backbuffDC);
            EndPaint(hWnd, &ps);
        }

【问题讨论】:

  • 我猜你的BitBlt 正试图从中心到屏幕外的某个地方。确保进行错误检查并确保调用时一切都成功。

标签: c++ gdi win32gui


【解决方案1】:

由于您更改了视口原点,因此您必须确保相应地更新坐标。对于BitBlt,您现在将(width/2, height/2) 作为左上角,width 作为宽度,height 作为高度。这会导致在设备上下文的一半区域内出现 blit,这最终会导致目标设备上下文中的部分显示为这样,而其余部分则被剪裁。

要修复它,请更改坐标:

BitBlt(hdc,-width/2,-height/2,width,height,backbuffDC,0,0,SRCCOPY);

其次,我自己不确定这个,但请确保将有效坐标传递给FillRect。您传递的检索坐标与设备上下文及其视口无关,因此可能也必须对其进行转换。

【讨论】:

  • 这是一张图片来显示发生了什么:i48.tinypic.com/k1sz20.jpg 这样做,已将其转换为默认行为,即左上角的原点。我现在用 FillRect 将它涂成红色,这样你就可以看到它是如何工作的。
  • @user1788175,你有一个之前的变化方便吗?看起来好像它使用 (0,0) 作为后缓冲 dc 的中心,它的视口没有改变,或者BitBlt 将所有坐标视为目标 DC 的坐标。我没有更改坐标系,所以我没有经验可以借鉴。
猜你喜欢
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多