MFC 對話方塊Picture Control(圖片控制項)中靜態和動態顯示Bmp圖片

來源:互聯網
上載者:User

標籤: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圖片

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.