2014-10-12 74 views
1

如何實現自定義控件的滾動?我的控件是完全自定義繪製的,其高度是可變的,並且控件的一部分包含一個菜單,所以如果控件中有很多項目,我需要能夠將滾動條放在那裏。我沒有真正能夠找到任何有關如何做到這一點的線索。我確實看到了一些關於ScrollableControl的內容,但我仍然不確定這是否是我需要的。如何實現自定義控件的滾動?

此外,我的控件如何知道何時需要顯示滾動條?因爲我的控件完全是自定義繪製的,所以在那裏沒有真正的「控件」,它只是一堆像素被繪製到它上面,所以它不像我可以將AutoScroll設置爲true,我不能那樣做,因爲它不是需要滾動的控件的主要部分,它是控件上需要滾動條的特定位置。

回答

-1

您可以使用PanelAutoScroll = true。之後,如果您將任何控件放入其中,只要它們的尺寸大於面板的尺寸,面板就會自動顯示滾動條。只要您將位置調整爲任何自定義控件,該技巧都可以使用它位於AutoScroll面板內部,並根據需要調整它的大小。

1

您有兩種選擇。

好的新的是它是可能的,兩者都不是很難。

  • 的壞消息是,對於一個選項,您將不得不適應所有的繪製代碼:

首先讓你的控制,我用一個Panel,有Autoscroll=true;

然後,你需要添加一個虛擬控制,我使用另一個Panel,也許這樣,遠遠到右邊和底部,迫使ScrollBars顯示:

public Form1() 
{ 
    InitializeComponent(); 

    Panel panelDummy = new Panel(); 
    panelDummy.Size = new Size(1,1); 
    panelDummy.Location = new Point(yourMaxX,yourMaxY); 
    panel1.Controls.Add(panelDummy); 
} 

然後你需要調整你的繪圖代碼。這裏是如何:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    int xx = panel1.HorizontalScroll.Value; 
    int yy = panel1.VerticalScroll.Value; 

    e.Graphics.FillRectangle(Brushes.Wheat, new Rectangle(11 - xx, 22 - yy, 22, 311)); 
    e.Graphics.FillRectangle(Brushes.RosyBrown, new Rectangle(11 - xx, 280 - yy, 22, 3)); 
} 

private void panel1_Scroll(object sender, ScrollEventArgs e) 
{ 
    panel1.Invalidate(); 
} 

我增加了一個InvalidateScroll事件,以避免弄亂了繪畫的效果。

  • 另一種選擇是簡單的:讓你的控制大到足以容納你所有的繪製控件和放它一個PanelAutoScroll=true;這將委託整個滾動業務,以含面板。

    this.AutoScrollMinSize = New Size(yourWidth, yourHeight); 
    

    如果你控制的ClientSize.Height比yourHeight更大:

4

如果您的自定義控件從Panel控件繼承,你只是這個設置中設置的內容在自己的定製控件的大小,你不會得到任何滾動條。如果它更少,那麼你會得到一個滾動條。

在你的paint方法,這在前面加上:

protected override void OnPaint(PaintEventArgs e) { 
    e.Graphics.TranslateTransform(this.AutoScrollPosition.X, 
           this.AutoScrollPosition.Y); 

你畫現在一切都被自動轉換到滾動座標。

+0

謝謝,但它不是需要滾動的控件的整個大小,它只是需要滾動條的控件的大約四分之一。 (用按鈕思考一個面板控件;你點擊按鈕,然後彈出一個可滾動菜單)儘管如此,整個控件會滾動,正確嗎? – 2014-10-13 14:28:41

+0

@ jay_t55我將注意力集中在你的陳述上:'我的控件完全是自定義繪製的......'滾動的部分需要有它自己的容器。 – LarsTech 2014-10-13 14:29:17

+0

你解決了你的問題嗎?如果有任何答案被使用,你可能想要接受它。 – TaW 2014-10-17 15:50:40

-1

我已經部分解決了這個問題,通過創建一個自定義控件繼承自Control並完全繪製在OnPaint中。到目前爲止,我的解決方案是使用ScrollBarRenderer繪製滾動按鈕,然後爲可滾動區域定義一個Rectangle。然後我創建一個Image來繪製我的可滾動內容,並使用TranslateTransform在使用DrawImage繪製到我創建的可滾動內容矩形之前,將該圖像滾動到位。它顯示了承諾,儘管我還沒有完全使用它,因爲我必須自己處理所有的MouseOver和Click事件。

相關問題