VB6中的COM控件:从控件中创建一个容器

本文关键字:控件 一个 创建 COM 中的 VB6 | 更新日期: 2023-09-27 18:08:00

我有一个c#控件,我在VB6内部使用,这基本上是一个圆角面板。我想知道是否有办法让那个控件成为一个容器,就像Frame是一个容器一样。基本上,我希望能够把东西放在它里面,这样它们就能一起移动,最重要的是把东西放在的前面。

现在,如果我在它上面放一个标签或一个命令,它就在我的COM控件后面,使用Bring to FrontSend 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中导入。

然后我可以实例化azpanel,调整它们的大小,甚至在设计时移动它们,我可以向它们添加命令(按钮),没有问题。然而,当涉及到形状或标签时,它们似乎出现在面板后面,我无法将它们带到前面。

VB6中的COM控件:从控件中创建一个容器

根据@MarkBertenshaw评论

你不能在。net容器组件中使用无窗口控件(形状、标签等)。然而,你可以在。net组件中使用VB窗口控件,例如Frame(无边框)或Picture Box,你可以在其中放置那些无窗口控件