2016-11-30 40 views
0

我想將BMP圖像輸出到資源對話框或屏幕上。MFC - 無法從資源輸出BMP圖像

下面的代碼:

void CMainDlg::OnPaint() 
{ 
     CBitmap bitmap; 
     bitmap.LoadBitmap(IDB_BITMAP1); 
     CDC *pDC; 
     pDC = this->GetDC(); 
     HDC hDC = pDC->m_hDC; 
     HDC hmemdc = CreateCompatibleDC(hDC); 

     BITMAP BitMap; 
     bitmap.GetBitmap(&BitMap); 
     BitBlt(hDC,0,0,BitMap.bmWidth,BitMap.bmHeight,hmemdc,0,0,SRCCOPY); 
     DeleteDC(hmemdc); 
     DeleteObject(bitmap); 
} 

我相信,BMP圖像文件導入資源,並命名其ID「IDB_BITMAP1」。

但它不輸出任何東西。

有什麼問題?

編輯:

修改後:

void CMainDlg::OnPaint() 
{ 
    CBitmap bitmap; 
    bitmap.LoadBitmap(IDB_COVER); 
    CPaintDC dc(this); 
    HDC hDC = dc.m_hDC; 
    HDC hmemdc = CreateCompatibleDC(hDC); 
    SelectObject(hmemdc,&bitmap); 

    BITMAP BitMap; 
    bitmap.GetBitmap(&BitMap); 
    BitBlt(hDC,0,0,BitMap.bmWidth,BitMap.bmHeight,hmemdc,0,0,SRCCOPY); 
    DeleteDC(hmemdc); 
    DeleteObject(bitmap); 
} 
+1

基本的GDI知識。您需要在mem-dc中選擇bmp,並且您可能不會調用GetDC()進行繪製(以響應WM_PAINT消息),而是調用BeginPaint()/ EndPaint()(或在MFC中使用CPaintDC)。 –

+0

@Constantine Georgiou我曾嘗試過您的建議,修改過的代碼就像上面那樣,但它仍然不會輸出任何內容。它出什麼問題了? –

回答

0

正如在評論中指出,不OnPaint()使用GetDC

::SelectObject,用途爲::SelectObject(hmemdc, bitmap.GetSafeHandle())

::SelectObject是WinAPI的函數,它不知道如何處理CBitmap指針做,因此::SelectObject(hmemdc, &bitmap)將失敗。

DeleteObject(bitmap)沒有必要,因爲CBitmap會自動清理完畢。

在MFC中,這是一個較好的方法:

void CMainDlg::OnPaint() 
{ 
    CPaintDC dc(this); 
    CBitmap bitmap; 
    bitmap.LoadBitmap(IDB_COVER); 

    CDC memdc; 
    memdc.CreateCompatibleDC(&dc); 
    CBitmap *oldbmp = memdc.SelectObject(&bitmap); 

    BITMAP BitMap; 
    bitmap.GetBitmap(&BitMap); 
    dc.BitBlt(0, 0, BitMap.bmWidth, BitMap.bmHeight, &memdc, 0, 0, SRCCOPY); 

    dc.SelectObject(oldbmp); 
} 

當選擇在存儲器DC位圖,保持到先前位圖(oldbmp)的參考,然後取消選擇具有dc.SelectObject(oldbmp)使得bitmap該位圖可以安全刪除。