双缓冲画图

Win32API方式

头文件里定义:

//双缓存 
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);


MFC方式:

例子可能特殊了一点,不过应该能看明白。双缓冲当然需要一个缓冲DC,如果你要画的东西总需要固定的背景(比如图片)的话,可能还需要一个背景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);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值