VC6下的GDI+双缓冲

一、概述

这段时间在研究GDI+双缓冲的实现方法,在网上花了很多时间都没有找到合适的示例,特别是针对VC6的。后来通过对网上资料的分析,和对SDK/MFC的学习,实现了VC6下的GDI+双缓冲,把它写出来与大家分享,希望可以找到更好的实现方法。

GDI+的一个优点就是可以直接使用jpg图像,在这个示例中,我没有把图像文件放在资源中,而是动态读取,一是由于项目需求,图像数目是未知的;二是由于动态读文件效率低下,使用双缓冲更能体现出优势。

二、分析

在实现过程中,犯了一个错误,把读图像的方法放在了OnDraw之中,后来发现拖动滚动条闪烁的很严重,原因在于ScrollBar拖动时会产生消息激活OnDraw,这样的话,每拖动滚动条就读一次文件,重绘一次,效率当然低下了!

我的实现方式是:更换图像后调用UpdateAllViews,内存DC的绘制都放在OnUpdate中操作,在内存绘制好后再在屏幕中贴图。

// 贴上画布
m_pOldBitmap = m_memDC.SelectObject(&m_memBitmap);
m_memDC.FillSolidRect(0,0,2000,2000,RGB(100,100,100));
// 贴图
CString pStrFullPath = pDoc->m_pStrMapPath + pDoc->m_pStrMapName;
USES_CONVERSION;
LPWSTR wStr = A2W(pStrFullPath);
Image img(wStr);
pDoc->m_nMapWidth = img.GetWidth();
pDoc->m_nMapHeight = img.GetHeight();
Graphics g(m_memDC.GetSafeHdc());
g.DrawImage(&img,0,0,img.GetWidth(),img.GetHeight());
// 恢复
m_memDC.SelectObject(m_pOldBitmap);

时间: 2024-12-23 19:46:57

VC6下的GDI+双缓冲的相关文章

GDI+双缓冲绘制png透明问题

问题描述 GDI+双缓冲绘制png透明问题 我用了gdi+的graphics来绘制png HDC hdc = GetDC(hWnd);//获取窗口的绘图hdcHDC hMdc=CreateCompatibleDC(hdc);//创建内存dcHBITMAP hMbitmap=CreateCompatibleBitmap(hdcwnd_widthwnd_height);//创建内存绘图图片SelectObject(hMdchMbitmap);//关联dc和图片Graphics graphics(hM

VC GDI双缓冲机制绘图防屏幕闪烁实现步骤

在OnDraw(CDC* pDC) 中添加如下代码      CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 ^_^ //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上) M

GDI绘图 双缓冲贴图 电脑死机

问题描述 GDI绘图 双缓冲贴图 电脑死机 绘图的时候使用了双缓冲贴图 然后自己定义了一个透明贴图的函数DrawTransBitmap,贴图成功了,但是程序一运行内存就飞速增长.不关的话马上就死机了,小白一枚 求各位大神帮忙 万分感激 解决方案 case WM_PAINT: hdc = GetDC(hwnd); mdc = CreateCompatibleDC(hdc); bufdc = CreateCompatibleDC(hdc); bufdc2 = CreateCompatibleDC(h

问个关于双缓冲的问题

问题描述 下了个双缓冲的示例代码,看了下.双缓冲是说把,控件现在内存中绘制好,再显示出来,我这样理解对吗?对控件加载速度有提升吗?我要写一个类似物品栏的界面,有几十个PictureBox用来显示图片,每次Hide(),Show()都要一个一个PictureBox刷新下来,会卡几秒.有什么好办法?谢谢了~~~ 解决方案 解决方案二:不会提升加载速度,但可以减轻控件重绘时的闪烁.这个东西就是要重绘才行的,你不让它们重绘......貌似没办法.呃,Hide之后控件还在内存的,没有释放.所以再次Show

c++- 我用VS2010的GDI+写了双缓冲为什么还是画面抖动?

问题描述 我用VS2010的GDI+写了双缓冲为什么还是画面抖动? public: Graphics *gg; Graphics g=dc.GetSafeHdc(); gg->DrawImage(bk,0,0); gg->DrawImage(zj,x,y,0+frame*100,0,100,120,UnitPixel); g.DrawImage(&bb,0,0); 解决方案 Graphics g=dc.GetSafeHdc();此处的dc是兼容dc吗?若不是,建议使用兼容dc. 解决方

gdi+-C++ MFC 双缓冲 输出19条横线19条竖线,但是窗体里什么都没有输出

问题描述 C++ MFC 双缓冲 输出19条横线19条竖线,但是窗体里什么都没有输出 C++ MFC 双缓冲 输出19条横线19条竖线,写在ondraw函数里,没有报错,但是窗体里什么都没有输出-- 代码如下: CDC dcMemory: dcMemory.CreateCompatibleDC(pDC); CBitmap GoBoardMap; CRect rect; GetClientRect(&rect); GoBoardMap.CreateCompatibleBitmap(pDC, rec

MFC小游戏,使用双缓冲技术但是有些位图无法释放,导致GDI泄露

问题描述 MFC小游戏,使用双缓冲技术但是有些位图无法释放,导致GDI泄露 用MFC写了一个类似于魔塔的小游戏,但是发现会产生GDI泄露,运行一段时间就会崩掉,但是有些位图文件不能通过deleteObject释放,自己搞不太明白,请教一下各位. 解决方案 hero等对象应该是成员变量吧.从代码来看,hero中的picture载入的图片是固定的,那么完全没有必要在OnPaint函数中进行重复调用,完全是浪费,应该将这些代码放到hero对象初始化的地方,一次性完成就可以了. 另外,cDC指针最好也R

解析在WTL下使用双缓冲的实现方法_C 语言

使用WTL的CDoubleBufferImpl类可以方便的实现双缓冲,而不必自己实现繁琐的代码,不仅可以绘制一般窗口,也可以绘制对话框的背景等.首先 #include <atlframe.h>其次需要双缓冲画图的类需要派生自CDoubleBufferImpl<>:class CMainDlg : public CDialogImpl<CMainDlg>, public CDoubleBufferImpl<CMainDlg>{}然后消息链中加入BEGIN_MS

实例解说双缓冲

本文配套源码 昨天在论坛上,有人问起双缓冲的实现问题,想起网上这方面资料比较凌乱,而且多是DirectX相关的,今天特地在这里给大家简要的介绍一下双缓冲技术及其在VC++的GDI绘图环境下的实现. 1.Windows绘图原理 我们在Windows环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是"画"出来的.这时的屏幕,就相当于一块黑板,而Windows下的各种GDI要素,如画笔.画刷等,就相当于彩色粉笔了.我们在黑板上手工画图时,是一笔一划的,电脑亦然.只不过电脑的速度比