將檔案中的多個位元影像顯示在螢幕上(cfiledialog, cfile, paintDIB)

來源:互聯網
上載者:User

/*********************************** ************************************ 函數名稱:DisplayMultiDIB 參數:        CDC* pDC                   -指向當前裝置上下文(Divice Context)的指標        CString * mfile        -要顯示的多個位元影像路徑,我在這裡傳入的是一個儲存路徑的數組功能:將多個位元影像顯示在螢幕上 **********************************************************************/

void DisplayMultiDIB(CDC* pDC, CString * mfile)

 {        //建立一個檔案對象        int i=0;        ClearAll(pDC);       

while(*mfile != NULL)       

{      CFile file;       

//以唯讀模式開啟檔案       

 file.Open (*mfile,CFile::modeRead);       

 //讀取檔案到HDIB控制代碼中. 注意:此時只是讀取位元影像檔案中檔案頭之後的部分,不含檔案頭       

m_hDIB[i]=::ReadDIBFile (file);       

//HDIB控制代碼: 就是一Block Storage位元影像資料的記憶體地區的地址       

//HDIB控制代碼包含:位元影像資訊頭、調色盤(如果有的話)、DIB映像資料      

  //關閉檔案        file.Close ();                   

   //指向DIB的指標(指向位元影像資訊頭)       

BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)m_hDIB[i]);         

// 擷取DIB寬度和高度       

 int cxDIB =  ::DIBWidth((char*) lpDIB);        int cyDIB =  ::DIBHeight((char*)lpDIB);        CRect rcDIB,rcDest;       

  //每排顯示10張圖        

int row = i/10;        int colume = i%10;       

 //設定勘探區輸出大小尺寸 ,這裡讀入的都是相同大小的位元影像    

 rcDest.top = row*cyDIB;        rcDest.left =colume*cxDIB;        rcDest.right = rcDest.left + cxDIB;        rcDest.bottom = (row+1)*cyDIB;       

//設定輸出映像的地區      

  rcDIB.top = rcDIB.left = 0;        rcDIB.right = cxDIB;        rcDIB.bottom = cyDIB;      

  //在客戶區顯示映像       

 ::PaintDIB(pDC->m_hDC,rcDest,m_hDIB[i],rcDIB,NULL);        ::GlobalUnlock((HGLOBAL)m_hDIB[i]);        mfile++;        i++;        }

}

 

   通過檔案對話方塊讀入的多個位元影像的路徑

CFileDialog dlg(TRUE,NULL,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,szFilter,NULL);  

   dlg.m_ofn.lpstrFile = strFileBuffer.GetBuffer(2048);       

 dlg.m_ofn.nMaxFile = 2048;        dlg.m_ofn.Flags=OFN_EXPLORER|OFN_ENABLEHOOK|OFN_ALLOWMULTISELECT;    

    UINT nRespond=dlg.DoModal();     strFileBuffer.ReleaseBuffer();   

     if(nRespond == IDOK)       

 {int i=0;               POSITION pos =dlg.GetStartPosition();            

   while(pos)            

   {                      strPathName=dlg.GetNextPathName(pos);           

           m_file[i++]=strPathName;                                

    }m_file[i]="NULL";        }      

         else return;  

 大實話:本人系菜鳥,弄了兩天才解決這個問題,僅供參考。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.