こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

WM_VSCROLL内の実行回数について

Visual Studio 2010 Express
WIN32 ユニコードビルド
C言語
でクライアント領域に縦スクロールバーを貼り付け次のようなプログラムを作りました。
スクロールバーの勉強中に適当に作ったプログラムです。


LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
TCHAR moji[256];
static int countout=0;
static int countin=0;

      switch(message){
      case WM_PAINT:
BeginPaint(hwnd,&ps);
wsprintf(moji,TEXT("switch文の外=%d回 switch文の中=%d"),countout,countin);
TextOut(ps.hdc,0,0,moji,lstrlen(moji));
EndPaint(hwnd,&ps);
break;
case WM_VSCROLL:
countout=countout+1;
switch(LOWORD(wParam)){
case SB_LINEDOWN:
countin=countin+1;
break;
}
InvalidateRect(hwnd,NULL,TRUE);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
私はこのプログラムの実行結果は
スクロールバーのどこをクリックしてもcountoutは+1され下の矢印をクリックしたときはcountinが+1
されるという動作になると思ったのですが実行してみると

スクロールバーの矢印をクリック countout が+2
スクロールバーのつまみをクリック countout が+3
スクロールバーの下矢印をクリック countout が+2,countinが+1
されるという結果になりました。
この結果から推測するとVSCROLLバーをクリックしたときはWM_VSCROLL:メッセージが複数回送られているということになると思うのですがどうしてこうなるのでしょうか?

プログラミングの本などではWM_VSCROLL:の中のswitch文の外に初期化やInvalidateRectがあるのでWM_VSCROLLメッセージが送られるのは1回だけだと思ったのですが・・・・。

投稿日時 - 2015-06-13 18:22:42

QNo.8993520

困ってます

質問者が選んだベストアンサー

こんにちわ。

参考URLにそのまま答えが載っています!
ご質問者様の推測通り、メッセージが複数回送られて来るようですね。
countin/countoutの値も動作と一致しているのではと思います。

>スクロールバーの矢印をクリック
SB_LINEUP -> SB_ENDSCROLL の順でWM_VSCROLLメッセージが送られる

>スクロールバーの下矢印をクリック
SB_LINEDOWN -> SB_ENDSCROLL の順でWM_VSCROLLメッセージが送られる

>スクロールバーのつまみをクリック countout が+3
SB_THUMBTRACK(ドラッグ中に複数回) -> SB_THUMBPOSITION -> SB_ENDSCROLLの順でWM_VSCROLLメッセージが送られる

参考URL:http://mrxray.on.coocan.jp/Halbow/VCL03.html

投稿日時 - 2015-06-16 15:27:37

お礼

回答ありがとうございました。
休日に参考URLページをじっくり見て勉強してみます。

投稿日時 - 2015-06-16 19:49:45

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問