| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 489 人关注过本帖
标题:关于双缓冲问题
收藏  订阅  推荐  打印 
gao_gao86
Rank: 1
等级:新手上路
帖子:25
积分:350
注册:2007-3-3
关于双缓冲问题

我用MFC写了一个简单的五子棋界面,但是一拖屏幕的话窗口中的画面就会闪动,于是我用双缓冲来改写了OnPaint,
但是结果还是老样子。不知道问题出在哪里。这种现象是否和屏幕或者显卡有关系? 希望高手能指点迷津。小弟不胜感激!
OnPaint的代码如下
void CChildView::OnPaint()
{
CRect rect;
GetWindowRect(&rect);

CPaintDC pDC(this);

CBitmap bmp;
CDC MemDC;

MemDC.CreateCompatibleDC(&pDC);
bmp.CreateCompatibleBitmap(&pDC,rect.Width(),rect.Height());

MemDC.SelectObject(&bmp);
MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(192.,192,192));
DrawBoard(&MemDC);
pDC.BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
MemDC.DeleteDC();
bmp.DeleteObject();
}

BOOL CChildView::OnEraseBkgnd(CDC *pDC)
{
return TRUE;
}
另外我重载了OnEraseBkgnd直接返回TRUE
请问这里面有问题吗?

搜索更多相关主题的帖子: 五子棋  pDC  缓冲  OnPaint  CDC  
2007-8-3 16:18
radcat
Rank: 3Rank: 3
等级:中级会员
威望:8
帖子:290
积分:3102
注册:2006-9-12

把代码改到OnEraseBkgnd里试试

2007-8-4 09:51
gao_gao86
Rank: 1
等级:新手上路
帖子:25
积分:350
注册:2007-3-3
回复:(radcat)把代码改到OnEraseBkgnd里试试

OnEraseBkgnd 函数里做的是什么工作啊? 不过我想 重画的话也只是重画视图里的东西 为什么我窗口上的菜单栏也会一起闪呢 ?
2007-8-5 17:06
maoguoqing
Rank: 12Rank: 12Rank: 12
来自:重庆
等级:贵宾
威望:26
帖子:2938
积分:29761
注册:2005-12-5

那就有问题了,建议把显卡的驱动重新安装一遍


天行健,君子以自强不息!!
2007-8-5 19:20
眼底星空
Rank: 2
等级:注册会员
威望:1
帖子:52
积分:624
注册:2006-9-2

OnEraseBkgnd就这样没问题
GetWindowRect是不是要用GetClientRect啊
觉得应该在OnDraw里写,直接用OnDraw参数中的CDC生成内存CDC
试试看吧


无为而为 && 每天进步一小点...
2007-8-10 17:08
maoguoqing
Rank: 12Rank: 12Rank: 12
来自:重庆
等级:贵宾
威望:26
帖子:2938
积分:29761
注册:2005-12-5

在OnDraw里面写如果OnPaint不手动调用的话它是不会执行到OnDraw函数的
你可以设置个定时器,在定时器里面贴图,但是定时器里面不要Invalidate()

他那个rect不是确定位置的,是用来确定宽度和高度的,所以无关紧要。。


天行健,君子以自强不息!!
2007-8-11 12:37
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.052048 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved