2013-01-18 3 views
2

구문 편집을위한 Windows 폼 컨트롤을 디자인하고 있습니다. Scintilla, FastColoredTextBox, Actipro Syntax Edito r, Avalon Edit 등등과 같은 이미 많은 정보가 있습니다. 내 자신을 설계하는 이유가 있으므로 문제가되지 않습니다.C# .NET에서 스크롤 가능한 컨트롤을위한 최선의 방법

지금까지 저는 컨트롤의 모양과 느낌을 디자인했습니다. 수직 및 수평으로 제어 할 수 있어야합니다. 내가 건너 한

옵션은 다음과 같습니다

  1. 내 컨트롤은 ScrollableControl 또는 ContainerControl
  2. 내 컨트롤이 HScrollBarVScrollBar 컨트롤의 인스턴스를 확장하고 사용자 정의에 따라
  3. 내 컨트롤을 사용 ScrollBarRenderer 배치 스크롤바 그리기

이러한 옵션 중 어느 것이 제 제어를위한 모범 사례인지 확실하지 않습니다.

ScrollableControlContainerControl을 사용해 보았지만 컨트롤이 DisplayRectangle 이었기 때문에 매우 바람직하지 않은 결과가 나왔습니다 ... 나는 이것을 원하지 않습니다. 텍스트를 보유하는 사용자 정의 그리기 사각형을 스크롤하고 싶습니다.

HScrollBar 및 VScrollBar의 인스턴스를 만들려고했으나 매우 버그가있는 것 같았고 포커스가 잘 맞지 않아 VScroll 및 HScroll 이벤트를 올바르게 캡처하는 방법을 찾지 못했습니다.

ScrollBarRenderer을 사용해 보았습니다. 그러나 이것은 스크롤바를 구현하기 위해 많은 노력을 기울였습니다.이 방법을 사용하면 이벤트를 적절하게 캡처하고 처리해야합니다.

이러한 접근 방식 중 어느 것을 사용해야합니까, 아니면 실제로 간과 한 접근 방식입니까?

+0

당신은 일찍 고생하고 있습니다. 다음 41 개 문제는 해결하기가 훨씬 어렵습니다. 스크롤바는 실제로 아무 것도 스크롤하지 않고 그냥 그림을 시작할 위치를 알려줍니다. –

+0

휠 발명자는 ** 최고 **입니다! – Bitterblue

답변

6

ScrollBarRenderer는 스크롤 막대를 그릴 때만 사용되며 실제로는 스크롤 계산이나 동작을 수행하지 않습니다.

개인적으로, 나는 HScrollBar 및 VScrollBar가 다소 어색한 컨트롤이 작동하는 것을 발견했습니다.

아마도 ScrollableControl (또는 Panel에 내장 된 윈도우 컨트롤 테두리를 가져 오는 것)이 가장 쉽습니다.

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)); 
    } 
} 

비록주의 : 당신은 "여기서"컨트롤의 부분을 그립니다 처리 할 AutoScrollPosition 속성을 사용하여 객체 내부 표면의 크기를 설정 한 다음 그래픽에 TranslateTransform을 수행 할 AutoScrollMinSize 속성을 사용하여 구문 텍스트 편집기는 드로잉 제어와는 다른 짐승입니다. RichTextBox 컨트롤을 사용하는 것이 좋습니다.

+0

이 답변을 제공해 주셔서 감사합니다. 전에 확실히 TranslateTransform 메서드를 살펴 본 적이 없었습니다 ... 그래서 나는 그걸 가지고 놀 것입니다. RichTextBox를 사용하는 측면에서 나는 이것을 사용하는 많은 구현을 이미 보았지만 합리적인 파일 크기 (예 : 1000 라인)를 얻는다면 모두 느리다.또한 RichTextBox는 구현하려는 모든 기능인 행 번호, 시각적 신호, 코드 접기 등을 지원하지 않습니다. 나는 신틸라와 같은 몇몇이 있다는 것을 알고있다. 그러나 이것들조차도 어떤면에서는 부족하다! – series0ne