gpt4 book ai didi

c++ - 帮助双缓冲

转载 作者:太空狗 更新时间:2023-10-29 23:47:52 24 4
gpt4 key购买 nike

我创建了一个效果很好的动画,但它会闪烁。我需要有关双缓冲的帮助,因为我对此一无所知。

这是我的 onPaint() 中的代码:

VOID onPaint(HDC hdc)
{
Graphics graphics(hdc);
Pen pen(Color(255, 0, 0, 255));
graphics.DrawEllipse(&pen, sf , 0, 10, 10);
}

它工作正常但有闪烁。我试过这段代码,但没有用:

VOID onPaint(HDC hdc,HWND hWnd)
{
HDC hDC=GetDC(hWnd);;
HDC memDC = CreateCompatibleDC(hDC);
HBITMAP hMemBmp = CreateCompatibleBitmap(hDC,10,10);
HBITMAP hOldBmp = (HBITMAP)SelectObject(memDC,hMemBmp);
BitBlt(hDC, 0, 0, 10, 10, memDC, 0, 0, SRCCOPY);
Graphics graphics(memDC);
Pen pen(Color(255, 0, 0, 255));
graphics.DrawEllipse(&pen, sf , 0, 10, 10);

// Always select the old bitmap back into the device context
SelectObject(memDC, hOldBmp);
DeleteObject(hMemBmp);
DeleteDC(memDC);
}

最佳答案

看起来您只是过早地将屏幕外 DC 复制到显示器。尝试将对 BitBlt 的调用向下移动四行,使其成为开始清理之前的最后一行,如下所示:

VOID onPaint(HDC hdc,HWND hWnd)
{
// this line looks a little odd :
HDC hDC = GetDC(hWnd);
// .. usually the hdc parameter passed to onPaint would already refer to
// the on-screen DC that windows wants updated. Also worth noting is that
// when you use GetDC(), you should have a matching ReleaseDC()
// As a quick test, you might just replace the above line with
// HDC hDC = hdc;

HDC memDC = CreateCompatibleDC(hDC);
HBITMAP hMemBmp = CreateCompatibleBitmap(hDC,10,10);
HBITMAP hOldBmp = (HBITMAP)SelectObject(memDC,hMemBmp);

// draw to the off-screen map ..
Graphics graphics(memDC);
Pen pen(Color(255, 0, 0, 255));
graphics.DrawEllipse(&pen, sf , 0, 10, 10);

// now that you've drawn on the offscreen map, go ahead
// and put it on screen.
BitBlt(hDC, 0, 0, 10, 10, memDC, 0, 0, SRCCOPY);

// Always select the old bitmap back into the device context
SelectObject(memDC, hOldBmp);
DeleteObject(hMemBmp);
DeleteDC(memDC);
}

关于此代码的另一件事是,您已将常量“10”作为屏幕外位图的宽度和高度传递,并将其用于执行复制的 BitBlt() 的宽度和高度参数.有可能正在更新的窗口客户区比这大得多。 “黑色方 block ”是将 10x10 屏幕外 map block 化到窗口客户区的结果。您可以尝试使用另一个 GDI 函数来获取屏幕位图的尺寸,而不是在那里硬编码 10,或者至少您可以 #define 宽度和高度值,并在参数中使用它们。

杀死你的另一件事可能是“graphics.DrawEllipse(&pen, sf , 0, 10, 10)”行中的 'sf' -- 因为你已经创建了一个非常小的 10x10 map ,如果值'sf' 是 0..10 之外的任何值,DrawEllipse() 调用会将椭圆完全放置在屏幕外 map 的可用像素之外。

所以,最重要的是,您可能希望使离屏映射与窗口客户区的大小相同,并确保将 BitBlt() 调用向下移动,以便它发生在离屏上的所有绘图操作之后 map 。

关于c++ - 帮助双缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3453970/

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