gpt4 book ai didi

c++ - 双缓冲和视口(viewport)原点?

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:54 25 4
gpt4 key购买 nike

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

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

最佳答案

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

要修复它,请更改坐标:

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

其次,我自己对此并不确定,但请确保将有效坐标传递给 FillRect。您传递的检索坐标独立于设备上下文及其视口(viewport),因此也可能需要转换这些坐标。

关于c++ - 双缓冲和视口(viewport)原点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14153618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com