读书人

双徐统画图

发布时间: 2012-09-14 11:53:44 作者: rapoo

双缓统画图

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);


读书人网 >编程

热点推荐