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

Posted

技术标签:

【中文标题】MFC - 无法从资源输出 BMP 图像【英文标题】:MFC - Cannot output the BMP image from Resources 【发布时间】:2016-11-30 15:42:22 【问题描述】:

我想从资源中将 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);

【问题讨论】:

基本 GDI 知识。您需要将 bmp 选择到 mem-dc 中,此外,您可能不会调用 GetDC() 进行绘画(响应 WM_PAINT 消息),而是调用 BeginPaint()/EndPaint()(或在 MFC 中使用 CPaintDC)。 @Constantine Georgiou 我已经尝试过你的建议,修改后的代码就像上面一样,但它仍然没有输出任何东西。它有什么问题? 【参考方案1】:

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

【讨论】:

以上是关于MFC - 无法从资源输出 BMP 图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 MFC 在 MS Visual C++ 2008 中处理 .bmp 图像时出现颜色问题

将多个 png 转换为 bmp 从标准输入到标准输出

无法正确调整 .bmp 图像的大小(CS50 pset 4,调整大小,不太舒服)

使用 mfc 对话框显示 .bmp 图像时出错

MFC 选择的文件信息

无法让CImage在Visual C ++ 2005(MFC)中工作