MFC - 无法从Resources输出BMP图像

时间:2016-11-30 15:42:22

标签: c++ 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图像文件已导入到Resources中,并将其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 个答案:

答案 0 :(得分:0)

如评论中所述,请勿在{{1​​}}中使用GetDC

对于OnPaint(),使用情况为::SelectObject

::SelectObject(hmemdc, bitmap.GetSafeHandle())是WinAPI函数,它不知道如何处理::SelectObject指针,因此CBitmap将失败。

::SelectObject(hmemdc, &bitmap)不是必需的,因为DeleteObject(bitmap)会自动清除。

在MFC中,这是一种更好的方法:

CBitmap

在内存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)