在前面的文章中曾提到过用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函数分离了位图对象与位图资源的关系,但并未删除位图资源,随着重复修改显示位图的次数增多,可能会导致能存泄露,由于我也是个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);