247上位机VC MFC用动态库打包图片及加载图片
247上位机VC MFC用动态库打包图片及加载图片 功能展示 我们自己开发的程序有时小图标过程我们就想将全部的小图标进行打包处理,然后由我们的主程序进行加载使用,当前例程利用DLL动态库文件打包了三个图片,然后在我们的主程序当中从动态库加载已经打包的三图片,效果如图,点击<从动态库加载图片>,会循环的加载动态库内的图片; 要点提示 从动态库加载图片可以使用函数LoadImage()或LoadBitmap()来完成;LoadBitmap()已被函数LoadImage替代。LoadImage函数原型为:HANDLE LoadImage(HINSTANCE hinst,LPCTSTRlpszName,UINT uType,int cxDesired, int cyDesired,UINTfuLoad); 参数说明: 1.hinst:处理包含被装载图像模块的实例。若要装载OEM图像,则设此参数值为0。 2.lpszName:处理图像装载。如果参数hinst为non-NULL ,而且参数fuLoad省略LR_LOADFROMFILE的值时,那么参数lpszName是一个指向保留在hinst模块中装载的图像资源名称,并以NULL为结束符的字符串。 如果参数hinst为空,并且LR_LOADFROMFILE未被指定,那么这个参数低位字一定是被装载的OEM图像标识的。OEM图像标识符是在WINUSER.H头文件中定义的,下面列举出前缀的含义: OBM_ OEM:位图;OIC_OEM图标;OCR_OEM:光标。 如果参数fuLoad包含LR_LOADFROMFILE值,那么参数lpszName是包含有图像的文件名。 uType:指定被装载图像类型。此参数可以为下列值,其含义如下: IMAGE_BITMAP:装载位图;IMAGE_CURSOR:装载光标;IMAGE_ICON:装载图标。 3.cxDesired:指定图标或光标的宽度,以像素为单位。如果此参数为零并且参数fuLoad值为LR_DEFAULTSIZE,那么函数使用SM_CXICON或SM_CXCURSOR系统公制值设定宽度;如果此参数为零并且值LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源宽度。 4.cyDesired:指定图标或光标的高度,以像素为单位。如果此参数为零并且参数fuLoad值为LR_DEFAULTSIZE,那么函数使用SM_CXICON或SM_CXCURSOR系统公制值设定高度;如果此参数为零并且值LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源高度。 5.fuLoad:根据下面复合值列表指定函数值,值含义如下: LR_DEFAULTCOLOR:缺省标志;它不作任何事情。它的含义是“无LR_MONOCHROME”。 LR_CREATEDIBSECTION:当参数uType指定为IMAGE_BITMAP时,使得函数返回一个DIB部分位图,而不是一个兼容的位图。这个标志在装载一个位图,而不是映射它的颜色到显示设备时非常有用。 LR_DEFAULTSIZE:若 cxDesired或cyDesired被设为零,使用系统指定的公制值标识光标或图标的宽和高。如果这个参数不被设置且cxDesired或cyDesired被设为零,函数使用实际资源尺寸。如果资源包含多个图像,则使用第一个图像的大小。 LR_LOADFROMFILE:根据参数lpszName的值装载图像。若标记未被给定,lpszName的值为资源名称。 LR_LOADMAP3DCOLORS:查找图像的颜色表并且按下面相应的3D颜色表的灰度进行替换。 颜色替代:DkGray RGB(128,128,128)COLOR_3DSHADOW;Gray RGB(192,192,192)COLOR_3DFACELt Gray RGB(223,223,223) COLOR_3DLIGHT LR_LOADTRANSPARENT;找到图像中的一个像素颜色值并且根据颜色表中系统的缺省颜色值替代其相应接口的值。图像中所有使用这种接口的像素的颜色都变为系统的缺省窗体颜色。此至仅用来申请相应的颜色表。 若fuLoad包括LR_LOADTRANSPARENT和LR_LOADMAP3DCOLORS两个值,则LRLOADTRANSPARENT优先。但是,颜色表接口由COLOR_3DFACE替代,而不是COLOR_WINDOW。 LR_MONOCHROME:装载黑白图。 LR_SHARED:若图像将被多次装载则共享。如果LR_SHARED未被设置,则再向同一个资源第二次调用这个图像时就会再装载一遍这个图像且返回不同的句柄。 不要对不同标准尺寸的图像使用LR_SHARED,装载后可能会有改变,或是从文件中被装载。 Windows 95和Windows98:函数根据缓存中被请求的资源名发现的第一个图像,不管被请求的大小。LR_VGACOLOR:使用VGA真彩色。 返回值:如果函数运行成功,返回值是相关资源的数据的句柄。如果函数运行失败,返回值为NULL。若想获得更多的错误信息,请调用GetLastError函数。 注意:当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、图标以及菜单所占的内存资源;加速器表:DesteoyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;图标:DestroyIcon;菜单:DestroyMenu 当过程创建终止时,系统将自动删除这些资源。但是调用相关函数也可以保留内存减少过程的工作设置所占空间。 Windows CE:对IMAGE_BITMAP来说,参数cxDesred和cyDesred p必须为零。Windows CE不支持图表跳跃或闪烁。 参数fuLoad必须为(=LR_DEFAULTCOLOR)。 如果的目标平台不支持鼠标光标,可以指定在参数cxDesred和cyDsired的SM_CXCURSOR和SM_CYCURSOR的值,但不能指定参数uType中IMAGE_CURSOR的值。 如果目标平台支持鼠标光标,可以指定在参数cxDesired和cyDesred的SM_CXCURSOR和SM_CYCURSOR的值,也能指定参数uType中IMAGE_CURSOR的值。返回值:如果函数运行成功,返回值是相关资源的数据的句柄。如果函数运行失败,返回值为NULL。若想获得更多的错误信息,请调用GetLastError函数。 注意:当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、图标以及菜单所占的内存资源;加速器表:DesteoyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;图标:DestroyIcon;菜单:DestroyMenu 当过程创建终止时,系统将自动删除这些资源。但是调用相关函数也可以保留内存减少过程的工作设置所占空间。 Windows CE:对IMAGE_BITMAP来说,参数cxDesred和cyDesred p必须为零。Windows CE不支持图表跳跃或闪烁。 参数fuLoad必须为(=LR_DEFAULTCOLOR)。 如果的目标平台不支持鼠标光标,可以指定在参数cxDesred和cyDsired的SM_CXCURSOR和SM_CYCURSOR的值,但不能指定参数uType中IMAGE_CURSOR的值。 如果目标平台支持鼠标光标,可以指定在参数cxDesired和cyDesred的SM_CXCURSOR和SM_CYCURSOR的值,也能指定参数uType中IMAGE_CURSOR的值。 实现功能 1.新建基于MFC动态库的应用程序 2.向工程添加想打包的位图,记住位图对应ID定义值,如例程三位图ID对应值为2000,2001,2002; 3.新建一基于对话框应用程序 4.拖拽一按钮<从动态库加载图片>关联函数 - void CGkbc8Dlg::OnLoad()
- {
- HBITMAP hBitmap;
- HINSTANCE hInstance = LoadLibrary("BmpDll.dll");
- // hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(m_nIndex));
- hBitmap = (HBITMAP)LoadImage(hInstance,MAKEINTRESOURCE(m_nIndex),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
- FreeLibrary(hInstance);
- //<>
- CStatic *pBmp=(CStatic *)GetDlgItem(IDC_BITMAP);
- pBmp->SetBitmap(hBitmap);
- //<>
- m_nIndex++;
- if(m_nIndex>2002)//例程DLL工程中,图片索引为2000-2002
- m_nIndex=2000;
- }
复制代码5.添加一变量 UINTm_nIndex;//对应DLL内图片ID;初始化为2000,同时将我们前面编辑好的动态库文件复制到工程根目录 6.添加一图片控件ID修改为IDC_BITMAP; 我们来演示下功能实现的整个过程
|