我想把原点放在中心,所以我做了:
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);
}
答案 0 :(得分:1)
由于您更改了视口原点,因此必须确保相应地更新坐标。在BitBlt
的情况下,您现在将(width/2, height/2)
作为左上角,width
作为宽度,height
作为高度。这会导致对设备上下文的一半区域的blit,这最终会导致目标设备上下文中的部分被显示,并且其余部分将被剪切。
要修复它,请更改坐标:
BitBlt(hdc,-width/2,-height/2,width,height,backbuffDC,0,0,SRCCOPY);
其次,我自己并不确定这个,但请确保有效坐标传递给FillRect
。您传递的内容是独立于设备上下文及其视口的检索坐标,因此也可能需要对这些坐标进行转换。