重写标准控件,如编辑,组合等?

时间:2009-05-08 04:14:42

标签: controls combobox edit

我有一个自定义控件:它是托管代码,它是System.Windows.Forms.Control的子类。

我想在此控件上添加编辑框,选择列表,组合框,单选按钮等内容。一种简单的方法是简单地将这些类的实例添加到Controls集合中,以便它们成为子控件。

将它们添加为子控件可能会产生一些微妙的问题,例如:

  • IE 6 select controls(Combo Box) over menu

  • 我的控件上有滚动条,它似乎滚动控件的内容(内容大于控件本身);当一个子控件靠近屏幕边缘时,我想半显示(即剪辑)那个孩子(即将其中一半放在物理屏幕的边缘),但真正的孩子控制不能是位于其父母边界之外。

  • 还有其他潜在问题吗?

当我使用IE7显示http://www.tizag.com/htmlT/htmlselect.php(例如),其中包含组合框等,当我在使用Spy ++监视IE7时,我只看到一个Window /没有子节点的控件实例(其类名为“Internet Explorer_Server”)。

我猜这意味着在IE7中,渲染组合框的功能内置于IE7控件本身,并且IE7不使用标准控件作为子控件。

问题:

  • 将标准控件重用为自定义控件的子项,或者在自定义控件本身中重新实现标准控件的功能是否更好?
  • 您是否有任何与这两种情况相关的警告(警告)?
  • 如果我想在自定义控件中重新实现标准控件的功能,您知道我可以重用的任何现有代码(实现此功能)吗?

如果这样的代码已经存在,我不知道如何搜索它(我的搜索找到,例如,所有者绘制的组合框,以及标准组合框的扩展名):也许很少有人从头开始重新实现标准控件?


修改

我找到了一个半相关的问题:How to render a control to look like ComboBox with Visual Styles enabled?

1 个答案:

答案 0 :(得分:2)

是的,Internet Explorer使用Windows主题API绘制控件。您也可以使用System.Windows.Forms.VisualStyles命名空间中定义的类型执行此操作。

IE团队这样做是为了避免在屏幕上同时显示拥有如此多控件的每个接收窗口消息的性能问题。例如,查看此StackOverflow.com页面,我看到30-40个链接标签控件,10个按钮左右,20个以上标签等。

应该注意的是Zune软件,它是.NET托管代码,也使用自定义控件;如果你试图在任何控件上使用Spy ++,你会发现它们不是真正的Win32控件。您可以在Zune软件上使用Reflector来确切了解他们正在做什么。如果我没记错,他们正在使用Zune软件中包含的自定义托管UI框架。

至于从头开始重写这些控件,我认为还有很多工作要做。这听起来比实际更容易。