ScrollBarがスクロール限界値までスクロールしない

[戻る]
Q 2005/09/06(火) 10:43:52
こちらにはいつもお世話になってます。m(_ _)m

現在、MFCにてダイアログに貼り付けることの出来るScrollViewみたいなものを作成して
います。

ウィンドウのスクロールバー表示は、
CRect rect;
GetClientRect(rect);
で取得できる描画領域と、実画像領域の情報から表示部分の大きさ(SCROLLINFO.nPage)
をSetScrollInfoで設定し、スクロールバーを表示しているのですが、
スクロールバーのスクロールメッセージを処理するとき、SetScrollPosでスクロールバ
ーの位置指定をしても、GetScrollLimit()で取得できる値までスクロールさせることが
出来ない現象に悩まされています。

問題の箇所のコードはこんな感じです
{
    int limit = GetScrollLimit(SB_VERT); // limit=60
    SCROLLINFO si = {0};
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask  = SIF_POS;
    si.nPos   = nPos; // 位置指定 nPos=53
    BOOL ret = SetScrollInfo(SB_VERT, &si, TRUE); // TRUEが返るのにスクロールし
ない!!
      ・
   ・
}

Verticalに限って、GetScrolllimitで返る値より-13までの位置までしかスクロールしま
せん。Horaizentalは問題無いようです。

この現象の原因・対処法ご存知の方おられましたら、ご教授いただけませんでしょう
か。

よろしくお願いいたします。

Q 2005/09/06(火) 12:16:43
訂正です。。

> GetScrolllimitで返る値より-13までの位置までしかスクロールしません。

-17までの位置、の誤りでした。

dairygoods 2005/09/06(火) 12:27:44
ページサイズが不明ですが、
指定可能な範囲をはみ出していませんか?

SetScrollInfo
http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_setscrollinfo
.asp

| nPos メンバは、nMin 以上 nMax - max(nPage - 1, 0) 以下
| でなければなりません。どちらかのメンバで不適切な値を指
| 定すると、範囲内に収まるよう値が変更されます。

Q 2005/09/06(火) 13:28:46
これっぽいです。
一応解決です。。

最初の例とは違いますが、いまのところスクロールバーに設定している値は、
SCROLLINFO vsi;
vsi.nMin = 0,
vsi.nMax = 540,
vsi.nPage = 438
ですので、
nMax - max(nPage - 1, 0) = 103
です

とすると、GetScrolllimitが120を返すのはおかしいと思って調べてみると、
勝手にnPageが421に変更されてました。-17されてます。

これはどうしてなのでしょうか・・・?
全然nPageを変更するような関数は呼んでないのですが・・・(汗
何かご存じないでしょうか・・・

Q 2005/09/06(火) 14:13:20
[[解決]]
解決しました。

nPageはスクロールバーの表示/非表示が変わった際に呼ばれているようでした。
SetScrollPosのタイミングでページサイズを設定しなおすようにしました。

古いスレッドには追加発言できません。