关于内存DC】的更多相关文章

在MFC中绘制比较复杂图形,通常采用双缓冲技术来绘图,的确可以大大加快绘制速度和减少闪烁,但是有些情况也不尽然. 我最近遇到了一个问题,采用的也是双缓冲来加快绘图,但是绘制效果还是不尽人意.A对象里大约有几百个可以绘画的对象,每个对象都没有填充背景,他们的背景是另一对象B.A和B在一个窗口中可能有N个,绘画时,先绘制B然后在绘制A,只有2.3个A对象的时候,绘画已经比较慢了,DEBUG下可以明显感觉到延迟,原因是我可能只改变了对象B或一个A对象,但是需要把所有的对象重新绘画一边,效率非常低,即使…
使用CreateCompatibleDC 创建了内存DC之后,要再调用SelectObject选择一张位图放入此DC,然后才可以使用此DC进行绘制,之后绘制的数据会保存在内存中, 详细说明看后文. 在MFC中使用内存DC例子: // 创建内存DC CDC mMemDc; mMemDc.CreateCompatibleDC( &dc ); // 创建兼容位图 CBitmap bmpMemBmp; bmpMemBmp.CreateCompatibleBitmap( &mMemDc, , );…
假如你定义了一个位图类,里面包含位图头,位图信息头,调色板,位图数据.然后你按照位图的格式将位图文件读入你的类中,现在你知道了位图的全部信息了.主要信息包含在位图信息头里面,数据则在位图数据缓冲里面.现在的问题是,在Windows下面如何将一张位图画出来,而且现在是如何从数据缓存里面绘画出位图.  一般情况,我们都是直接绘制在dc里面,而不是绑定到子控件,让子控件自己绘画,比如picture控件之类的,我觉得提供绘制在dc里面的接口更具有广泛性. 现在我知道两种从内存数据绘制彩色位图的2种方法.…
Fabrice Marguerie是一位软件架构师和咨询师,他在MSDN发表了如何检测和避免.NET程序内存与资源泄漏的文章.此文章描述了编写.NET程序时可能发生的内存与资源泄漏,以及如何避免这些泄漏. C#这样的编程语言使用垃圾收集器来清理内存,对于程序完全不会再访问的内存,本应是没有内存泄漏的.Fabrice称,内存泄漏发生在一块内存不 再被使用,但却依然被程序所引用时.当一块内存无法被程序访问到时,垃圾收集器将会重新分配这块内存,但是如果程序仍然保持对内存的引用却不使用这块内存 时,就会…
http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序主动地刷新用户区,强制Windows发送一条WM_PAINT消息,这将引发视类OnDraw函数简单地将所有的图形对象重画,这样才完成了图形的 显示工作,但在刷新的同时会引起较明显的闪烁尤其是当画面面积较大.图像元素过多时尤为明显甚至达到无法正常工作的地步.因此,我们需要做相应的处理.本 文介绍了采用…
我在应用多线程加速图像处理(具体参见图像处理的多线程计算)的过程中,曾遇到过一个线程同步的问题.多线程对图像不同子块进行处理,再合成.结果发现最终不是全部子块都处理成功,有的子块好像没有被处理.而且发现结果图像中哪个子块没有被处理好像是随机发生的,没有处理的子块个数也不固定.检查程序,确信所有的子块都处理了,所以怀疑各个子线程计算子块后,在更新图像时线程同步出了问题. 有一个子图没有处理 在对结果图像进行更新是用到了DC的BitBlt(),多线程计算时对图像数据是进行了保护的.在更新结果图像时,…
补充:回答网友的问题,如何不用路径,而直接将CImage画到DC中,之后DC一起显示.注释掉 pDC->BeginPath(); // 打开路径层 pDC->Rectangle(0,0,pDoc->m_Image.GetWidth(),pDoc->m_Image.GetHeight()); // 设置路径层矩形区域 pDC->EndPath(); // 关闭路径层,关闭后谁都不能在去动这块区域了. pDC->SelectClipPath(RGN_DIFF); // 设置…
一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁. 先来谈谈闪烁产生的原因 原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期. 一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的. 这样问题就来了,一般画图都是先画背景色,然后再把内容画上去,如果这两次操作不在同一个刷新周期内完成,那么给人的视觉感受就是,先看…
屏蔽背景刷新,在View中添加对WM_ERASEBKGND的响应,直接返回TRUE: BOOL CTEMV1View::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 return TRUE; //return CView::OnEraseBkgnd(pDC); } 在OnDraw函数中添加代码: void CTEMV1View::OnDraw(CDC* pDC) { CTEMV1Doc* pDoc = GetDocument();…
最近遇到加载的bmp图片出现失真问题,查找得知需要用SetStretchBltMode函数设置拉伸模式. 函数原型:int SetSTretchBltMode(HDC hdc, int iStretchMode) 参数: hdc:设备环境句柄. LStretchMode:指定拉伸模式.它可以取下列值,这些值的含义如下: BLACKONWHITE:使用消除和现在的像素颜色值进行逻辑AND(与)操作运算.如果该位图是单色位图,那么该模式以牺牲白色像素为代价,保留黑色像素点. COLORONCOLOR…