スクロール処理がうまくいかない

[戻る]
ねこ 2007/07/23(月) 14:07:48
ON_WM_VSCROLL()
OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
nPos->これはスクロールの位置を示しているのですが、
この値がUINTの表現できる値を超えてしまいました。

これを回避するため、OnVScrollの引数nPosをintに変更しようと
しても起こられました。
ON_WM_VSCROLLの定義と一致しないとだめみたいです。
ON_WM_VSCROLLを定義ってできますか?

PATIO 2007/07/23(月) 14:28:19
えーと、UINTの表現範囲を超えたのでintにしたという部分が理解できないです。
マイナス方向に超えちゃったと言う話なんでしょうか?
この辺の話はちゃんとMSDNでCWnd::OnVScrollを調べて見てください。
nPosの部分でちゃんと解説されています。

発想としてはハンドラの引数の型を変えようと言う時点で間違ってます。
ハンドラを呼び出す側は元の方で呼び出すわけなので意味が無いですし。
基本的にイベントハンドラに関しては関数の型とか引数を変更する事は出来ません。

何をしようとしてどんな状態になっているのかをちゃんと説明してくれないと
多分、参考になるレスポンスは期待できないと思います。
あと、開発環境に関する記述が一切無いのでその辺もちゃんと公開してください。
この辺の話については、このラウンジの「使用上の注意」を参照してください。

ねこ 2007/07/23(月) 15:27:25
>えーと、UINTの表現範囲を超えたのでintにしたという部分が理解できないです。
>マイナス方向に超えちゃったと言う話なんでしょうか?
まちがえました。long型にしたいです。
表示画面サイズが68606ピクセルなので、桁あふれしているんじゃないか
と思っています。

○現象
ある一定の位置まで、スクロールすると、スクロール位置が先頭になる。
OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
を追うと、nPosの値にマイナスが入っていた。

○環境
WindowsXp(Microsoft Visual C++ .NET)

言葉足らずで、申し訳ありません.(__).

Blue 2007/07/23(月) 15:37:39
ヘルプには
>nPos 
>スクロール バーのコードが SB_THUMBPOSITION または SB_THUMBTRACK の場合は、スク
>ロール ボックスの現在位置を指定します。それ以外の場合は使いません。初期スクロ
>ール範囲によっては、nPos が負になることもあるので、必要に応じて int にキャスト
>します。
とありました。
http://msdn2.microsoft.com/ja-jp/library/fhfk142k(VS.80).aspx

で、「OnVScroll 負」というので検索してみてたら
http://www.eva.hi-ho.ne.jp/minoru-f/diary/diary200005.html
ってのを見つけた。

ねこ 2007/07/23(月) 16:14:53
[[解決]]
nPosの表現できる範囲を超えていました。

OnScroll関数内で、
SB_THUMBTRACKの場合のみ、nPosは使用せず、
つまみの位置(GetScrollInfoで取得)を使用するように変更しました。
GetScrollInfo(SB_VERT, &stScrollInfo, SIF_TRACKPOS);

これより、描画する位置を知ることができました。

ありがとうございます!!

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