MFC双缓冲

时间:2024-04-09 23:33:09

大家都知道包括windows桌面在内我们看到的一切都是系统画上去的,windows桌面就相当于一个黑板;

《1》普通绘图就是直接在我们看得到的黑板上绘图

《2》双缓冲就是先在一个虚拟的黑板上画完,等用到的时候在把虚拟黑板上的图画复制到我们看得到的黑板上去;

利用双缓冲的优点就是能够使画面流畅,可以想象把画好的图直接粘贴到黑板上一定比在黑板上重新画要快的多。

——————————————————————开始

第一步:新建一个对话框工程

第二步:添加两个按钮:

一个命名为 双缓冲绘图;

一个命名为  普通绘图;

第三步:声明变量:

在CMyDlg类上右击添加变量如下:

CDC MyDC;
 CBitmap bmp;
 CBitmap *oldbmp;

首先声明一个与窗口DC兼容的内存DC(MyDC)和两个与内存相兼容的位图(bmp,*oldbmp)

第四步:在OnInitDialog()函数中添加以下代码:

//窗口DC

CDC *dc=GetDC();

//创建与窗口DC兼容的内存DC(MyDC)及位图(bmp,*oldbmp )
   MyDC.CreateCompatibleDC(dc);
 bmp.CreateCompatibleBitmap(dc,200,200);

//把内存位图选进内存DC中用来保存在内存DC中绘制的图形

oldbmp=MyDC.SelectObject(&bmp);

//在内存DC中绘制一些小的圆形,数量要多(体现双缓存的优点)

for(int i=0;i<200;i+=6)
    for(int j=0;j<200;j+=6)
         MyDC.Ellipse(i-3,j-3,i+3,j+3);

第五步:右击CMyDlg类添加windows消息响应函数WM_CLOSE,添加以下代码:

MyDC.SelectObject(oldbmp);
 bmp.DeleteObject();
 MyDC.DeleteDC();

//选进原来的位图,删除内存位图对象和内存DC

第六步:双击 ”双缓冲“按钮添加以下代码:

GetDC()->StretchBlt(0,0,200,200,&MyDC,0,0,200,200,SRCCOPY);

//把内存DC中的图形粘贴到窗口中;

第七步:双击“普通绘图”按钮添加以下代码:

for(int i=0;i<200;i+=6)
  for(int j=0;j<200;j+=6)
   GetDC()->Ellipse(i-3,j-3,i+3,j+3);

//按普通方式在窗口中绘制和在内存DC中一样数量和大小的位图;

第八步:运行程序............................

先单击     普通绘图   按钮,大家可以看到绘图的速度有点慢

再单击     双缓冲绘图   按钮,图像马上就显示出来了,

这就是双缓冲和普通绘图的区别了

______________________________________________________________________完成