2016-12-04 14 views
2

にスクロール制限を設定したい:私はこのようなスクロール可能なパネルを作ったスクロール可能なパネル

private void button3_Click(object sender, EventArgs e) 
{ 
    Form f2 = new Form(); 
    f2.Size = new Size(400, 300); 
    f2.AutoScroll = false; 
    Panel pan = new Panel(); 
    pan.Size = new Size(600, 100); 
    pan.AutoScroll = false; 
    for (int i = 1; i <= 10; i++) 
    { 
     Button b = new Button(); 
     b.Text = "B" + (i); 
     b.Name = "button_" + (i); 
     b.Left = (b.Width + 12) * (i - 1); 
     b.Parent = pan; 
     pan.Parent = f2; 
     f2.Show(); 
    } 
} 

private void panel1_MouseWheel(object sender, MouseEventArgs e) 
{ 
     Form2 frm = new Form2(); 
     panel1.Top += e.Delta > 0 ? 10 : -10; 
     if (panel1.Top > 0) 
      panel1.Top = 0; 
     else if (panel1.Top <= panel1.Parent.Height) 
      panel1.Top = panel1.Parent.Height; 
     Console.WriteLine("panel2.top:" + panel1.Top); 

    } 

これは、そのパネルの完全なコードで、パネル1 =パン...

private void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    pPt = e.Location; 
} 
public void panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
    Console.WriteLine("panel2.top:" + panel1.Top); 
    if (e.Button.HasFlag(MouseButtons.Left)) 
    { 
     Form2 frm = new Form2(); 
     panel1.Top += e.Y - pPt.Y; 
     if (panel1.Top > 0) 
      panel1.Top = 0; 
     else if (panel1.Top <= panel1.Parent.Height) 
      panel1.Top = panel1.Parent.Height; 
    } 
} 

マウスを使ってパネルをドラッグしてスクロールすることもできますが、問題は次のようになります。

そして、最後のボタンよりも高くする必要はありません。

+0

フォームの完全なコードを投稿できますか? – John

+0

入手しました。それはあなたが答えたデルタ投稿を制限することと関係しています – John

+0

それは、マウスホイールイベントがマウスによって連続的に発生していることを忘れているので、パネルが上部または下部にあるときにそれらを無視するロジックを追加する必要があります。 – John

答えて

0

我々は次のように例がある

ScrollBar.Maximum施設

とスクロール可能な範囲の値の上限を取得または設定することができます。

次の例では、フォームを作成し、フォームにPictureBoxを追加し、水平HScrollBarと垂直VScrollBarをPictureBoxに追加したと想定しています。このコード例は、ScrollBarクラスの概要で提供される大きなサンプルの一部です。 この例では、MaximumプロパティにImageのサイズとスクロールバーのサイズ(表示されている場合)とLargeChangeプロパティのサイズの調整係数を足した値が設定されています。 この例を実行するには、System.DrawingおよびSystem.Windows.Forms名前空間への参照を追加する必要があります。

public void SetScrollBarValues() 
    { 
     //Set the following scrollbar properties: 

     //Minimum: Set to 0 

     //SmallChange and LargeChange: Per UI guidelines, these must be set 
     // relative to the size of the view that the user sees, not to 
     // the total size including the unseen part. In this example, 
     // these must be set relative to the picture box, not to the image. 

     //Maximum: Calculate in steps: 
     //Step 1: The maximum to scroll is the size of the unseen part. 
     //Step 2: Add the size of visible scrollbars if necessary. 
     //Step 3: Add an adjustment factor of ScrollBar.LargeChange. 


     //Configure the horizontal scrollbar 
     //--------------------------------------------- 
     if (this.hScrollBar1.Visible) 
     { 
      this.hScrollBar1.Minimum = 0; 
      this.hScrollBar1.SmallChange = this.pictureBox1.Width/20; 
      this.hScrollBar1.LargeChange = this.pictureBox1.Width/10; 

      this.hScrollBar1.Maximum = this.pictureBox1.Image.Size.Width - pictureBox1.ClientSize.Width; //step 1 

      if (this.vScrollBar1.Visible) //step 2 
      { 
       this.hScrollBar1.Maximum += this.vScrollBar1.Width; 
      } 

      this.hScrollBar1.Maximum += this.hScrollBar1.LargeChange; //step 3 
     } 

     //Configure the vertical scrollbar 
     //--------------------------------------------- 
     if (this.vScrollBar1.Visible) 
     { 
      this.vScrollBar1.Minimum = 0; 
      this.vScrollBar1.SmallChange = this.pictureBox1.Height/20; 
      this.vScrollBar1.LargeChange = this.pictureBox1.Height/10; 

      this.vScrollBar1.Maximum = this.pictureBox1.Image.Size.Height - pictureBox1.ClientSize.Height; //step 1 

      if (this.hScrollBar1.Visible) //step 2 
      { 
       this.vScrollBar1.Maximum += this.hScrollBar1.Height; 
      } 

      this.vScrollBar1.Maximum += this.vScrollBar1.LargeChange; //step 3 
     } 
    } 

はあなたが最大スクロール可能な領域を設定しそれに応じてコードを変更することができます願っています:)

2

微調整この方法:それはトップ下に移動しないように、あなたは「ピン」にパネルを必要とし、マウスのホイールデルタは連続して受け取るイベントなので、下のほうが上です。あなたは、手動でスクロールされているパネルは、ビューポート(フォーム自体)より「背の高い」であるとき、彼らは

private void panel1_MouseWheel(object sender, MouseEventArgs e) 
{ 
     Form2 frm = new Form2(); 
     panel1.Top += e.Delta > 0 ? 10 : -10; 

     // tweak this 
     if (panel1.Top > 0) panel1.Top = 0; 
     else if (panel1.Bottom <= panel1.Parent.Height) panel1.Bottom = panel1.Parent.Height; 

     Console.WriteLine("panel2.top:" + panel1.Top); 

} 

また、上記の動作します無視する時に決定する必要があります。パネルがフォームよりも小さいときは、さらに微調整する必要があるかもしれません - そのため、いくつかのケースをテストしてください。

また、誰かがコンテナフォームを展開したときにパネルが正しいTopプロパティを持つようにResizeイベントに注意する必要があります。

+4

また、動作していただきありがとうございます...私はマウスをドラッグしてパネルをスクロールすることができますが、panel1.Top = 0;あなたがパネルの上をスクロールしようとすると奇妙に見えます。これには他に何かありますか? –

+4

また、panel1.bottomも計算する必要はありませんか? –

+4

これはこのように動作します...パネルの下をスクロールしようとすると、再び動きます。 –

関連する問題