一言で言いますと、スクロールバーの最大値とページ幅を CScrollBar::SetScrollInfo で設
定し、最大までスクロールしてから現在値を取得すると、その値が 最大値 - ページ幅 + 1 に
なってしまう、というものです。
ソースコードの抜粋を以下に載せます。
CFormView::OnInitialUpdate 内
//----------------------------------------------------
SCROLLINFO info;
info.cbSize = sizeof( SCROLLINFO );
info.fMask = SIF_ALL;
info.nMin = 0;
info.nMax = 255;
info.nPage = 10;
info.nPos = 0;
info.nTrackPos = 0;
m_scrollBar.SetScrollInfo( &info );
//----------------------------------------------------
CFormView::OnHScroll メソッド
//----------------------------------------------------
SCROLLINFO info;
pScrollBar->GetScrollInfo( &info ); // ※1
int test = pScrollBar->GetScrollLimit(); // ※2
int pos = info.nPos;
switch( nSBCode )
{
case SB_LEFT:
pos = info.nMin;
break;
case SB_RIGHT:
pos = info.nMax;
break;
case SB_ENDSCROLL:
break;
case SB_LINELEFT:
if( pos > info.nMin )
{
pos--;
}
break;
case SB_LINERIGHT:
if( pos < info.nMax )
{
pos++;
}
break;
case SB_PAGELEFT:
if( pos > info.nMin )
{
pos = max( info.nMin, pos - ( int )info.nPage ); // ※3
}
break;
case SB_PAGERIGHT:
if( pos < info.nMax )
{
pos = min( info.nMax, pos + ( int )info.nPage );
}
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
pos = nPos;
break;
default:
break;
}
info.nPos = pos;
pScrollBar->SetScrollInfo( &info ); // ※4
test = pScrollBar->GetScrollPos(); // ※5
CFormView::OnHScroll(nSBCode, nPos, pScrollBar);
//----------------------------------------------------
スクロールバーを最大までスクロールさせると、上記※1 の個所では、info.nMax は 255 に
なっていますが、※2 では 246 が返って来ます。
※3、※4 の時点で pos が 255 なのは確認しましたが、※5 ではやはり 246 です。
ちなみに、CScrollBar::SetScrollRange で最大値を設定すると、ちゃんと 255 が取得でき
ます。
この 246 という数字は、冒頭で書いたとおり、
info.nMax - info.nPage + 1
になっています。
nMax および nPage の値を変えても、このとおりになりました。
スクロールバーというのは、このような仕様なのでしょうか?
こうなるとはどこにも書いていないので、困惑しています。
環境は Win98 SE、VC++6.0、MFC4.2 です。
間違えました。
※3 はあの位置ではなくその下です。
正)
pos = min( info.nMax, pos + ( int )info.nPage ); // ※3
SCROLLINFO構造体の詳細は見たのかい?
nPageはスクロールバーのスクロールボックスのサイズ
nPosはスクロールボックスの(左端の)位置
こう考えれば何も不思議なことじゃないぞ
kajiki さん、レスありがとうございます。
ええ、そうじゃないかと思ってはいました。
確かに、そりゃそうなんですが…
できれば、nMax は nPos が取りうる最大値であってほしかった、と思うのです。
そうすると、nMax は nPos に取らせたい最大値 + nPage - 1 を指定してやらなければ
ならない、というわけですか。
これがちょっと不親切だと思ったので、こういう仕様なのか、あるいは nMax = nPos の
最大値とする方法があるのか?と思い、質問させていただいた次第です。
残念ですが、こういう仕様だと割り切って使うことにします。
ありがとうございました。
解決忘れてました
確かに不親切というか解り辛いけど
スクロールボックスの幅が可変だから仕方ないんじゃないかな
スクロールボックスの幅に関係なくnMaxが一定だと
nPosに対するスクロール量が変わってしまうからなあ
そっちのほうが使いづらいと思うぞ
そういう仕様です。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/scrollbars/aboutscrollbars.asp
のScroll Box Position and Scrolling Rangeを読んでみてください。
masakiさん、ありがとうございました。
おかげでスッキリしました。
再解決、っと