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()
{
}
}