1

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

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

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

  • IE 6 在菜单上选择控件(组合框)

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

  • 还有其他潜在问题吗?

当我使用 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?

4

1 回答 1

2

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

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

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

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

于 2009-05-08T04:21:32.670 回答