none
Scrollbleコントロールの挙動が変 RRS feed

  • 質問

  • VartivalScrollbar.LargeChange = 120;

    AutoScrollMinSize = new Point(1000,2016);

    とし、OnScrollイベント内でAutoScrollPostion.Yの値を取得したのですが、いくらスクロールさせても、0~-1809までの範囲内でしか動きません(Scrollbleコントロールの幅と高さはそれぞれ300,207です)

    MSDNのScrollBarクラスによると、Valueの値は0~Maxium - LargeChange + 1までをとると書いてあるので、2016-120+1まで動いてもいいはずなのですが・・・

    もしかして、Scrollbleコントロールの場合はScrollBarクラスのそれと違うのでしょうか?


    none
    • 編集済み ferio 2010年5月20日 2:16 コピペする範囲を間違えてしまいました
    2010年5月19日 12:03

回答

  • ああ、LargeChange って ScrollableControl.VerticalScroll.LargeChange のことですか。

    んーとですね、AutoScrollPosition は、「いま表示されている画面の左上の座標」なんですよ。で、ScrollableControl の「いま表示されている画面」は、ClientSize の大きさです。画面の一番下が 2016 で、いま表示されている画面の高さが 200 なら当然「いま表示されている画面の左上の座標」は 1817 になりますよね?

    ScrollableControl.VerticalScroll.LargeChange は、ページを繰る=一画面スクロールする際の変化量であって、AutoScrollPosition に影響する物ではありません。

    • 回答としてマーク ferio 2010年5月20日 7:44
    2010年5月20日 4:22

すべての返信

  • 基本的に同じです。ScrollBar.LargeChange というのは要するに「1 ページの分量」であり、ScrollableControl の場合、ScrollableControl 自身の ClientSize(の Width/Height)辺りの値になります。
    2010年5月19日 12:28
  • その後調べてみたら、LargeChangeの値がAutoScrollMinSizeを設定した時点で変わってしまうことに気付きました

    これでは意味がないので、AutoScrollMinSizeの値を設定した後でLargeChangeの値を変更してみました

    ですが、依然として2016 - 1 - ClientSize.Heightまでのところにしか到達することができませんでした

     


    none
    2010年5月20日 2:16
  • ああ、LargeChange って ScrollableControl.VerticalScroll.LargeChange のことですか。

    んーとですね、AutoScrollPosition は、「いま表示されている画面の左上の座標」なんですよ。で、ScrollableControl の「いま表示されている画面」は、ClientSize の大きさです。画面の一番下が 2016 で、いま表示されている画面の高さが 200 なら当然「いま表示されている画面の左上の座標」は 1817 になりますよね?

    ScrollableControl.VerticalScroll.LargeChange は、ページを繰る=一画面スクロールする際の変化量であって、AutoScrollPosition に影響する物ではありません。

    • 回答としてマーク ferio 2010年5月20日 7:44
    2010年5月20日 4:22
  • 返信ありがとうございます

    ScrollBarクラスの方はLargeChangeの値を変えると反映されるのに、ScrollbleコントロールのVerticalScrollの方は反映されない動作はどこからどうみてもおかしいと思うですが、どうも、そういう仕様のようですね

    個人的な疑問が残るところですが、これで解決としたいと思います

     

     


    none
    2010年5月20日 7:44
  • 解決となっていますが、疑問が残っているようなので、横から失礼します。

    Hongliangさんの回答の繰り返しになってしまう部分もありますが、
    ScrollableControl.AutoScrollPositionは「いま表示されている画面の左上の座標」(Hongliangさんの回答より)で、「表示されている画面」のサイズを認識して算出された値です。
    ScrollBar.Valueは「スクロール ボックスの現在位置」(MSDNより)となっており、スクロール対象に関係なく出てくる値です。

    LargeChangeが反映されないように感じているようですが、そもそもこれは移動量を指定するものです。
    移動した結果の、「画面左上」と「スクロール位置」は画面サイズを考慮すれば違う値になって当然だと思います。

    ferioさんの最初の投稿から察するに、
    ScrollableControl.AutoScrollPosition = ScrollBar.Value
    と勘違いされているのではないでしょうか?

    なお、ScrollBar.ValueをScrollableControlから得るには、
    ScrollableControl.VerticalScroll.Value
    または
    ScrollableControl.HorizontalScroll.Value
    あたりで取れないでしょうか?(未確認です)

    2010年5月21日 0:32