MFC中在picture control中顯示圖像的方法


在MFC中有一個控件picture control控件,利用該控件可以顯示圖像。在這裡利用CxImage庫、MFC中的picture Control控件顯示圖像的方法和步驟如下:


1、新建基於對話框的MFC界面程序,在工程中配置CxImage庫。


配置之後的結果如下:



同樣在release版本下配置,不過引用路徑要改成Release文件夾。



同樣在release版本下配置,添加的lib為cximage.dll文件。


2、在工程中Dlg.h即對話框類的聲明中添加兩個成員:


///////以下為自己定義的類成員
public:
CWnd* m_pWnd0; //顯示窗口1
CWnd* m_pWnd1; //顯示窗口2

CxImage* m_pImage1; //窗口1圖像顯示類庫指針
CxImage* m_pBKImage; //窗口2顯示類指針

並在類的OnInitDialog函數中將指針置為NULL。


並在類的析構函數中添加CxImage指針的內存釋放語句


//....
if(m_pImage1 != NULL)
{
delete m_pImage1;
m_pImage1 = NULL;
}

//...

3、為類添加以下三個成員函數:


/* 獲取文件的擴展名*/
CString CImageShowDlg::FindExtension(const CString &name)
{
int len = name.GetLength();
int i;
for (i = len-1; i >= 0; i--){
if (name[i] == '.'){
return name.Mid(i+1);
}
}
return CString("");
}

/*獲取圖像擴展名的圖像類型*/
int CImageShowDlg::FindType(const CString &ext)
{
int type = 0;
if (ext == "bmp") type = CXIMAGE_FORMAT_BMP;
#if CXIMAGE_SUPPORT_JPG
else if (ext=="jpg"||ext=="jpeg") type = CXIMAGE_FORMAT_JPG;
#endif
#if CXIMAGE_SUPPORT_JPG
else if (ext=="JPG"||ext=="JPEG") type = CXIMAGE_FORMAT_JPG;
#endif
#if CXIMAGE_SUPPORT_GIF
else if (ext == "gif") type = CXIMAGE_FORMAT_GIF;
#endif
#if CXIMAGE_SUPPORT_PNG
else if (ext == "png") type = CXIMAGE_FORMAT_PNG;
#endif
#if CXIMAGE_SUPPORT_MNG
else if (ext=="mng"||ext=="jng") type = CXIMAGE_FORMAT_MNG;
#endif
#if CXIMAGE_SUPPORT_ICO
else if (ext == "ico") type = CXIMAGE_FORMAT_ICO;
#endif
#if CXIMAGE_SUPPORT_TIF
else if (ext=="tiff"||ext=="tif") type = CXIMAGE_FORMAT_TIF;
#endif
#if CXIMAGE_SUPPORT_TGA
else if (ext=="tga") type = CXIMAGE_FORMAT_TGA;
#endif
#if CXIMAGE_SUPPORT_PCX
else if (ext=="pcx") type = CXIMAGE_FORMAT_PCX;
#endif
#if CXIMAGE_SUPPORT_WBMP
else if (ext=="wbmp") type = CXIMAGE_FORMAT_WBMP;
#endif
#if CXIMAGE_SUPPORT_WMF
else if (ext=="wmf"||ext=="emf") type = CXIMAGE_FORMAT_WMF;
#endif
#if CXIMAGE_SUPPORT_J2K
else if (ext=="j2k"||ext=="jp2") type = CXIMAGE_FORMAT_J2K;
#endif
#if CXIMAGE_SUPPORT_JBG
else if (ext=="jbg") type = CXIMAGE_FORMAT_JBG;
#endif
#if CXIMAGE_SUPPORT_JP2
else if (ext=="jp2"||ext=="j2k") type = CXIMAGE_FORMAT_JP2;
#endif
#if CXIMAGE_SUPPORT_JPC
else if (ext=="jpc"||ext=="j2c") type = CXIMAGE_FORMAT_JPC;
#endif
#if CXIMAGE_SUPPORT_PGX
else if (ext=="pgx") type = CXIMAGE_FORMAT_PGX;
#endif
#if CXIMAGE_SUPPORT_RAS
else if (ext=="ras") type = CXIMAGE_FORMAT_RAS;
#endif
#if CXIMAGE_SUPPORT_PNM
else if (ext=="pnm"||ext=="pgm"||ext=="ppm") type = CXIMAGE_FORMAT_PNM;
#endif
else type = CXIMAGE_FORMAT_UNKNOWN;

return type;
}

這兩個函數主要為瞭根據圖像的路徑獲取圖像的類別信息,方便後面的圖像的讀取。


//繪制圖像函數
void CImageShowDlg::DrawImgOnCtrl(CxImage* pImg , CWnd* wndDraw)
{
int nImgWidth,nImgHeight; //圖像的長寬
CRect rectWndDraw; //繪圖窗口的矩形
CRect rectDispaly; //圖像顯示區域

//獲取圖像的長寬
nImgWidth = pImg->GetWidth();
nImgHeight = pImg->GetHeight();

//獲取繪制窗口的長寬
wndDraw->GetClientRect(&rectWndDraw);

//根據圖像和繪制區域的比例繪制圖像
CDC* pDC;
pDC = wndDraw->GetDC(); //獲取窗口句柄

pDC->FillSolidRect(rectWndDraw,RGB(0,0,0));

//繪制圖像到窗口區域
float xRadio,yRadio;
float fRadio;
xRadio = (float)rectWndDraw.Width()/(float)nImgWidth;
yRadio = (float)rectWndDraw.Height()/(float)nImgHeight;
if(xRadio >= yRadio)
fRadio = yRadio;
else
fRadio = xRadio;

//計算圖像顯示的位置
rectDispaly.left = int((rectWndDraw.Width() - nImgWidth * fRadio)/2) + rectWndDraw.left;
rectDispaly.top = int((rectWndDraw.Height() - nImgHeight * fRadio)/2) + rectWndDraw.top;
rectDispaly.right = int(rectDispaly.left + nImgWidth * fRadio);
rectDispaly.bottom = int(rectDispaly.top + nImgHeight * fRadio);

pImg->Draw(pDC->GetSafeHdc(),rectDispaly);
}

這個函數主要功能是:在picture control控件中根據picture control控件的大小動態顯示圖片(即無論圖像多大,都可以在控件中顯示,縮放顯示)。


4、在工程的資源視圖中Dialog主對話框添加兩個pictrue control控件和2個按鈕,如下:



並修改這四個控件的ID,並記住(後面要用到)。


5、在兩個按鈕的消息相應函數中添加代碼:(這裡隻放上一個按鈕的響應函數,另一個一樣,隻是相關的ID和指針不一樣。)


void CImageShowDlg::OnBnClickedButtonTu2()
{
// TODO: 在此添加控件通知處理程序代碼
//打開圖片選擇對話框
LPCTSTR szFilter = _T("BMP(*.bmp)|*.bmp|JPEG(*.jpg)|*.jpg|ALLSUPORTFILE(*.*)|*.*||");
CFileDialog dlgBKFile(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,NULL);

CString strBKFileName;
//如果按下OK鍵
if(dlgBKFile.DoModal() == IDOK)
{
//讀取視頻文件
strBKFileName = dlgBKFile.GetPathName();
}
else
{
return;
}

//建立CxImage的類指針
CString strExt; //獲取文件後綴名
int imageType; //獲取圖像類型

strExt = FindExtension(strBKFileName);
imageType = FindType(strExt);

//判斷指針是否為空
if(m_pImage2 != NULL)
{
delete m_pImage2;
m_pImage2 = NULL;
}

//開辟內存
m_pImage2 = new CxImage();
//打開圖片
m_pImage2->Load(strBKFileName, imageType);

if(!m_pImage2->IsValid())
{
AfxMessageBox(_T("建立圖像指針失敗!"));
delete m_pImage2;
m_pBmage2 = NULL;
return;
}

//繪制圖像到相應的圖像控件上
m_pWnd2 = this->GetDlgItem(IDC_STATIC_Tu2); //這裡一定要和picture Control控件的ID對應起來
DrawImgOnCtrl(m_pImage2,m_pWnd2);
}

前兩句語句,主要是為瞭在單擊該按鈕的時候,系統會彈出選擇文件的對話框。


6、運行結果如下:



打開圖像後顯示如下:



註意:如果需要的工程的Debug或則Release文件夾下直接運行生成的exe文件,則需要將第一步中的那個dll分別拷貝到Debug或者是Release文件夾下,才可運行。

0 個評論

要回覆文章請先登錄註冊