MFC:CBitmapCreateCompatibleBitmap() 根据传递给它的两个兼容 CDC 给出不同的结果? [复制]

Posted

技术标签:

【中文标题】MFC:CBitmapCreateCompatibleBitmap() 根据传递给它的两个兼容 CDC 给出不同的结果? [复制]【英文标题】:MFC: CBitmapCreateCompatibleBitmap() gives different results based on two compatible CDC's passed to it? [duplicate] 【发布时间】:2020-08-29 01:06:40 【问题描述】:

为什么将兼容 DC 和兼容 DC 所基于的 DC 传递给 CreateCompatibleBitmap() 会给出不同的结果?

这个创建一个单色位图:

CDC dcMem; 
dcMem.CreateCompatibleDC(mydc);
destBitmap->CreateCompatibleBitmap(&dcMem, rect.Width(), rect.Height());
CBitmap* pBmpOld = dcMem.SelectObject (destBitmap);
// ... Draw on to the DC ....
dcMem.SelectObject (pBmpOld);

这个创建正确的颜色位图:

CDC dcMem; 
dcMem.CreateCompatibleDC(mydc);
destBitmap->CreateCompatibleBitmap (mydc, rect.Width(), rect.Height());
CBitmap* pBmpOld = dcMem.SelectObject (destBitmap);
// ... Draw on to the DC ....
dcMem.SelectObject (pBmpOld);

TIA!!

【问题讨论】:

见CreateCompatibleBitmap下的备注。 我记得 20 年前 dxiv 指出的问题... 进行 win32/MFC 开发的提示:首先,比如说,您使用 API 调用 5-10 次,请阅读相应的 MSDN 文章从头到尾。看起来这会花费很多时间,而且确实会,但它会得到回报 - 几乎每个电话都有许多隐含的假设和上下文知识。但是文档是一流的,经常阅读并熟悉它是能够使用 API 的关键。 【参考方案1】:

根据 cmets,请查看 CreateCompatibleBitmap 文档:

注意:创建内存设备上下文时,它最初会选择一个1×1单色位图。如果在CreateCompatibleBitmap 中使用此内存设备上下文,则创建的位图是单色位图。要创建彩色位图,请使用用于创建内存设备上下文的 HDC,如以下代码所示...

【讨论】:

以上是关于MFC:CBitmapCreateCompatibleBitmap() 根据传递给它的两个兼容 CDC 给出不同的结果? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在mfc中如何使用按钮依次输入数据

c++ mfc 代码

(转载)DLL动态链接库编程入门之五:MFC扩展DLL

MFC控件消息

VS2010-MFC(MFC常用类:MFC异常处理)

mfc 关于Accept函数