MFC-无法从资源输出BMP图像

MFC - Cannot output the BMP image from Resources

本文关键字:输出 BMP 图像 资源 MFC-      更新时间:2023-10-16

我想从资源中输出一个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);
}

如注释中所述,请勿在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