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); }
二、第二个代码无显示的原因
这段代码存在多个关键错误:
- 未初始化内存DC:直接使用
memDC但未调用CreateCompatibleDC(&dc)创建与窗口DC兼容的内存DC。 - 函数名大小写错误:MFC中CBitmap的创建函数是
CreateBitmap(首字母大写),而非createBitmap,会导致函数调用无效。 - 像素格式不匹配:Windows 24位位图的像素存储顺序是BGR,但你的
img数据按RGB顺序填充,格式不兼容会导致无法正常渲染。 - 未恢复原位图:选入新位图后未恢复内存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
相关产品推荐
相关产品推荐

