50分求教MFC对话框中双缓冲绘图避免闪烁的问题
我刚学MFC,在用对话框显示一个小动画。但用了定时器显示的时候总是闪烁。想请教一下老手,如何利用双缓冲来实现无闪烁绘图。另外,我以前学过WIN32API编程,在那个环境下...
我刚学MFC,在用对话框显示一个小动画。但用了定时器显示的时候总是闪烁。
想请教一下老手,如何利用双缓冲来实现无闪烁绘图。
另外,我以前学过WIN32API编程,在那个环境下我会用双缓冲绘图,但MFC应该不能直接如法炮制吧。
在网上看人家发过贴说过重载OnPaint()函数,具体怎么实现,求教!!
最好有实例代码,这个应该不长吧!多谢了!! 展开
想请教一下老手,如何利用双缓冲来实现无闪烁绘图。
另外,我以前学过WIN32API编程,在那个环境下我会用双缓冲绘图,但MFC应该不能直接如法炮制吧。
在网上看人家发过贴说过重载OnPaint()函数,具体怎么实现,求教!!
最好有实例代码,这个应该不长吧!多谢了!! 展开
2个回答
展开全部
楼上回答的仍然是Win32API实现的双缓冲,我来给个用MFC实现的。例子可能特殊了一点,不过应该能看明白。双缓冲当然需要一个缓冲C,如果你要画的东西总需要固定的背景(比如图片)的话,可能还需要一个背景DC:
在窗口类的声明中,即头文件中:
CDC m_dcMem,m_dcBack; //缓冲DC和背景DC
在窗口类的实现,即CPP文件中:
在OnInitDialog或者OnCreate里初始化两个DC,以下的m_nWidth和m_nHeight之类的变量肯定要换成你自己的:
m_dcMem.CreateCompatibleDC(GetDC());
m_dcBack.CreateCompatibleDC(GetDC());
CBitmap tmp,tmpp;
tmp.CreateCompatibleBitmap(GetDC(), m_nWidth, m_nHeight);
tmpp.CreateCompatibleBitmap(GetDC(), m_nWidth, m_nHeight);
m_dcBack.SelectObject(&tmp);
m_dcMem.SelectObject(&tmpp);
tmp.DeleteObject();
tmpp.DeleteObject();
然后每次先把背景DC画到缓冲DC上:
m_dcMem.BitBlt(0, 0, m_nWidth, m_nHeight, &m_dcBack, 0, 0, SRCCOPY);
然后再画自己的东西
m_dcMem.XXXXXX
(如果不需要背景DC,则直接把内容画到缓冲DC上)
最后记得在OnPaint里将缓冲DC画到实际的窗口上:
GetDC()->BitBlt(m_nLeft, m_nTop, m_nWidth, m_nHeight, &m_dcMem, 0, 0, SRCCOPY);
在窗口类的声明中,即头文件中:
CDC m_dcMem,m_dcBack; //缓冲DC和背景DC
在窗口类的实现,即CPP文件中:
在OnInitDialog或者OnCreate里初始化两个DC,以下的m_nWidth和m_nHeight之类的变量肯定要换成你自己的:
m_dcMem.CreateCompatibleDC(GetDC());
m_dcBack.CreateCompatibleDC(GetDC());
CBitmap tmp,tmpp;
tmp.CreateCompatibleBitmap(GetDC(), m_nWidth, m_nHeight);
tmpp.CreateCompatibleBitmap(GetDC(), m_nWidth, m_nHeight);
m_dcBack.SelectObject(&tmp);
m_dcMem.SelectObject(&tmpp);
tmp.DeleteObject();
tmpp.DeleteObject();
然后每次先把背景DC画到缓冲DC上:
m_dcMem.BitBlt(0, 0, m_nWidth, m_nHeight, &m_dcBack, 0, 0, SRCCOPY);
然后再画自己的东西
m_dcMem.XXXXXX
(如果不需要背景DC,则直接把内容画到缓冲DC上)
最后记得在OnPaint里将缓冲DC画到实际的窗口上:
GetDC()->BitBlt(m_nLeft, m_nTop, m_nWidth, m_nHeight, &m_dcMem, 0, 0, SRCCOPY);
微测检测5.10
2023-05-10 广告
2023-05-10 广告
您好!建议咨 深圳市微测检测有限公司,已建立起十余个专业实验室,企业通过微测检测就可以获得一站式的测试与认 证解决方案;(EMC、RF、MFi、BQB、QI、USB、安全、锂电池、快充、汽车电子EMC、汽车手机互 联、语音通话质量),认证遇...
点击进入详情页
本回答由微测检测5.10提供
展开全部
头文件里定义:
//双缓存
HDC m_MemDC;
HBITMAP m_hbitMap;//背景图片
HBRUSH m_bkBrush;
在onpaint函数里这样写:记得把hdc换成你paint里的dc.hdc,这里我懒得改了.拷我写的程序,你应该可以改的过来.
m_MemDC = ::CreateCompatibleDC(hdc);
m_hbitMap = ::CreateCompatibleBitmap(hdc,1024,768);
::SelectObject(m_MemDC,m_hbitMap);
m_bkBrush = ::CreateSolidBrush(RGB(150,150,150));
RECT rc ={0,0,1024,768};
::FillRect(m_MemDC,&rc,m_bkBrush);
//这里用m_MemDC绘制你的东西.
//
::BitBlt(hdc,0, 0, 1024, 768, m_MemDC, 0, 0, SRCCOPY);
//双缓存
HDC m_MemDC;
HBITMAP m_hbitMap;//背景图片
HBRUSH m_bkBrush;
在onpaint函数里这样写:记得把hdc换成你paint里的dc.hdc,这里我懒得改了.拷我写的程序,你应该可以改的过来.
m_MemDC = ::CreateCompatibleDC(hdc);
m_hbitMap = ::CreateCompatibleBitmap(hdc,1024,768);
::SelectObject(m_MemDC,m_hbitMap);
m_bkBrush = ::CreateSolidBrush(RGB(150,150,150));
RECT rc ={0,0,1024,768};
::FillRect(m_MemDC,&rc,m_bkBrush);
//这里用m_MemDC绘制你的东西.
//
::BitBlt(hdc,0, 0, 1024, 768, m_MemDC, 0, 0, SRCCOPY);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询