WinForms 应用程序无法成功导入从 MFC 应用程序导出的图像
WinForms apps can not successfully import images exported from MFC apps
简介及相关信息:
我们有用 C++ 编写的 MFC OCX 控件,可以将图像导出到压缩的 MFC CArchive
(使用 ZLib 压缩存档)。
OCX 控件还可以导入那些导出的图像(用 ZLib 将它们解压缩到 CArchive
,然后在其客户区渲染 CArchive
)。
它用于几个关键应用程序,一些用 MFC 编写,一些用 WinForms 编写。
问题:
WinForms 应用程序无法成功导入从 MFC 应用程序导出的图像。
将从 WinForms 导出的图像导入 MFC 工作正常。
从 MFC 导出并导入回 MFC 工作正常。
从 WinForms 导出并重新导入 WinForms 工作正常。
MVCE:
我制作了小型演示 OCX 控件以及小型 MFC 和 WinForms 使用者来说明问题。
GitHub link 是 here.
我的努力:
调试显示 DemoOCX 应用程序中的 ReadImagesFromCArchive(...)
调用失败,更具体地说 CImageList::Read(...)
。
可悲的是,我找不到调试 CImageList::Read(...)
.
的方法
我试图弄清楚 Read
是如何在引擎盖下工作的,并偶然发现了 this。
在 DemoOCX 和消费者应用程序中启用视觉样式后,一切正常。
尽管在实际应用中启用视觉样式并没有解决问题。
WinForms 应用程序有很多第 3 方组件,主要是 OCX。其中一些仍然具有旧的外观。
问题:
有没有办法重写 DemoOCX 中的代码,从而不需要启用视觉样式?
如果有,请教我怎么做?
如果你能提供上述方法的替代方案,我会接受。
因为我不知道如何开始解决这个问题,所以我对一切都持开放态度和感激之情。
注意:这更像是一个扩展评论而不是一个答案,但是当我尝试你的链接项目时产生了几个构建错误,我放弃了修复所有问题的尝试问题以确认是否是以下问题。
I have tried to figure out how Read works under the hood and stumbled upon this.
您误解了以下内容的意图:
ImageList_WriteEx function (commctrl.h)-Remarks
To use ImageList_WriteEx, the application must specify Comctl32.dll version 6 in the manifest. For more information on manifests, see Enabling Visual Styles.
这并不意味着您需要启用视觉样式,而是您的项目需要一个指定使用 Comctl32.dll 版本 6 的清单文件,并且“启用视觉样式”文档说明了如何创建清单.
在OCXTesterCS项目中,添加清单文件(项目菜单->添加新项->Select“Application Manifest File (Windows Only)”;接受默认名称“app.manifest").
在此文件的末尾,您将找到此块:
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
删除环绕注释标签(<!--
和 -->
)以启用并保存文件。
简介及相关信息:
我们有用 C++ 编写的 MFC OCX 控件,可以将图像导出到压缩的 MFC CArchive
(使用 ZLib 压缩存档)。
OCX 控件还可以导入那些导出的图像(用 ZLib 将它们解压缩到 CArchive
,然后在其客户区渲染 CArchive
)。
它用于几个关键应用程序,一些用 MFC 编写,一些用 WinForms 编写。
问题:
WinForms 应用程序无法成功导入从 MFC 应用程序导出的图像。
将从 WinForms 导出的图像导入 MFC 工作正常。
从 MFC 导出并导入回 MFC 工作正常。
从 WinForms 导出并重新导入 WinForms 工作正常。
MVCE:
我制作了小型演示 OCX 控件以及小型 MFC 和 WinForms 使用者来说明问题。
GitHub link 是 here.
我的努力:
调试显示 DemoOCX 应用程序中的 ReadImagesFromCArchive(...)
调用失败,更具体地说 CImageList::Read(...)
。
可悲的是,我找不到调试 CImageList::Read(...)
.
的方法
我试图弄清楚 Read
是如何在引擎盖下工作的,并偶然发现了 this。
在 DemoOCX 和消费者应用程序中启用视觉样式后,一切正常。
尽管在实际应用中启用视觉样式并没有解决问题。
WinForms 应用程序有很多第 3 方组件,主要是 OCX。其中一些仍然具有旧的外观。
问题:
有没有办法重写 DemoOCX 中的代码,从而不需要启用视觉样式?
如果有,请教我怎么做?
如果你能提供上述方法的替代方案,我会接受。
因为我不知道如何开始解决这个问题,所以我对一切都持开放态度和感激之情。
注意:这更像是一个扩展评论而不是一个答案,但是当我尝试你的链接项目时产生了几个构建错误,我放弃了修复所有问题的尝试问题以确认是否是以下问题。
I have tried to figure out how Read works under the hood and stumbled upon this.
您误解了以下内容的意图:
ImageList_WriteEx function (commctrl.h)-Remarks
To use ImageList_WriteEx, the application must specify Comctl32.dll version 6 in the manifest. For more information on manifests, see Enabling Visual Styles.
这并不意味着您需要启用视觉样式,而是您的项目需要一个指定使用 Comctl32.dll 版本 6 的清单文件,并且“启用视觉样式”文档说明了如何创建清单.
在OCXTesterCS项目中,添加清单文件(项目菜单->添加新项->Select“Application Manifest File (Windows Only)”;接受默认名称“app.manifest").
在此文件的末尾,您将找到此块:
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
删除环绕注释标签(<!--
和 -->
)以启用并保存文件。