MFC 的Picture Control加载BMP和PNG的方法

2019-04-15 19:29发布

MFC的Picture Control要支持加载图片,首先要将其Type属性设置为Bitmap,其余的Icon和Enhanced Metafile本人未尝试过。也可以在代码中调用pStatic->ModifyStyle(0, SS_BITMAP);来修改。   1. 如果是简单的静态加载,可以先加图片加入资源,然后在"Image"中选定图片对应的资源ID即可。 2. 加载 BMP,一般的方法是调用SetBitmap: CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC); // 得到 Picture Control 句柄  pWnd->SetBitmap((HBITMAP)::LoadImage(NULL, _T("bmp.bmp"),                 IMAGE_BITMAP,                 100,                 50,                 LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE)); 3. 加载 PNG,需要借助CImage类 CImage image; image.Load(_T("fp_scan.png")); HBITMAP hBmp = image.Detach(); m_StaticImage.SetBitmap(ahBmp[iIndex]); m_StaticImage.SetWindowPos(NULL,         0, 0, 48, 48,         SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);   注意(这些都是自己在网上搜索总结的): 1. 如果将提取出来的HBITMAP用于其它地方,譬如将HBITMAP关联到了图片控件,那么必须清楚,CBitmap 在析构函数被调用时,这个 HBITMAP 会被销毁,因此图片控件中的HBITMAP也会不存在,因为它们指向的是同一个资源。 2. 如果不想让CBitmap 析构函数销毁 HBITMAP,可以先调用 CBitmap 类的基类的一个函数:HGDIOBJ Detach( );通过该函数,HBITMAP 将会从 CBitmap 中分离出来,这样 CBitmap 就不会销毁 HBITMAP 了,分离的时候注意它返回的是一个 HGDIOBJ ,需要将该句柄强制转换成 HBITMAP。还有要明白,一旦分离了, HBITMAP 的销毁工作就要由我们自己来负责了,否则又造成了资源泄露! 3. 当通过图片控件的 SetBitmap将HBITMAP 关联到图片控件后,我们就不需要销毁 HBITMAP 了。因为,图片控件在销毁时(DestroyWindow),它会自行销毁 HBITMAP 的。 4. 调用 SetBitmap 函数,图片控件自己会重绘的。 5. 在调用 SetBitmap 后,SetBitmap 会返回前一张图片的 HBITMAP,返回的目的,当然是便于我们自己来销毁前一张图片的 HBITMAP 。这一点也需要注意的,否则还是存在资源不断泄露的问题。销毁 HBITMAP ,使用 DeleteObject(phBitmap) 。 HBITMAP hBmp =(HBITMAP) LoadImage(NULL,_T("c:\b.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_picture.SetBitmap(hBmp);
hBmp = m_picture.GetBitmap();
if (hBmp != NULL)
{
    DeleteObject(hBmp);
}