VB6中的COM控件:从控件中创建一个容器
本文关键字:控件 一个 创建 COM 中的 VB6 | 更新日期: 2023-09-27 18:08:00
我有一个c#控件,我在VB6内部使用,这基本上是一个圆角面板。我想知道是否有办法让那个控件成为一个容器,就像Frame是一个容器一样。基本上,我希望能够把东西放在它里面,这样它们就能一起移动,最重要的是把东西放在的前面。
现在,如果我在它上面放一个标签或一个命令,它就在我的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中导入。
然后我可以实例化azpanel,调整它们的大小,甚至在设计时移动它们,我可以向它们添加命令(按钮),没有问题。然而,当涉及到形状或标签时,它们似乎出现在面板后面,我无法将它们带到前面。
根据@MarkBertenshaw评论
你不能在。net容器组件中使用无窗口控件(形状、标签等)。然而,你可以在。net组件中使用VB窗口控件,例如Frame(无边框)或Picture Box,你可以在其中放置那些无窗口控件