1

シナリオ:

  • パネルをフォームに配置します。
  • パネルの BorderStyle を FixedSingle に設定します。(実行時に表示されるようにするためです。)
  • パネルの AutoScroll=True を設定します
  • パネルのアンカーを上、左、下、右に設定します
  • パネル内に、任意のサイズのコントロール (ボタン、ピクチャ ボックスなど) を配置します。
  • コントロールの下端がパネルの下端からわずか数ピクセル上になるように調整します。
  • コントロールの右端を、パネルから垂直スクロールバーの幅を引いた数ピクセル分狭くなるように調整します。(つまり、垂直スクロールバーが表示される余地を残すのに十分なだけ狭くする必要があります。)

これを実行し、フォームのサイズを垂直方向に少し短くして、VERTICAL スクロールバーが表示されるようにします。

問題: 両方のスクロールバーが表示されます。これは、垂直スクロールバーが存在するとクライアント領域の幅が狭くなり、水平スクロールバーが強制的に表示されるためです。

どうやら.NETは最初に垂直スクロールバーが必要かどうかを評価し、次に水平が表示されるかどうかを評価します。これは、垂直スクロールバーの存在によってクライアントのサイズが縮小されるかどうかに依存します。(つまり、同じ実験では不要な VERTICAL スクロールバーは表示されません... 水平スクロールバーのみが表示されます。)

私は VB2008 Express を使用していますが、これは後のバージョンに引き継がれると思います。

必要な解決策: 次のいずれかが必要です。A) 「垂直自動スクロールのみ」のパネル。B) 水平スクロールバーが実際に必要かどうかをパネルに「再考」させる方法が必要です。(リフレッシュはしていないようです。)

4

3 に答える 3

3

パネルの自動スクロール プロパティを使用するには、次のようにします。

  1. panel.AutoScroll = False (私が知っている逆です:D)
  2. panel.VerticalScroll.Visible = False または panel.Horizo​​ntalScroll.Visible = False

スクロールバーの寸法を知るために

SystemInformation.HorizontalScrollBarHeight
SystemInformation.VerticalScrollBarWidth

したがって、スクロールバーが表示されているときにパネルの寸法を変更できます。

于 2014-01-21T09:51:29.373 に答える
2

このAutoScrollプロパティでは、スクロールバーをあまり制御することはできません (VerticalScrollおよびHorizontalScrollプロパティがありますが)。

提案された代替案のうち、私はオプション A を選びます。この投稿のマークされた回答は、同等の問題に対する非常に効果的な解決策を提供します。変換および適応されたコード (Panel1質問で参照されているパネルはどこにありますか):

Private Declare Function ShowScrollBar Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal wBar As Integer, ByVal bShow As Boolean) As Boolean
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Try
        ShowScrollBar(Panel1.Handle, 0, False)
    Catch ex As Exception
    End Try
    MyBase.WndProc(m)
End Sub

パネルのプロパティを true に設定してAutoScrollこのコードを追加すると、探しているものが得られます。

Protected Overrides Sub WndProc注: 提案されたコードは機能しますが、一定の代償が伴います: 個人的にはコードをできるだけ避けるつもりです。この機能を正確に取得することが重要な場合は、提案された方法論に頼ってください。それ以外の場合は、他の代替手段を検討する必要がある場合があります (たとえば、常にそこにあるパネルにAutoScroll = Falsea を追加するなど)。VScrollBar

于 2013-10-06T17:21:33.597 に答える