COM控件在VB6中:将控件制作成容器

7
我有一个C#控件,我在VB6中使用它,基本上是一个带有圆角的面板。我想知道是否有一种方法可以使该控件成为容器,就像框架是容器一样。基本上,我想能够将东西放在里面,以便它们一起移动,最重要的是将东西放在它的前面。
现在,如果我放置一个标签或命令在其上方,它会在我的COM控件后面,并且使用“Bring to Front”和“Send to Back”没有任何作用。
我需要在VB6中将其声明为容器吗?代码必须来自C#吗?
编辑:
我已经签署了保密协议,所以我无法在这里发布整个代码,但我会发布一些并解释一些。
public class AzPanel : Panel
{
    protected const int BORDER_WIDTH = 3;
    protected int BORDER_RADIUS = 4;
    private object _lock = new object();
    private bool regionNeedsRefresh = false;

    public AzPanel() : base()
    {
        this.SetStyle(
          ControlStyles.DoubleBuffer |
          ControlStyles.AllPaintingInWmPaint |
          ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.SetStyle(ControlStyles.Selectable, false);
        base.BackColor = Color.Transparent;
        this.BorderColor = Color.DarkRed;
        this.ContentColor = Color.DarkGoldenrod;
        this.DoubleBuffered = true;

        base.Padding = new Padding(3, 3, 4, 4);
    }
}

还有其他一些用于定义带圆角区域的代码,但基本上只是一个面板。我有一个类扩展了AzPanel,名为AzPanelCOM,具有以下属性:

[Guid("...")]
[ProgId...]
[ComVisible(true)]
[ComdefaultInterface...]
[ClassInterface(ClassInterfaceType.AutoDispatch)]

除了接口IAzPanelCOM之外,还有界面来将其暴露给VB6。

[Guid("...")]
[ComVisible(true)]
public interface IAzPanelCOM
{
    void DesignTimeReload();
    //some other things
}

在构建过程中,我使用 "regasm.exe" 来创建一个类型库(tlb),然后在运行 Windows xp 和 vs2010(.net framework 4.0)的虚拟机中导入该库到 VB6 中。
然后,我可以实例化 AzPanels、在设计时调整它们的大小和移动它们,并且可以毫无问题地向它们添加命令(按钮)。但是,当涉及到形状或标签时,它们似乎出现在面板的后面,我无法将它们置于最前面。

所以我已经将大部分工作完成,但似乎这是容易的部分。我能够使我的面板成为一个容器,但将形状、线条和标签“放在里面”会使它们位于控件后面。它们都随控件移动,但是不可见。非常感谢任何帮助! - Felix
我很乐意帮助你调试,但我不知道你的代码长成什么样子... - djv
2
只是为了确认一下,您是通过COM在VB6中使用.NET控件。快速搜索发现:http://social.msdn.microsoft.com/Forums/en-US/vbinterop/thread/1beac437-b5d8-42c9-b226-45688c6d5962简而言之:该控件作为公共控件公开,但不实现相同的接口,因此无法向其添加控件。 - Fry
2
@tijizor,你无法在 .NET 容器组件中使用无窗口控件(如形状、标签等)。但是,你可以在 .NET 组件内部使用 VB 窗口控件,例如 Frame(无边框)或 Picture Box,并将这些无窗口控件放置在其中。 - Mark Bertenshaw
@MarkBertenshaw:我认为你应该将其作为回答添加到这个问题中。 - Herman
1个回答

1
根据@MarkBertenshaw的评论:
不能在.NET容器组件中使用无窗口控件(如形状、标签等)。但是,您可以在.NET组件内部使用VB窗口控件,例如Frame(无边框)或Picture Box,并将这些无窗口控件放置在其中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接