2

構文編集用の Windows フォーム コントロールを設計しています。ScintillaFastColoredTextBoxActipro Syntax EditorAvalon Editなど、すでにたくさんあることは知っています。自分でデザインする理由があるので、それは問題ではありません。

ここまでは、コントロールのルック アンド フィールをデザインしてきました。垂直方向と水平方向を制御できる必要があります。

私が遭遇したオプションは次のとおりです。

  1. 私のコントロールはScrollableControlまたはContainerControlを拡張します
  2. 私のコントロールはHScrollBarVScrollBarコントロールをインスタンス化し、それに応じて配置します
  3. 私のコントロールはScrollBarRendererを使用してスクロールバーをカスタム描画します

これらのオプションのどれが私のコントロールのベスト プラクティスになるかわかりません。

ScrollableControlContainerControlを使用してみましたが、おそらくコントロールDisplayRectangleがスクロールしていたため、非常に望ましくない結果が得られました...これは望ましくありません。テキストを保持するカスタム描画長方形をスクロールしたい。

HScrollBar と VScrollBar のインスタンス化を試みましたが、これは非常にバグがあるようで、フォーカスでうまく機能せず、VScroll と HScroll のイベントを適切にキャプチャする方法がわかりませんでした。

ScrollBarRendererを使用してみましたが、スクロールバーを実装するだけでも大変な作業のように思えます。このアプローチでは、イベントを適切にキャプチャして処理する必要があります。

では、これらのアプローチのどれを使用する必要がありますか、または実際に見落とした可能性のあるアプローチですか?

4

1 に答える 1

6

ScrollBarRenderer はスクロールバーを描画するためだけに使用され、実際にはスクロールの計算やアクションを実行しません。

個人的には、HScrollBar と VScrollBar のコントロールはかなり扱いにくいと思います。

ScrollableControl (または組み込みの Windows コントロールの境界線を取得するための Panel) から継承するのがおそらく最も簡単です。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 に答える