【问题标题】:Why VB6.0 form displays as C# form?为什么VB6.0窗体显示为C#窗体?
【发布时间】:2012-11-28 14:28:49
【问题描述】:

我有一个带有表单的 COM DLL。此 DLL 由 C# 应用程序使用。我为我的 C# 应用程序启用了视觉样式。我不希望将视觉样式应用于 COM DLL 的表单。但是当我运行我的应用程序并启动 COM DLL 的表单时,它应用了视觉样式。我将如何预防?

许多人建议使用清单。但是,无论我在互联网上看到什么清单,它们都使用通用控件 6. 如何创建使用通用控件 5.0 的清单? 有些人还建议使用 ActivationContext。但是,这也需要使用通用控件 5.0 的正确清单,对吗?

请提出建议。

【问题讨论】:

  • 您必须在 vb6 代码中使用 CreateActCtx。这很难做对。在你的 UI 中使用不一致的样式是没有意义的。
  • 清单是每个进程的。您需要为您的窗口使用进程外 COM 主机。请注意,某些 DLL 有一些方法可以使用不同的清单,这需要主机应用程序的支持。
  • 您可以尝试使 VB6 DLL 中的表单与公共控件 6 清单一起工作。 This VBAccelerator article 是一个很好的起点
  • ... 或者只是在 C# 项目中关闭视觉样式,这可能是解决问题的最快方法。我假设您在使用 VB6 表单时遇到了一些问题?
  • 您是否面临将视觉样式应用于 VB6 的“黑色控件”错误?解决方法是将“黑色”控件放在图片框上!

标签: c# winforms vb6


【解决方案1】:

如果您有窗体的窗口句柄(来自 COM DLL),那么您可以使用 Win32 API 禁用该窗体上的视觉样式:

SetWindowTheme( hwnd, "", "" );

我相信您必须 P/Invoke API。这是定义:

[DllImport("uxtheme.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
public static extern int SetWindowTheme(
   IntPtr hWnd,
   String pszSubAppName,
   String pszSubIdList);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多