You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MFC中OnPaint()显示imagedata无效果问题求助

MFC OnPaint中图像无法显示的原因及解决方法

一、第一个代码无显示的原因

你创建的内存DC(memDC)调用CreateCompatibleDC(&dc)后,默认关联的是1x1的单色位图。此时在memDC上绘制的矩形仅会画在这个极小的位图上,调用BitBlt时只能复制1x1的区域,自然看不到任何内容。

修正代码:

必须给内存DC选入与目标DC兼容且大小匹配的位图:

void CYourWnd::OnPaint()
{
    CPaintDC dc(this);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    
    // 创建兼容位图并选入内存DC
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(&dc, 100, 100);
    CBitmap* pOldBmp = memDC.SelectObject(&bmp);
    
    // 在内存DC上绘制矩形
    memDC.Rectangle(0, 0, 100, 100);
    
    // 将内存DC内容复制到窗口DC
    dc.BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
    
    // 恢复内存DC的原始位图
    memDC.SelectObject(pOldBmp);
}

二、第二个代码无显示的原因

这段代码存在多个关键错误:

  1. 未初始化内存DC:直接使用memDC但未调用CreateCompatibleDC(&dc)创建与窗口DC兼容的内存DC。
  2. 函数名大小写错误:MFC中CBitmap的创建函数是CreateBitmap(首字母大写),而非createBitmap,会导致函数调用无效。
  3. 像素格式不匹配:Windows 24位位图的像素存储顺序是BGR,但你的img数据按RGB顺序填充,格式不兼容会导致无法正常渲染。
  4. 未恢复原位图:选入新位图后未恢复内存DC的原始位图,可能引发资源泄漏。

修正代码:

void CYourWnd::OnPaint()
{
    CPaintDC dc(this);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc); // 初始化内存DC
    
    CBitmap bmp;
    // 将RGB格式的img转换为BGR格式
    unsigned char* bgrData = new unsigned char[24*24*3];
    for (int i = 0; i < 24*24*3; i += 3)
    {
        bgrData[i] = img[i+2];     // 蓝通道
        bgrData[i+1] = img[i+1];   // 绿通道
        bgrData[i+2] = img[i];     // 红通道
    }
    
    // 创建24位位图并关联像素数据
    if (bmp.CreateBitmap(24, 24, 1, 24, bgrData))
    {
        CBitmap* pOldBmp = memDC.SelectObject(&bmp);
        dc.BitBlt(0, 0, 24, 24, &memDC, 0, 0, SRCCOPY);
        memDC.SelectObject(pOldBmp); // 恢复原位图
    }
    
    delete[] bgrData;
}

另外需确认img生成代码中,m_Image[n]的维度与后续位图尺寸(24x24)匹配,避免数组越界访问。

内容的提问来源于stack exchange,提问作者bongjae kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:42:29