C#.NET中可滚动控件的最佳实践方法

时间:2013-01-18 10:30:58

标签: c# .net custom-controls scrollable

我正在为语法编辑设计一个Windows窗体控件。我知道那里已经有很多,比如ScintillaFastColoredTextBoxActipro Syntax Edito r,Avalon Edit等等。我有理由设计自己的,所以这不是问题

到目前为止,我一直在设计控件的外观和感觉。它需要能够垂直和水平控制。

我遇到的选项是:

  1. 我的控件扩展为ScrollableControlContainerControl
  2. 我的控件实例化HScrollBarVScrollBar控件并相应地放置它们
  3. 我的控件使用ScrollBarRenderer自定义绘制滚动条
  4. 我不确定这些选项中的哪一个对我的控制来说是最佳做法。

    我尝试使用ScrollableControlContainerControl,但这有一些非常不受欢迎的结果,可能是因为控件DisplayRectangle正在滚动...我不想要这个。我想滚动一个包含文本的自定义绘制矩形。

    我尝试了实例化HScrollBar和VScrollBar,但这看起来非常错误,并且在焦点方面效果不佳,我无法弄清楚如何正确捕获VScroll和HScroll事件。

    我尝试使用ScrollBarRenderer,但这似乎只是为了实现滚动条而付出了很多努力,而使用这种方法,我仍然需要适当地捕获和处理事件。

    那么我应该使用哪种方法,或者我可能忽略的方法呢?

1 个答案:

答案 0 :(得分:6)

ScrollBarRenderer仅用于绘制滚动条,它实际上不执行任何滚动计算或操作。

就个人而言,我发现HScrollBar和VScrollBar相当笨拙的控件可以工作。

继承ScrollableControl(或Panel以获取内置的Windows控件边框)可能是最简单的。您可以使用AutoScrollMinSize属性设置内部曲面的大小,然后使用AutoScrollPosition属性对图形对象执行TranslateTransform,以处理绘制部分控件的“where”:

public class ScrollControl : ScrollableControl {

  public ScrollControl() {
    this.DoubleBuffered = true;
    this.ResizeRedraw = true;
    this.AutoScrollMinSize = new Size(0, 600);
  }

  protected override void OnPaint(PaintEventArgs e) {
    base.OnPaint(e);

    e.Graphics.Clear(Color.White);
    e.Graphics.TranslateTransform(this.AutoScrollPosition.X, 
                                  this.AutoScrollPosition.Y);
    e.Graphics.FillRectangle(Brushes.Red, new Rectangle(16, 32, 64, 32));
  }
}

但要小心,语法文本编辑器与绘图控件不同。我建议使用RichTextBox控件。