性格悪い人が優勝

スクロールバーの動作で困っております。
下記に抜粋のコーディングを示しましたが、横のサイズnMaxを例えば80000(※1)としスクロールボックスを移動させると、ある地点を過ぎると変数wpの上位2バイトがオーバーフローし、スクロールボックスを後部に移動させることが出来ません。
この様な場合どう設定すればスクロールボックスを画面の隅まで移動させられるのでしょうか。どなたかよい解決策をご存知でしたらご教示いただきたく、宜しくお願いします。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
:
case WM_CREATE:
FlatSB_SetScrollProp(hWnd, WSB_PROP_HSTYLE, FSB_FLAT_MODE, TRUE);
break;
:
case WM_SIZE:
sih.cbSize= sizeof(SCROLLINFO);
sih.fMask= SIF_ALL;
sih.nMin= 0;
sih.nMax= 80000; // ※1
sih.nPage= LOWORD(lp) / 8; // 8 = 文字幅
sih.nPos= posh; // corrent sih.nPos
FlatSB_SetScrollInfo(hWnd, SB_HORZ, &sih, TRUE);
break;
:
case WM_HSCROLL:
switch (LOWORD(wp)) {
case SB_THUMBTRACK:
dx = HIWORD(wp) - sih.nPos; // ※2 wpの上位ワードがオーバーフローしてしまう
break;
}

A 回答 (2件)

当方は MFCダイアログベース、Win32APIベースでの検証をしておりますが


つまみを動かしている最中でも変化するようです ・・・

MFCダイアログベースは 普通のスクロールバーコントロールとダイアログのスクロールバー
Win32APIは ウィンドウのスクロールバー
にて検証しました

コモンコントロールのフラットスクロールバーだとコントロールに対するScrollイベントを記述しないといけないようですよ
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
先に教えて頂いた方法で、関数をFlatSB_GetScrollInfoに変えたらすんなりうまくいきました。
ご教示感謝いたします。有難うございました。

お礼日時:2010/10/17 08:16

SCROLLINFOのnTrackPosからデータを取得してはいかがでしょう



トラッキングデータ取得用のSCROLLINFO型変数を用意しておきます

SCROLLINFO siVal;

メッセージハンドラ部で
case SB_THUMBTRACK:
ZeroMemory( &siVal, sizeof( SCROLLINFO ) );
siVal.cbSize = sizeof( SCROLLINFO );
siVal.fMask = SIF_ALL;
::GetScrollInfo( hWnd, SB_HORZ, &siVal );
dx = siVal.nTrackPos - sih.nPos;

といった具合ですが ・・・
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
GetScrollInfoを使ってnTrackPosの情報をみましたが、スクロールバーが停止している場合のポジションは採取できるのですが、動かしている場合の情報はどうも取れないようです。
でも、これを手がかりにもう少し探って見ます。もし、この結果で何か分かれば情報を頂きたく宜しくお願いします。

お礼日時:2010/10/16 19:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!