System.Drawing.Image到Visual C++/MFC图片控件

本文关键字:MFC 控件 C++ Drawing Image Visual System | 更新日期: 2023-09-27 18:19:58

我正试图将System.Drawing.Image(在.NET dll中生成)获取到Visual C++/MFC应用程序中的图片控件中。我是COM/Interop的新手,但我有Interop工作。但是,我不知道如何将位图数据从C#传递到C++。

基本流程是:
1.COM服务器上的C++/MFC调用(互操作)
2.C#COM服务器调用.NET DLL
3.在.NET dll中生成System.Drawing.Image
4.C#COM服务器以某种形式返回位图数据(interop)
5.C++/MFC显示位图

在C#COM服务器中,我有:

Bitmap bm = new Bitmap(img);
IntPtr hbm = bm.GetHbitmap();
return hbm;

其中img是我要发送的System.Drawing.Image。该方法返回一个IntPtr,该CCD_5被封送至long*

在我的MFC C++测试应用程序中,我有:

long pOutHB;
pQRCodePtr->Generate(m_sQRText.AllocSysString(), 50, 50, &pOutHB);
HBITMAP hb = (HBITMAP) pOutHB;
m_QRCodePicture.SetBitmap(hb);
m_QRCodePicture.Invalidate();
m_QRCodePicture.UpdateData();

但图片控件中没有任何内容。我还尝试使用HBITMAP创建一个CBitmap,但也没有成功。我已验证.NET dll/COM服务器正在生成有效的映像。

我对这个问题的大部分研究都揭示了使用C++位图并制作System.Drawing.Image,而不是朝着另一个方向发展(比如这个问题:为创建的System.Drawing.Bitmap)将HBITMAP句柄从非托管代码传递到托管代码的安全性

我走的路对吗?我意识到我的代码可能完全错误。我在这里寻找一些能指引我正确方向的东西。我的第一次尝试是传递byte[]数组,但一些读数表明传递HBitmap指针更有效。

System.Drawing.Image到Visual C++/MFC图片控件

为了将来的参考,事实证明我做得很正确。HBITMAP句柄是有效的,即使在从.NET函数返回并通过COM互操作后仍然有效。根据MSDN,您需要清理对象。

添加一些清理,这是有效的。CCD_ 12是对COM包装器服务的调用,其返回被封送至CCD_。

long pOutHB;
pQRCodePtr->Generate(m_sQRText.AllocSysString(), 200, 200, &pOutHB);
HBITMAP hb1 = (HBITMAP) pOutHB;
HBITMAP oldHB = m_QRCodePicture.SetBitmap(hb1);
if (oldHB)
{
    DeleteObject(oldHB);
}