Best practice approach for scrollable control in C# .NET

我与影子孤独终老i 提交于 2019-12-22 17:57:48

问题


I am designing a windows forms control for Syntax Editing. I know there are already a lot out there, like Scintilla, FastColoredTextBox, Actipro Syntax Editor, Avalon Edit etc. I have reasons for designing my own, so that's not the issue.

So far I have been designing the look and feel of the control. It will need to be able to control vertically, and horizontally.

The options I have come across are:

  1. My control extends ScrollableControl or ContainerControl
  2. My control instantiates a HScrollBar and VScrollBar control and places them accordingly
  3. My control uses ScrollBarRenderer to custom draw the scrollbars

I am not sure which of these options would be best practice for my control.

I tried using ScrollableControl and ContainerControl, but this had some very undesired results, probably because the controls DisplayRectangle was scrolling...I don't want this. I want to scroll a custom drawn rectangle which holds the text.

I tried instantiating HScrollBar and VScrollBar, but this seemed very buggy, and didn't work well with focus and I couldn't work out how to properly capture VScroll and HScroll events.

I tried using ScrollBarRenderer, but this seems like a hell of a lot of effort just to implement a scrollbar, and with this approach, I would still have to capture and handle the events appropriately.

So which of these approaches should I be using, or indeed an approach I may have overlooked?


回答1:


A ScrollBarRenderer is only used to draw a scrollbar, it doesn't actually perform any scroll calculations nor actions.

Personally, I find the HScrollBar and VScrollBar rather clumsy controls to work.

Inheriting from the ScrollableControl (or Panel to get a built-in windows control border) is probably the easiest. You use the AutoScrollMinSize property to set the size of the interior surface, and then perform a TranslateTransform on the graphics object using the AutoScrollPosition property to handle the "where" to draw part of the control:

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

Be careful though, a syntax text editor is a different beast that a drawing control. I would advise using a RichTextBox control for that.



来源:https://stackoverflow.com/questions/14396964/best-practice-approach-for-scrollable-control-in-c-sharp-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!