標籤:c語言 vs2010 圖片 bmp 對話方塊
.
一.靜態顯示bmp圖片
1.建立MFC基於對話方塊程式,添加一個button1和picture控制項,其中“資源檢視”中編輯picture控制項ID為:IDC_STATIC_PIC.
2.在"資源檢視"(如果沒有,視圖中可調用出來)中右鍵滑鼠Dialog處,選擇"添加資源".在對話方塊中選擇Bitmap,點擊"匯入",選擇本地bmp圖片( 建議位元影像放置在res檔案夾中) .它會添加一張IDB_BITMAP1圖片 .
3.點擊button1按鈕,在產生的函數中添加如下代碼:
void CShowBmpDlg::OnBnClickedButton1(){ //從資源中載入圖片 CBitmap bitmap; //載入指定位元影像資源 Bmp圖片ID bitmap.LoadBitmap(IDB_BITMAP1); //擷取對話方塊上的控制代碼 圖片控制項ID CStatic *p=(CStatic *)GetDlgItem(IDC_STATIC_PIC); //設定靜態控制項視窗風格為位元影像置中顯示 p->ModifyStyle(0xf,SS_BITMAP|SS_CENTERIMAGE); //將圖片設定到Picture控制項上 p->SetBitmap(bitmap); }
4.運行結果如所示:
5.總結
通過上面的我們可以發現:該方法是通過資源ID來擷取BMP圖片的,所以我稱之為靜態方法.同時,可能你見到過在添加Picture控制項時修改其Type為Bitmap在通過image選擇ID的方法.但這裡是通過代碼來實現的,而且ModifyStyle函數的功能就相當於設定其屬性.
~~很明顯的反應了它顯示圖片時,如果圖片尺寸超過控制項size只能顯示部分圖片.方法我只敘述到這,需要你自己去嘗試.曾經在單文檔中顯示BMP圖片時,是通過重載onpaint事件,GetClientRect擷取尺寸調用StretchBlt(映像可展開壓縮)實現(參照前文).
其實LoadBitmap函數已被LoadImage替代,該函數用於裝載表徵圖\游標\位元影像.如下代碼所示 可以實現同樣的效果,其中Rockies.bmp為本地檔案,與程式相同檔案夾.
void CShowBmpDlg::OnBnClickedButton1(){ //擷取對話方塊片控制項的控制代碼 CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC_PIC); //設定靜態控制項視窗風格為位元影像置中顯示 pWnd->ModifyStyle(0xf,SS_BITMAP|SS_CENTERIMAGE); //顯示圖片 pWnd->SetBitmap((HBITMAP)::LoadImage(NULL, _T("Rockies.bmp"), //資源號或本地檔案名稱 IMAGE_BITMAP, //裝載位元影像 IMAGE_CURSOR游標 IMAGE_ICON表徵圖 0, //寬度 0為預設大小 0, //高度 像素為單位 LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE));}
二.動態載入bmp圖片
動態添加的方法一樣,只是添加代碼如下(這結合我以前的程式碼完成).主要的步驟是:
1.先定義開啟檔案對話方塊,通過它擷取bmp圖片,其中dlg.DoMal()==IDOK表示按下確認按鈕,實現後面操作.如果你學過C#就會發現它的OpenFileDialog控制項與這個有些類似.
2.然後,擷取讀取檔案的路徑和尾碼,確保其為bmp時執行讀取圖片資訊,在" 2.MFC-bmp圖片讀取儲存"中,我曾詳細講述過如何讀取bmp圖片,這裡也是二進位讀取檔案,讀取其檔案頭(BITMAPFILEHEADER)、資訊頭(BITMAPINFOHEADER)、擷取其位元影像資料.
3.最後顯示映像到Picture控制項中,並通過GetClientRect函數擷取矩形地區,顯示映像.
void CShowBmpDlg::OnBnClickedButton1(){ //開啟檔案 定義四種格式的檔案bmp gif jpg tiff CString filter; filter="所有檔案(*.bmp,*.jpg,*.gif,*tiff)|*.bmp;*.jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff||"; CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,filter,NULL); //按下確定按鈕 dlg.DoModal() 函數顯示對話方塊 if( dlg.DoModal() == IDOK ) { //開啟對話方塊擷取映像資訊 CString BmpName = dlg.GetPathName(); //擷取檔案路徑名 如D:\pic\abc.bmp CString EntName = dlg.GetFileExt(); //擷取副檔名 EntName.MakeLower(); //將副檔名轉換為一個小寫字元 if(EntName.Compare(_T("bmp")) == 0) { //定義變數儲存圖片資訊 BITMAPINFO *pBmpInfo; //記錄映像細節 BYTE *pBmpData; //映像資料 BITMAPFILEHEADER bmpHeader; //檔案頭 BITMAPINFOHEADER bmpInfo; //資訊頭 CFile bmpFile; //記錄開啟檔案 //以唯讀方式開啟檔案 讀取bmp圖片各部分 bmp檔案頭 資訊 資料 if(!bmpFile.Open(BmpName, CFile::modeRead|CFile::typeBinary)) return; if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER)) return; if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER)) return; pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)]; //為映像資料申請空間 memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER)); DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits; pBmpData = (BYTE*)new char[dataBytes]; bmpFile.Read(pBmpData,dataBytes); bmpFile.Close(); //顯示映像 CWnd *pWnd=GetDlgItem(IDC_STATIC_PIC); //獲得pictrue控制項視窗的控制代碼 CRect rect; pWnd->GetClientRect(&rect); //獲得pictrue控制項所在的矩形地區 CDC *pDC=pWnd->GetDC(); //獲得pictrue控制項的DC pDC->SetStretchBltMode(COLORONCOLOR); StretchDIBits(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0, bmpInfo.biWidth,bmpInfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY); } }}
運行程式顯示結果如所示,點擊按鈕開啟圖片,顯示圖片.
總結:通過這個程式你可以很明顯的看到動態載入圖片由於是通過擷取picture控制項矩形來顯示圖的,映像被展開了.而且代碼很好的反應了如何擷取bmp映像的方法.通過靜態和動態兩種方法講述.
MFC 對話方塊Picture Control(圖片控制項)中靜態和動態顯示Bmp圖片