2013-01-18 37 views
2

我正在爲語法編輯設計一個windows窗體控件。我知道那裏已經有很多了,比如ScintillaFastColoredTextBoxActipro Syntax Edito r,Avalon Edit等等。我有設計我自己的理由,所以這不是問題。C#.NET中可滾動控件的最佳實踐方法

到目前爲止,我一直在設計控件的外觀和感覺。它需要能夠垂直控制和水平控制。

我所遇到的選項是:

  1. 我的控制擴展ScrollableControlContainerControl
  2. 我的控制實例化一個HScrollBar和​​控制和他們相應
  3. 我的控制使用ScrollBarRenderer地方風俗繪製滾動條

我不確定哪些選項對我來說是最佳實踐。

我試過使用ScrollableControlContainerControl,但是這有一些非常不希望的結果,可能是因爲控件DisplayRectangle正在滾動......我不想這樣。我想滾動一個自定義繪製的矩形,其中包含文本。我試着實例化HScrollBar和VScrollBar,但是這看起來很麻煩,並且不能很好地處理焦點,我也無法弄清楚如何正確捕獲VScroll和HScroll事件。

我嘗試使用ScrollBarRenderer,但這似乎是一個很大的努力只是爲了實現一個滾動條地獄,用這種方法,我仍然必須捕捉和處理適當的事件。

那麼我應該使用哪種方法,或者實際上我可能忽略了一種方法?

+0

你很早就被困住了,接下來的41個問題更難解決。滾動條實際上​​並不滾動任何東西,它只是告訴你從哪裏開始繪製。 –

+0

輪子發明家是**最好的**! – Bitterblue

回答

6

ScrollBarRenderer僅用於繪製滾動條,它實際上並不執行任何滾動計算或操作。

就我個人而言,我發現HScrollBar和VScrollBar相當笨拙的控制工作。

繼承自ScrollableControl(或Panel以獲取內置的Windows控件邊框)可能是最簡單的。您可以使用AutoScrollMinSize屬性還設置了內表面的大小,然後進行對顯卡一個TranslateTransform對象使用AutoScrollPosition屬性來處理「其中」繪製控件的一部分:

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

+0

感謝您的回答。我肯定從未在...之前探索過TranslateTransform方法,所以我會玩弄它。在使用RichTextBox方面,我已經看到很多使用這種方法的實現,但是當你達到合理的文件大小(比如1000行)時,它們都非常慢。另外,RichTextBox不支持行號,視覺線索,代碼摺疊等,這些都是我打算實現的功能。我知道有一些像Scintilla一樣,但即使這些在某些方面缺乏! – series0ne