GDI+混合GDI实现双缓存
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
只回答业务咨询
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
双缓存就是在内存中准备一块区域,把要显示的内容都绘制到准备的内存区域中,绘制完成之后就可以调用BitBlt函数,把内存区域的内容复制到显示设备上,这样就可以防止闪屏了.
在是使用GDI绘制客户区域时,可以使用下面的这样的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
void CTestView::ShowBmpUseDoubleBuffer() { CDC *pDC = GetDC(); CBitmap BmpMem; //内存位图 CDC MemDC; //内存设备 CRect rect; GetClientRect(rect);//得到客户端区域大小 //创建与显示设备兼容的位图 BmpMem.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); //创建与显示设备兼容的设备 MemDC.CreateCompatibleDC(pDC); //将位图选入设备 MemDC.SelectObject(BmpMem); /* 在这里就可以在MemDC上面绘制各种东西了 譬如贴一张位图: CBitmap bitmap; BITMAP bm; //这个变量是用来取得位图的信息(尺寸大小) CDC tempdc; bitmap.LoadBitmap(IDB_BITMAP); //导入资源 bitmap.GetObject(sizeof(bm),bm); //取得资源信息 //创建与pDC兼容的内存设备环境 tempdc.CreateCompatibleDC(pDC); tempdc.SelectObject(bitmap);//将bitmap位图对象选入内存设备环境 //在MemDC上绘制位图 MemDC.StretchBlt(0,0,bm.bmWidth,bmHeight,tempdc, 0,0,bm.bmWidth,bmHeight,SRCCOPY); */ //只一次性的向显示设备显示位图,不会出现闪屏 pDC->BitBlt(0,0,rect.Width(),rect.Height(),MemDC,0,0,SRCCOPY); //释放资源 pDC->DeleteDC(); MemDC.DeleteDC(); } |
上面就是在GDI使用双缓存机制绘制的操作,而在GDI+中,可以像下面的步骤一样使用双缓存:
在内存中建立一块“虚拟画布”:Bitmap bmp = new Bitmap(600, 600);
获取这块内存画布的Graphics引用:Graphics g = Graphics.FromImage(bmp);
在这块内存画布上绘图:g.FillEllipse(brush, i * 10, j * 10, 10, 10);
将内存画布画到窗口中:this.CreateGraphics().DrawImage(bmp, 0, 0);
但是GDI+ 的双缓冲效果很差, 使用的是临时位图来实现的.效果并没有GDI中的那么好。所以可以结合GDI双缓存方面的优势和GDI+绘制图形方面的便利,在GDI双缓存中使用GDI+来绘图。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
void C**View::OnDraw(CDC* pDC) { CDC hMemDC; hMemDC.CreateCompatibleDC(pDC); //创建兼容DC CRect rect; GetClientRect(rect); // 创建兼容位图 HBITMAP hMemBitmap = CreateCompatibleBitmap(pDC->GetSafeHdc(), rect.Width(),rect.Height()); //把位图选进DC中,对DC的操作实际上就是对位图的操作 SelectObject(hMemDC, hMemBitmap); //下面这句是关键,使用兼容DC,之后的画图操作就画在内存位图上 Gdiplus::Graphics graphics(hMemDC); Image image(L"D:\\p.png",false); Rect destRect = Rect(0,0,100,100);//图片显示的位置和大小 graphics.DrawImage(image,destRect); BitBlt(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(), hMemDC, 0,0,SRCCOPY); //删除内存中的资源 DeleteObject(hMemBitmap); DeleteDC(hMemDC); } |
上面就是使用了双缓存,并且用GDI+来在客户端绘制一张png图片。
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=606