2016-11-30 3 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」と命名されたことを確信しています。

しかし、何も出力しません。

問題が何ですか?

EDIT:

変更後:コメントで指摘したように

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を選択する必要があります。また、BeginPaint()/ EndPaint()(またはMFCのCPaintDCを使用)を呼び出す代わりに、GetDC()を呼び出してWM_PAINTメッセージに応答して描画することはできません。 –

+0

@ Constantine Georgiou私はあなたの提案を試みましたが、変更されたコードは上記のようですが、それでも何も出力されません。どうしたの? –

答えて

0

OnPaint()GetDCを使用しないでください。

::SelectObjectため、使用量が

::SelectObject::SelectObject(hmemdc, bitmap.GetSafeHandle())はWinAPIの関数は、それは、したがって、::SelectObject(hmemdc, &bitmap)は失敗しますCBitmapポインタで何をすべきかわからないんです。

DeleteObject(bitmap)CBitmapは自動的に自動的にクリーンアップされるため、不要です。 MFCで

、これはよりよい方法であって、メモリDCにビットマップを選択する場合

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); 
} 

、以前のビットマップ(oldbmp)への参照を保持し、その結果、dc.SelectObject(oldbmp)とそのビットマップを非選択bitmap安全に削除することができます。

関連する問題