1

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

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);
        }
4

1 回答 1

1

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

要修复它,请更改坐标:

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

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

于 2013-01-04T08:51:58.890 回答