2

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

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

我遇到的选项是:

  1. 我的控件扩展了 ScrollableControlContainerControl
  2. 我的控件实例化了一个HScrollBarVScrollBar控件并相应地放置它们
  3. 我的控件使用ScrollBarRenderer自定义绘制滚动条

我不确定这些选项中的哪一个是我控制的最佳实践。

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

我尝试实例化 HScrollBar 和 VScrollBar,但这似乎非常有问题,并且无法很好地处理焦点,我无法弄清楚如何正确捕获 VScroll 和 HScroll 事件。

我尝试使用ScrollBarRenderer,但这似乎只是为了实现滚动条而付出了巨大的努力,并且使用这种方法,我仍然必须适当地捕获和处理事件。

那么我应该使用哪些方法,或者确实是我可能忽略的方法?

4

1 回答 1

6

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

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

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

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 控件。

于 2013-01-18T14:35:52.030 回答