VB6中的COM控件:使容器不受控制

Fel*_*lix 7 c# vb6 com containers

我在VB6中使用了ac #control,它基本上是一个带圆角的面板.我想知道是否有办法使控件成为一个容器,有点像Frame是一个容器.基本上我希望能够把东西放在里面,这样它们就可以一起移动,最重要的是把东西放在它的前面.

现在,如果我在它上面放置一个标签或命令,它就会落后于我的COM控件并使用Bring to Front并且Send to Back什么都不做.

我是否需要在vb6中将其声明为容器?代码必须来自c#吗?

编辑:

我签了一份NDA,所以我不能在这里发布完整的代码,但我会发布一些并解释一下.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一些其他的东西来定义一个带圆角的区域,但它基本上只是一个面板.我有一个使用以下属性扩展AzPanel,AzPanelCOM的类:

[Guid("...")]
[ProgId...]
[ComVisible(true)]
[ComdefaultInterface...]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
Run Code Online (Sandbox Code Playgroud)

以及一个接口,IAzPanelCOM,将它暴露给VB6.

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

在构建时,我使用"regasm.exe"创建一个类型库(tlb),我在运行Windows xp和vs2010(.net framework 4.0)的虚拟机上导入VB6.

然后我可以实例化AzPanels,调整它们并在设计时移动它们,我可以毫无问题地向它们添加命令(按钮).然而,当谈到形状或标签时,它们似乎出现在面板后面,我无法将它们带到前面.

Tob*_*len 1

根据@MarkBertenshaw 评论

您不能将无窗口控件(形状、标签等)与 .NET 容器组件一起使用。但是,您可以使用 VB 窗口控件,例如 .NET 组件内的 Frame(无边框)或 Picture Box,您可以将这些无窗口控件放入其中