2010-02-21 65 views
4

我无法在自定义控件中进行滚动操作。目前它绘制自己的内容(目前只是网格),应该被视为有大面积工作。但是,我无法滚动工作。自定义控制和滚动,帮助?

AutoScroll打开后,我无法将它启动到可工作区域的中心。

关闭AutoScroll后,我无法获得滚动条的值,无论我将它们设置为代码还是实际滚动。

最重要的是,当使用单独的HScroll和VScroll控件时,根本不显示滚动条。

代码尝试关闭AutoScroll的当前状态,但是我承认我无法在没有任何帮助的情况下按照自己的意愿做任何事情。

所以请大家帮忙!

这里是到目前为止的代码:

public partial class TwoDimensionViewport : ScrollableControl 
{ 
    private readonly Point MinOffset = new Point(-4000000, -4000000); 
    private readonly Point MaxOffset = new Point(4000000, 4000000); 

    private Point viewOffset; 

    public TwoDimensionViewport() 
    { 
     InitializeComponent(); 
     DoubleBuffered = true; 
     GridSize = 16; 
     AutoScroll = false;    
     AdjustFormScrollbars(true); 
    } 

    protected override void AdjustFormScrollbars(bool displayScrollbars) 
    {    
     VerticalScroll.Minimum = 0; 
     VerticalScroll.Maximum = 8000000; 
     HorizontalScroll.Minimum = 0; 
     HorizontalScroll.Maximum = 8000000; 
     HorizontalScroll.Enabled = true; 
     VerticalScroll.Enabled = true;    
     HorizontalScroll.Visible = true; 
     VerticalScroll.Visible = true; 

     HorizontalScroll.Value = viewOffset.X + 4000000; 
     VerticalScroll.Value = viewOffset.Y + 4000000;    
    }   

    private ViewSettingsProvider viewSettingsProvider; 
    public ViewSettingsProvider ViewSettingsProvider 
    { 
     get 
     { 
      return viewSettingsProvider; 
     } 
     set 
     { 
      UnbindViewSettingsProvider(); 
      viewSettingsProvider = value; 
      BindViewSettingsProvider(); 
     } 
    } 

    public int GridSize { get; private set; } 

    protected override void OnScroll(ScrollEventArgs se) 
    { 
     base.OnScroll(se); 

     if (se.ScrollOrientation == ScrollOrientation.HorizontalScroll) 
     { 
      viewOffset.X = se.NewValue - 4000000;     
     } 
     else if (se.ScrollOrientation == ScrollOrientation.VerticalScroll) 
     { 
      viewOffset.Y = se.NewValue - 4000000; 
     }       

     Invalidate();       
    } 

    protected override void OnPaint(PaintEventArgs pe) 
    {    
     pe.Graphics.FillRectangle(Brushes.Black, pe.ClipRectangle); 

     DrawGrid(pe.Graphics);    

     base.OnPaint(pe); 
    } 

    private void DrawGrid(Graphics graphics) 
    { 
     for (int i = 0, count = 0; i < ClientRectangle.Width; i++) 
     { 
      bool increaseCount = false; 

      if ((i - viewOffset.X) % GridSize == 0) 
      { 
       graphics.DrawLine(
        count % 5 == 0 ? Pens.White : Pens.DarkGray, 
        i, 0, 
        i, ClientRectangle.Height); 

       increaseCount = true; 
      } 

      if ((i - viewOffset.Y) % GridSize == 0) 
      { 
       graphics.DrawLine(
        count % 5 == 0 ? Pens.White : Pens.DarkGray, 
        0, i, 
        ClientRectangle.Width, i); 

       increaseCount = true; 
      } 

      if (increaseCount) 
       count++; 
     } 
    } 

    private void BindViewSettingsProvider() 
    { 

    } 

    private void UnbindViewSettingsProvider() 
    { 

    } 
} 

回答

3

是啊,看起来像麻烦。改为从Panel导出你的班级。将其AutoScroll设置为true,将AutoMinSize属性设置为可滚动网格的大小。这会自动使滚动条出现。使用OnPaintBackground()方法绘制背景和网格。您需要使用AutoScrollPosition属性偏移网格的绘图:

protected override void OnPaintBackground(PaintEventArgs e) { 
    e.Graphics.FillRectangle(Brushes.Black, this.ClientRectangle); 
    e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y); 
    for (int x = 0; x < this.AutoScrollMinSize.Width; x += GridSize) 
     e.Graphics.DrawLine(Pens.White, x, 0, x, this.AutoScrollMinSize.Height); 
    for (int y = 0; y < this.AutoScrollMinSize.Height; y += GridSize) 
     e.Graphics.DrawLine(Pens.White, 0, y, this.AutoScrollMinSize.Width, y); 
    }