繁体   English   中英

双重缓冲和视口原点?

[英]Double Buffering and Viewport Origin?

我想将原点放在中心,所以我做了:

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的情况下,您现在传递(width/2, height/2)作为左上角, width作为宽度, height作为高度。 这会导致到设备上下文一半以外的区域变亮,这最终将导致目标设备上下文中的部分照此显示,其余部分被剪切。

要解决此问题,请更改坐标:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM