VC中在SCrollView画图中容易出现的错误

1:画图时有GDI和GDI+混用时,在使用完GDI+的地方要加上OnPrepareDC()函数,不然坐标会一直保持为设备坐标,而不是逻辑极坐标.

2:绘图时闪烁,使用双缓冲绘图技术,要设定

	pDC->SetViewportOrg(0, 0);
	pDC->SetWindowOrg(0, 0);
	pDC->SetMapMode(MM_TEXT);

	dcMem.SetViewportOrg(0, 0);
	dcMem.SetWindowOrg(0, 0);
	dcMem.SetMapMode(MM_TEXT);

不然也会一直是设备坐标.而且OnEraseBkgnd(CDC* pDC)函数一定要返回TRUE.

暂时想到的只有这么多,以后发现问题再及时记录!


/************************************* 2017.03.18日更新 ****************************************/

在有连续的GDI与GDI+ 混用时,最好把GDI+单独提取到另一个函数中,不然坐标会是设备坐标


/************************************* 2017.04.09日更新 ****************************************/

GDI+在画图时要注意释放句柄资源.不然会有内存泄露,导致内存不断增大,但是Debug模式结束程序后,又没有内存泄露的提示.

			Graphics g(pDC->m_hDC);
 			CString strImage = _T("C:\\Users\\layne\\Desktop\\KeyBoard Tools\\Debug\\StaticKeyImage\\MoreColor.png");
 			BSTR bstr = strImage.AllocSysString();
 			//Image * i = Image::FromFile(bstr);//使用FromFile需要释放,不然会有内存泄露
 			Image i(bstr);
 			SysFreeString(bstr);//转成BSTR类型的字符串后,需要释放,不然内存泄露
 			
 			Rect r(rectFill.left, rectFill.top, rectFill.Width(), rectFill.Height());
 			g.DrawImage(&i, r);
 
 			//delete i;
 			//i = NULL;
 			g.ReleaseHDC(pDC->m_hDC);//需要释放GDI+的句柄不然会有内存泄露	


 静态函数FromFile、FromHBitmap和FromStream的使用

FromFile主要是将图片文件加载到GDI+对象中,FromHBitmap和FromStream函数则是将内存中的图片数据加载到GDI+对象中。我们平常处理图片加载与格式转换时主要用到两个类:Bitmap类和Image类。Bitmap类继承于Image类,这三个函数它都有。Image类则只有FromFile和FromStream函数。在使用这三个函数时,要注意一下几点。

         (1)  对于FromFile、FromHBitmap和FromStream这三个函数,都是静态函数,MSDN对于返回值的说明:This method returns a pointer to the new Bitmap/Image object(在VS中GO到函数的定义出也是能看出来的,函数返回是new出来的对象)。这意味着什么呢?因为返回的是新创建的类的对象,是需要我们使用者来负责销毁的,即对象使用完了后需要我们手动将之delete掉。如果不delete掉,不仅会导致内存泄漏,也会导致GDI句柄泄漏。这点在我们的项目开发中是深有体会的,特别是GDI句柄泄漏使用了专门的工具进行检测的。

        (2) 在使用Image::FromFile时,要注意将指定的文件加载到Image对象中后,会将磁盘上对应的文件“锁住”,其他地方如果要同时加载该文件则可能会出问题,这也是我们在开发过程中遇到的问题。我们的处理办法是,不使用Image::FromFile函数,使用Image::FromStream。对于Image::FromStream,我们先将文件读到内存中,然后再将内存中数据倒到流中,然后调用Image::FromStream从流中将图片数据加载到Image对象中。使用Image::FromStream的流程较复杂,使用时要注意,也有一些陷阱,下面我们会谈到。

         (3) 对于GDI+提供的函数,对于需要传入字符串的参数,一般均是WCHAR*宽字节类型,所以在调用之前要确保传入字符串是宽字节的。这点和COM接口类似,一般都要传入宽字节的字符串。

 

GDI资源也要注意释放,不然也会有内存泄露.

GDI对象释放详解:http://blog.csdn.net/qq_23992597/article/details/69856135


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值