用picture控件贴图的方法讨论

来源:互联网 发布:python 聚合搜索 编辑:程序博客网 时间:2024/05/21 14:09

在前面的文章中曾提到过用picture控件贴图的方法,但对于用同一个picture控件贴不同的图没有提及,这里说一下我最近学习到的方法。

这里有一点需要注意的就是在贴第二幅图片之前要分离位图类对象与前一个位图资源的联系,具体代码如下:

CBitmap bitmap;bitmap.LoadBitmap(IDB_BIT1);(CStatic*)GetDlgItem(IDC_PIC)->SetBitmap(HBITMAP(bitmap));//显示第二幅位图bitmap.detach();bitmap.LoadBitmap(IDB_BIT2);(CStatic*)GetDlgItem(IDC_PIC)->SetBitmap(HBITMAP(bitmap));

这个程序主要是利用了detach函数分离了bitmap与位图资源的联系,然后再重新加载位图。另外,setbitmap函数需要的参数为HBITMAP类型,所以用了HBITMAP运算符取得了CBitmap对象的位图资源句柄,但如果直接传递bitmap作为参数也能够成功。

但这个程序可能存在一个潜在的危险----内存泄露,因为我们使用了资源文件,虽然用了detach函数分离了位图对象与位图资源的关系,但并未删除位图资源,随着重复修改显示位图的次数增多,可能会导致能存泄露,由于我也是个VC新手,所以不知道怎么测试内存泄露。

然后,我根据自己的经验想出了另外一种方法,代码如下:

HBITMAP hbitmap1;HBITMAP hbitmap2;hbitmap1=(HBITMAP)::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_PIC1));hbitmap2=(HBITMAP)::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_PIC2));//显示第一幅位图((CStatic*)GetDlgItem(IDC_PIC1))->SetBitmap(hbitmap1);//显示第二幅位图((CStatic*)GetDlgItem(IDC_PIC1))->SetBitmap(hbitmap2);最后要记住在窗口对象的析构函数或ondestroy函数释放资源空间,代码如下:DeleteObject(hbitmap1);DeleteObject(hbitmap2);

这个方法是我想出的一个解决方法,具体是否解决了内存泄露我现在还暂时没有能力验证。

这里需要说明一下,MAKEINTRESOURCE宏能够通过资源的ID号获取到资源的名字,由于::LoadBitmap函数的第二个参数为LPCSTR所以需要采用这个方法,这也是MSDN提供的方法。

注意,这里并没有利用CBitmap类,这是因为我觉得这样可以使程序简化,至于有什么缺点我还不得而知,还请知道的朋友告知!

当然,如果实在不放心也可以用CBitmap类,代码如下:

CBitmap bitmap;HBITMAP hbitmap1;HBITMAP hbitmap2;hbitmap1=(HBITMAP)::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_PIC1));hbitmap2=(HBITMAP)::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_PIC2));//显示第一幅位图bitmap.Attach(hbitmap1);((CStatic*)GetDlgItem(IDC_PIC1))->SetBitmap(HBITMAP(bitmap));//显示第二幅位图bitmap.Detach();bitmap.Attach(hbitmap2);((CStatic*)GetDlgItem(IDC_PIC1))->SetBitmap(HBITMAP(bitmap));

对于上述代码仍要需要自己释放资源。

同理,用上述方法也可以对picture控件进行icon图片的贴图,大致过程相同,但需要将图片控件的style属性改为icon,代码如下:

HICON hicon;hicon=(HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0);((CStatic*)GetDlgItem(IDC_PIC))->ModifyStyle(0x0,SS_ICON|SS_CENTERIMAGE);((CStatic*)GetDlgItem(IDC_PIC))->SetIcon(hicon);

这里用了LoadImage而没有用loadicon主要是因为要调整图片大小,我的图片资源文件时16*16的,但当图片控件的style属性为icon时,不能调整图片大小,最小好像是为32*32,所以采用了此函数调整图片大小。modifystyle函数的目的是使图片在控件中居中显示。