MFC双缓冲绘图
原理呢转一下别人的,重点在后面的画布类——MFC双缓冲绘图
——————————————————————————
BOOL
CDataStructureView::OnEraseBkgnd(CDC* pDC)
{
CRect rc;
CDC dcMem;
GetClientRect(&rc);
CBitmap bmp;
//内存中承载临时图象的位图
dcMem.CreateCompatibleDC(pDC);
//依附窗口DC创建兼容内存DC
//创建兼容位图(必须用pDC创建,否则画出的图形变成黑色)
bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
CBitmap *pOldBit=dcMem.SelectObject(&bmp);
//按原来背景填充客户区,不然会是黑色
dcMen.FillSolidRect(rc,RGB(255,255,255))
//画图,添加你要画图的代码,不过用dcMem画,而不是pDC;
......
pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);
//将内存DC上的图象拷贝到前台
//绘图完成后的清理
dcMem.DeleteDC();
//删除DC
bmp.DeleteObject();
//删除位图
return
true
;
//这里一定要用return true,如果用自动生成的,会调用基类,把画出来的覆盖,就什 么结果也没有了
|
}
|
class CCanvas
{
public:
CCanvas();
virtual ~CCanvas();
void Create(CDC* a_pDC,CSize a_szSize){
Create(a_pDC,a_szSize.cx,a_szSize.cy);
}
// 创建画布
void Create(CDC* a_pDC,const int a_iWidth,const int a_iHeight){
m_dcMem.CreateCompatibleDC(a_pDC);
m_bit.CreateCompatibleBitmap(a_pDC,a_iWidth,a_iHeight);
m_bitOld=m_dcMem.SelectObject(&m_bit);
m_iWidth=a_iWidth;
m_iHeight=a_iHeight;
}
void SetFilledRGB(COLORREF a_FilledRGB){ //Add by QLH
m_dcMem.FillSolidRect(0,0,m_iWidth,m_iHeight,a_FilledRGB); //用背景色填充位图,将位图清除干净
}
void Destroy(){
if(m_bitOld) {
m_dcMem.SelectObject(m_bitOld);
//m_dcMem.DeleteDC();
}
}
// 绘制图像到画布
void Draw(CBMP* a_pBMP,LPRECT a_rRect){
PaintDIB(m_dcMem,a_rRect,a_pBMP->GetHDIB(),a_pBMP->GetRect(),a_pBMP->GetPalette());
}
// 输出到设备
/*BOOLBitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop);
x:目标矩形区域的左上角x轴坐标点。
y:目标矩形区域的左上角y轴坐标点。
nWidth:在目标设备中绘制位图的宽度。
nHight:在目标设备中绘制位图的高度。
pSrcDC:源设备上下文对象指针。
xSrc:源设备上下文的起点x轴坐标,函数从该起点复制位图到目标设备。
ySrc:源设备上下文的起点y轴坐标,函数从该起点复制位图到目标设备。
*/
void OutToDC(CDC* a_pDC,LPRECT a_rRect,DWORD dwRop=SRCCOPY){
a_pDC->BitBlt(a_rRect->left,a_rRect->top,a_rRect->right-a_rRect->left,a_rRect->bottom-a_rRect->top,&m_dcMem,0,0,SRCCOPY);
}
void OutToDC(CDC * a_pDC,LPRECT a_rDesPos,int a_iSrcX,int a_iSrcY){
a_pDC->BitBlt(a_rDesPos->left,a_rDesPos->top,a_rDesPos->right-a_rDesPos->left,a_rDesPos->bottom-a_rDesPos->top,&m_dcMem,a_iSrcX,a_iSrcY,SRCCOPY);
}
CDC* GetDC(){return &m_dcMem;}
CBitmap* GetBitmap(){return &m_bit;}
protected:
CDC m_dcMem;
CBitmap* m_bitOld;
CBitmap m_bit;
int m_iWidth; //add by qlh
int m_iHeight; //add by qlh
};
#endif // !defined(AFX_CANVAS_H__9066CECA_82F0_4A75_950D_26D34D23F5E0__INCLUDED_)
{
public:
CCanvas();
virtual ~CCanvas();
void Create(CDC* a_pDC,CSize a_szSize){
Create(a_pDC,a_szSize.cx,a_szSize.cy);
}
// 创建画布
void Create(CDC* a_pDC,const int a_iWidth,const int a_iHeight){
m_dcMem.CreateCompatibleDC(a_pDC);
m_bit.CreateCompatibleBitmap(a_pDC,a_iWidth,a_iHeight);
m_bitOld=m_dcMem.SelectObject(&m_bit);
m_iWidth=a_iWidth;
m_iHeight=a_iHeight;
}
void SetFilledRGB(COLORREF a_FilledRGB){ //Add by QLH
m_dcMem.FillSolidRect(0,0,m_iWidth,m_iHeight,a_FilledRGB); //用背景色填充位图,将位图清除干净
}
void Destroy(){
if(m_bitOld) {
m_dcMem.SelectObject(m_bitOld);
//m_dcMem.DeleteDC();
}
}
// 绘制图像到画布
void Draw(CBMP* a_pBMP,LPRECT a_rRect){
PaintDIB(m_dcMem,a_rRect,a_pBMP->GetHDIB(),a_pBMP->GetRect(),a_pBMP->GetPalette());
}
// 输出到设备
/*BOOLBitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop);
x:目标矩形区域的左上角x轴坐标点。
y:目标矩形区域的左上角y轴坐标点。
nWidth:在目标设备中绘制位图的宽度。
nHight:在目标设备中绘制位图的高度。
pSrcDC:源设备上下文对象指针。
xSrc:源设备上下文的起点x轴坐标,函数从该起点复制位图到目标设备。
ySrc:源设备上下文的起点y轴坐标,函数从该起点复制位图到目标设备。
*/
void OutToDC(CDC* a_pDC,LPRECT a_rRect,DWORD dwRop=SRCCOPY){
a_pDC->BitBlt(a_rRect->left,a_rRect->top,a_rRect->right-a_rRect->left,a_rRect->bottom-a_rRect->top,&m_dcMem,0,0,SRCCOPY);
}
void OutToDC(CDC * a_pDC,LPRECT a_rDesPos,int a_iSrcX,int a_iSrcY){
a_pDC->BitBlt(a_rDesPos->left,a_rDesPos->top,a_rDesPos->right-a_rDesPos->left,a_rDesPos->bottom-a_rDesPos->top,&m_dcMem,a_iSrcX,a_iSrcY,SRCCOPY);
}
CDC* GetDC(){return &m_dcMem;}
CBitmap* GetBitmap(){return &m_bit;}
protected:
CDC m_dcMem;
CBitmap* m_bitOld;
CBitmap m_bit;
int m_iWidth; //add by qlh
int m_iHeight; //add by qlh
};
#endif // !defined(AFX_CANVAS_H__9066CECA_82F0_4A75_950D_26D34D23F5E0__INCLUDED_)