绘制用户窗体子面板的正确或首选方法是什么



一个例子:

使用VS,我可以创建派生自UserControl的MyControl,可以添加一组数据作为成员或属性。使用可视化设计器,我可以向 MyControl 添加两个面板 - 每个面板旨在使用我打算提供的方法呈现相同的数据,但形式不同(FTSOA 表示饼图和条形图)。

我认为有许多方法可以让MyControl使用这些方法来重绘面板。

首先使用 VS 为每个面板添加一个绘制事件。这是快速实现的,并允许方法在 MyControl 类中创建时访问 MyControl 数据。

其次,重写每个面板的 OnPaint 方法。AFAIK 要执行此操作,需要为每个具有关联类的面板创建一个用户控件。然后可以重写每个类的 OnPaint 方法。缺点是必须向每个类授予对 MyControl 数据的访问权限。

第三,也可能(我没有做过这个)覆盖MyControl OnPaint并手动重新绘制每个面板 - 但是掌握图形等是一个问题。

问题:我可以让(1和2)工作,但我想知道其他人的想法。

好吧,以上所有。 但是面板控件肯定没有经过优化,无法成为非常好的绘画控件。 它源自ScrollableControl,这就是它真正擅长的,一个可以滚动其内容的容器。 作为移动一组控件的快速方法也很好。 或者隐藏它们。 或禁用它们。

它并不完全适合绘画。 它不会双重缓冲,打开它需要从中派生您自己的控件。 它还针对容器行为进行了优化,您需要打开 ControlStyles.ResizeRedraw 样式,以使 Paint 事件在调整大小时触发该事件。 如果您实际上需要自定义绘制,并且还需要可滚动,那么 Panel 是一个很好的基类。

对我来说,你真的应该覆盖UserControl的OnPaint()方法。 最小化控件的数量是一个非常强大的优化目标,它们真的很昂贵。

最新更新