VC MFC 인터페이스에 BMP 이미지 표시

1. 인터페이스 탐색 버튼을 클릭하여 BMP 이미지 파일을 선택합니다.
찾아보기 버튼을 클릭하여 파일 대화 상자를 열고 BMP 이미지 파일을 선택하여 파일이 있는 경로 디렉토리를 가져옵니다.키 코드는 다음과 같습니다.

  
  
  
  
  1. void ShowBMPDlg::OnButtonSelectiamge()  
  2.     char  szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files(*.*)|*.*||"
  3.     CFileDialog dlg( TRUE,"BMP",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter ); 
  4.     if(dlg.DoModal() == IDOK) 
  5.     { 
  6.         strPathName = dlg.GetPathName();         
  7.         LoadShowBMPFile(strPathName);     
  8.         m_hBitmap = BufferToHBITMAP();     
  9.         Invalidate(); 
  10.     } 

2. BMP 파일을 메모리에 로드합니다. 얻은 BMP 이미지 파일 경로 디렉토리를 통해 BMP 이미지 파일을 메모리에 로드합니다.키 코드는 다음과 같습니다.

  
  
  
  
  1. BOOL ShowBMPDlg::LoadShowBMPFile(const char *pPathname) 
  2.     CFile file; 
  3.     if( !file.Open( pPathname, CFile::modeRead) ) 
  4.         return FALSE; 
  5.     DWORD  m_nFileLen; 
  6.     m_nFileLen = file.GetLength(); 
  7.     m_pBMPBuffer = new char[m_nFileLen + 1]; 
  8.     if(!m_pBMPBuffer) 
  9.         return FALSE; 
  10.     if(file.Read(m_pBMPBuffer,m_nFileLen) != m_nFileLen) 
  11.         return FALSE; 
  12.     return TRUE; 

3. 메모리의 BMP 파일 내용을 HBITMAP로 변환하고 메모리의 BMP 파일 내용을 비트맵 핸들로 변환한다.키 코드는 다음과 같습니다.

  
  
  
  
  1. HBITMAP ShowBMPDlg::BufferToHBITMAP() 
  2.     HBITMAP                hShowBMP; 
  3.     LPSTR                hDIB,lpBuffer = m_pBMPBuffer; 
  4.     LPVOID                lpDIBBits; 
  5.     BITMAPFILEHEADER    bmfHeader; 
  6.     DWORD                bmfHeaderLen; 
  7.      
  8.     bmfHeaderLen = sizeof(bmfHeader); 
  9.     strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen); 
  10.     if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL; 
  11.     hDIB = lpBuffer + bmfHeaderLen; 
  12.     BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ; 
  13.     BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ; 
  14.     m_bmW = bmiHeader.biWidth; 
  15.     m_bmH = bmiHeader.biHeight; 
  16.     lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits; 
  17.     CClientDC dc(this); 
  18.     hShowBMP = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,
  19. &bmInfo,DIB_RGB_COLORS); 
  20.     return hShowBMP; 

4. 화면에 BMP 이미지를 표시하는 이중 버퍼링을 통해 BMP 비트맵이 화면에 표시됩니다.키 코드는 다음과 같습니다.

  
  
  
  
  1. void ShowBMPDlg::DrawImage(int x, int y, CDC *pDC) 
  2.     HBITMAP OldBitmap; 
  3.     CDC MemDC; 
  4.     MemDC.CreateCompatibleDC(pDC); 
  5.     OldBitmap=(HBITMAP)MemDC.SelectObject(m_hBitmap); 
  6.     CBitmap* pBitmap = CBitmap::FromHandle(m_hBitmap); 
  7.     if(m_bmW == 0 || m_bmH == 0) 
  8.         return ; 
  9.     CRect rect; 
  10.     GetClientRect(&rect);     
  11.     pDC->BitBlt(x,y,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY); 
  12.     MemDC.SelectObject(OldBitmap); 

 
이 방법은 우리가 자주 사용하는 인터페이스에 그림을 그리는 방법의 하나다.

좋은 웹페이지 즐겨찾기