代码之家  ›  专栏  ›  技术社区  ›  ChrisW

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

  •  1
  • ChrisW  · 技术社区  · 15 年前

    我有一个自定义控件:它是托管代码,子类为system.windows.forms.control。

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

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

    • IE 6 select controls(Combo Box) over menu

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

    • 还有其他潜在的问题吗?

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

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

    问题:

    • 是将标准控件重用为自定义控件的子级,还是在自定义控件本身中重新实现标准控件的功能?
    • 您是否有任何要分享的警告(警告),与任何一个场景相关?
    • 如果我想在自定义控件中重新实现标准控件的功能,您知道我可以重用的任何现有代码(实现此功能的代码)吗?

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


    编辑

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

    1 回复  |  直到 15 年前
        1
  •  2
  •   Judah Gabriel Himango    15 年前

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

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

    应该注意的是,Zune软件是.NET管理的代码,它也使用自定义控件;如果您尝试在任何控件上使用Spy++,就会发现它们不是真正的win32控件。你可以使用Zune软件上的Reflector来查看他们在做什么。如果我记得对的话,他们使用的是Zune软件中包含的自定义托管用户界面框架。

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