位图加载

来源:互联网 发布:网络扑克制作 编辑:程序博客网 时间:2024/05/18 17:40

本文要点:

⑴getDC与beginpa的区别

⑵LoadBitmap的使用方法介绍

⑶SelectObject的使用方法介绍

⑷hbitmap与bitmap的区别

⑸bitblt、stretchBlt与TransparentBlt的区别。

⑹menu资源正常显示,图片资源无法显示

1、getDC与beginPaint的区别
BeginPaint() 和EndPaint() 可以删除消息队列中的WM_PAINT消息,并使无效区域有效。
GetDC()和ReleaseDC()并不删除也不能使无效区域有效,因此当程序跳出 WM_PAINT 时 ,无效区域仍然存在。系统就回不断发送WM_PAINT消息,于是程序不断处理WM_PAINT消息。

BeginPaint、EndPaint会告诉GDI内部,这个窗口需要重画的地方已经重画了,这样WM_PAINT处理完返回给系统后,系统不会再重发WM_PAINT,而GetDC没有告诉系统这个窗口需要重画的地方已经画过,在你把程序返回给系统后,系统一直以为通知你的重画命令你还没有乖乖的执行或者执行出错,所以在消息空闲时,它还会不断地发WM_PAINT催促你画,导致程序卡死。

无效区域 :

无效区域就是指需要重画的区域,无效的意思是:当前内容是旧的,过时的。假设A是新弹出的一个对话框或被激活的现有对话框,A对话框置于原来的活动对话框B前面,造成对话框B的部分或全部被覆盖,当对话框A移开或关闭后,使对话框B原来被覆盖的地方重新可见。那部分被覆盖的地方就称为无效区域。
只有当一个窗口消息空闲时,系统才会抽空检查一下这个窗口的无效区域是否为非空(WM_PAINT的优先级是最低的。这也就是为什么系统很忙时窗口和桌面往往会出现变白、刷新不了、留拖拽痕迹等现象的原因),如果非空,系统就发送WM_PAINT。所以一定要用BeginPaint、EndPaint把无效区域设为空,否则WM_PAINT将一直被发送。

 

2、LoadBitmap(HINSTANCE hInstance, LPCSTR lpBitmapName)

这一行是用来将对hbitmap的赋值(HDC hbitmap,即内存中用来存储将来要在窗口显示的内容的数据)。
函数解释
hlnstance(即第一个参数):指向模块实例的句柄。该模块的可执行文件包含了要加载的位图。
lpBitmapName(即第二个参数):指向字符串(以NULL结束)批指针。该字符串包含了要加载的位图资源名称。另外一种方式就是该参数可以由低位字是资源标识符、高位字为0位形式组成。可以使用宏MAKEINTRESOURCE来创建这个参数值。这里使用MAKEINTRESOURCE(位图对应的宏的名称)。
返回值:如果函数执行成功,则返回值是指向指定位图的句柄。如果函数执行失败,那么返回值是NULL。

3、SelectObject(hmemDC,hbitmap );
将需要的内容进行选择,即将hbitmap中的内容赋值到hmemdc(内存中),为将来对图片进行处理进行进行铺垫。(直接画图的时候是选择到屏幕上也就是HDC上,但是这个写在内存中)

4、hbitmap与bitmap的区别
hbitmap是句柄,bitmap是是实例,类似于hbitmap是类,bitmap是对象,通过getobject来实现赋值

5、BitBlt、StretchBlt与TransparentBlt的区别。

BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop );
第2、3个参数是hdc上的位置,接下来的2个参数是图片开始显示的点坐标,也就是显示图片上到哪个位置。

BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)
StretchBlt与BitBlt相比,2、3参数决定图片在屏幕上输出的位置,4、5参数决定了窗口图片绘制结束的窗口的坐标,hmemdc是内存中图片的数据,后面4个参数,前2个是图片开始截取的位置,后2个是图片需要截取的宽度与高度。通过该函数可以实现对图片切割,从而实现人物的运动的状态。

BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent)
TransparentBlt的参数类型和stretchBlt相同(除最后一个参数),最后一个参数的颜色是用来将图片中所有这个颜色的颜色去除。

也就是说stretchBlt可以决定截的图片的长宽和整张图上的哪个位置,而BitBlt功能比stretchBlt弱一点,只能截取从开始的位置到整张图结束,TransparentBlt是用来将背景去掉的。

P.S.TransparentBlt在调用的时候需要调用Msimg32.lib库文件。

如果正常link则无需以下操作
编译无错,link出错显示unresolved external symbol __imp__TransparentBlt@44时请按下面步骤操作:(VC6.0下
原因是因为没有设置相应的"图象擦除"LIB文件. Msimg32.lib
解决方法:
"工程"->"设置"->"连接"->"对象/库模块"中,增加 Msimg32.lib

6、menu资源正常显示,图片资源无法显示

VC++6.0下,尽可能把所有资源放在一个文件中进行加载,如果分成2个文件进行加载的话,会出现菜单正常显示,图片无法显示,即用loadbitmap函数无法将内容加载到hbitmap中,从而导致没有文件显示

0 0