1. 程式人生 > >VC++圖片控制元件(Picture Control)顯示資源點陣圖(BMP)、檔案點陣圖(BMP)、其它格式檔案圖片(JPG\PNG\BMP)的方法

VC++圖片控制元件(Picture Control)顯示資源點陣圖(BMP)、檔案點陣圖(BMP)、其它格式檔案圖片(JPG\PNG\BMP)的方法

在VC++ MFC程式設計中,我們常使用Picture Control圖片控制元件來顯示影象。下面簡單歸納幾種顯示不同的方式:

第一種、資源點陣圖方式顯示BMP圖片

如果要顯示的是一張BMP點陣圖,則可以採用資源點陣圖方式,具體步驟如下:

(1)將BMP檔案拷貝到工程的res目錄下;

(2)在對話方塊中新增一個Picture Control控制元件,例如:ID為IDC_STATIC1,Type設為Bitmap;

(3)在工程的資源檢視下,右鍵“新增資源”,現在資源型別Bitmap,然後“匯入”(1)中的檔案,例如:匯入後資源的ID為IDB_BITMAP1;


(4)為IDC_STATIC1 Picture Control控制元件新增Control型別變數,例如:CStatic m_resbmp;

(5)在此控制元件上顯示來自資源中的BMP點陣圖IDB_BITMAP1,程式碼如下:

HBITMAP hBitmap;
// 顯示資源中的影象(僅限點陣圖BMP)
hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),  
		MAKEINTRESOURCE(IDB_BITMAP1),  
		IMAGE_BITMAP,0,0,  
		LR_LOADMAP3DCOLORS);  
m_resbmp.SetBitmap(hBitmap);

第二種、檔案點陣圖方式顯示BMP圖片

如果要顯示的是一張BMP點陣圖,也可以採用檔案點陣圖的方式,具體步驟如下:


(1)將BMP檔案拷貝到工程的可執行檔案目錄下(如:Debug目錄,beixin.bmp檔案);

(2)在程式中獲取可執行檔案目錄的全路徑,程式碼如下:

CString exepath;//exe路徑
char filepath[256];
char *pPath;
GetModuleFileName(AfxGetInstanceHandle(),filepath,256);
pPath = strrchr(filepath,'\\');
*pPath = 0;
exepath = filepath;
(3)在對話方塊中新增一個Picture Control控制元件,例如:ID為IDC_STATIC2,Type設為Bitmap;

(4)為IDC_STATIC2 Picture Control控制元件新增Control型別變數,例如:CStatic m_filebmp;

(5)在此控制元件上顯示來自檔案的BMP點陣圖beixin.bmp,程式碼如下:

// 顯示檔案中的影象(僅限點陣圖BMP)
HBITMAP hBitmap;
CString filebmppath;
filebmppath.Format("%s\\beixin.bmp",exepath);//點陣圖檔案全路徑
hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),_T(filebmppath),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_filebmp.SetBitmap(hBitmap);

第三種、檔案圖片方式顯示JPG\PNG\BMP等圖片

如果要顯示的是一種JPG圖片、PNG圖片或者BMP圖片(亦可)等其他格式的靜態圖片,則可使用檔案圖片的方式,步驟如下:

(1)將圖片檔案拷貝到工程的可執行檔案目錄下(如:Debug目錄,shoutao.jpg\shoutao.png\shoutao.bmp檔案);

(2)在程式中獲取可執行檔案目錄的全路徑,同上(第二種(2));

(3)在對話方塊中新增一個Picture Control控制元件,例如:ID為IDC_STATIC3,Type設為Frame;

(4)為IDC_STATIC3 Picture Control控制元件新增Control型別變數,例如:CStatic m_fileimg;

(5)在此控制元件上顯示來自檔案的JPG\PNG\BMP圖片shoutao.jpg\shoutao.png\shoutao.bmp,程式碼如下:

//.h檔案中
CFileFind finder;
void showimg(char* imgpath);//顯示不同格式圖片的函式
//.cpp檔案中
void CPoint34Dlg::showimg(char* imgpath)
{
	// 顯示檔案中的影象(不限影象格式)
	if (finder.FindFile(imgpath))
	{
		CRect rect;
		m_fileimg.GetClientRect(&rect);
		CImage img;
		img.Load(imgpath);
		CDC* pDC = m_fileimg.GetWindowDC();
		img.Draw(pDC->GetSafeHdc(),rect);
		ReleaseDC(pDC);
	}
}
//.h檔案中
CString fileimgpath;
//.cpp檔案中,呼叫圖片顯示函式
srand((unsigned)time(NULL));
int rd = rand()%3;
switch (rd)
{
case 0:
	fileimgpath.Format("%s\\shoutao.bmp",exepath);
	break;
case 1:
	fileimgpath.Format("%s\\shoutao.png",exepath);
	break;
case 2:
	fileimgpath.Format("%s\\shoutao.jpg",exepath);
	break;
}
showimg(fileimgpath.GetBuffer());//呼叫

(6)這種在Picture Control控制元件中顯示圖片的方式,千萬不要忘記在對話方塊的OnPaint()中新增視窗更新、重繪影象,否則,被對話方塊最小化或被遮擋後,影象不能正常顯示,在OnPaint()中新增程式碼如下:

CDialog::OnPaint();
//對話方塊被最小化或被遮擋後,影象不能正常顯示,需要更新、重繪視窗
UpdateWindow();
showimg(fileimgpath.GetBuffer());


效果圖如下: