我有一个c#控件,我在VB6中使用,它基本上是一个带圆角的面板。我想知道是否有办法将控件制作成容器,就像Frame是一个容器。基本上我希望能够把东西放在里面让他们一起移动,最重要的是把东西放在的前面之内。VB6中的COM控件:使容器脱离控制
现在,如果我在其上放置一个标签或命令,它就落后于我的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),我在VB6导入运行Windows XP和VS2010(.NET Framework 4.0中)的虚拟机上。
然后,我可以实例化AzPanels,调整它们的大小并在设计时移动它们,并且我可以向它们添加命令(按钮)而不会出现任何问题。然而,当涉及形状或标签时,它们似乎出现在面板后面,我无法将它们带到前面。
所以我大部分工作正常,但它看起来很容易。我能够做到这一点,所以我的面板是一个容器,但放置形状,线条和标签“内部”将它们放在我的控制之下。他们都随着控制而移动,但看不见。任何帮助将非常感激! – Felix 2013-04-10 12:18:13
我很乐意帮助你调试,但我不知道你的代码是什么样的...... – djv 2013-04-15 14:53:02
只是为了仔细检查,你是通过COM在VB6中使用.net控件。快速搜索揭示了这一点:http://social.msdn.microsoft.com/Forums/en-US/vbinterop/thread/1beac437-b5d8-42c9-b226-45688c6d5962 tl; dr:该控件是公开的常见控制,但不实现相同的接口,所以你不能添加控制。 – Fry 2013-04-15 15:41:54