C++-C++ API使用双缓存绘制窗口

C++-C++ API使用双缓存绘制窗口

夜无邪 发布于 2017-07-07 字数 475 浏览 1369 回复 3

在使用GUI的时候,如果不使用双缓存,屏幕就会闪烁,我想问一问大家是怎么实现双缓存的?我觉得我的方法在效率方面很低。。。

HWND hwnd;

HDC hdc; //DC
HDC bghdc; //缓存DC

void Draw()
{
hdc = GetDC(hwnd);
bghdc = CreateCompatibleDC(hdc);

//此处为绘制内容

BitBlt (hdc, 0, 0, 800, 600, bghdc, 0, 0, SRCCOPY);
DeleteDC(bghdc);
ReleaseDC(hwnd, hdc);
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晚风撩人 2017-10-08 3 楼

理论上确实应该这样实现,的问题确实也是许多windows客户端存在的绘制效率低下,应运而生的解决方案就是搭建一套无窗口的皮肤框架,所有的控件都是在form(dialog)上绘制。贴上一段form绘制代码:
CGuiMemDC dcMemory(&dc, rcClip);

::OffsetRgn(hClipRgn, -rcClip.left, -rcClip.top);
::ExtSelectClipRgn(dcMemory.GetSafeHdc(), hClipRgn, RGN_COPY);

Render(&dcMemory, &rcClip); //关键绘制所有子控件的的递归发起函数

偏爱自由 2017-09-27 2 楼

如果每次画的图不同, 你肯定要这样, 因为你必须要画图, 画在哪个dc上都是要画的, 而如果有些东西不变, 你就可以先放在内存dc中存起来, 用的时候直接贴上,比如:

HWND hwnd = NULL;

HDC bghdc = NULL; //缓存DC

bool InitMemDC(HDC hdc)
{
if(hMemDc != NULL) return true;
bghdc = CreateCompatibleDC(hdc);
//此处为绘制内容
}
void Draw()
{
HDC hdc = GetDC(hwnd);
if(bghdc != NULL) InitMemDC(hdc);
BitBlt (hdc, 0, 0, 800, 600, bghdc, 0, 0, SRCCOPY);
ReleaseDC(hwnd, hdc);
}

瑾兮 2017-08-30 1 楼

楼主的应该是基于传统的带 HWND 句柄的窗体绘制,所说的技术属于是 DirectUI,确切的说是 WindowLess 技术,单纯用双缓冲的话没有必要使用这些东西,自己实现起来很痛苦的,简单就好,楼主的方法就可以,一般的双缓冲都是要不断的创建和销毁的,因为DC在OnPaint的时候每次都是不同的,重复的创建和销毁不存在什么效率低下的问题,或者说问题不大,如果还要在此基础上提升绘图效率的话,可以考虑用脏矩形的方法来绘制,简单的说就是只绘制那些变化了的Rect,其他的不绘制,具体细节可参考 http://as3.iteye.com/blog/771220,以及云风的 Demo,http://blog.codingnow.com/cloud/DirtyRect