縦方向のスクロールバーが操作されたとき、親ウィンドウのダイアログにWM_VSCROLLが送信される・・・。
(WM_VSCROLLの項を参照のこと・・・。)
CWnd::OnVScrollは、WM_VSCROLLのイベントハンドラで、ここにスクロールバーの操作に対する処理を書く・・・。
ダイアログをクリックして、
プロパティがダイアログになってる状態で、
このアイコン(メッセージ)を選択し、
WM_VSCROLLの右のプルダウンをクリックすると、このようなものが出るのでこれをクリック・・・。
できたハンドラOnVScrollにこのように書く・・・。
引数のnSBCodeはどんな操作がされたかというコード番号・・・。
nPosは現在位置だがSB_THUMBPOSITIONとSB_THUMBTRACKの時のみ有効なので注意・・・。
pScrollBarに操作されたスクロールバーオブジェクトポインタが渡されるので、GetDlgItemとかは不要・・・。
pScrollBarがNULLの時は、親クラス(CDialog)のOnVScrollに引数を渡して終了・・・。
nPosは、つまみを持つ(SB_THUMBTRACK)と、つまみを離す(SB_THUMBPOSITION)の時のみ有効なので、それ以外の場合に対応するために操作後の新しい位置iNewPosに、pScrollBar->GetScrollPosで取得した現在位置の値を格納しておく・・・。
また、pScrollBar->GetScrollRangeでスクロール範囲の最小値iMinPosと最大値iMaxPosも取得しておく・・・。
つまみを持つ(SB_THUMBTRACK)とつまみを離す(SB_THUMBPOSITION)の時は、nPosをiNewPosにセット・・・。
上端や下端にスクロールされたときは、iMinPosやiMaxPosをセット・・・。
上端や下端のボタンを押されたら、1行ずつ上下するので、最大値でなければiNewPosを1つ増やし、最小値でなければiNewPosを1つ減らす・・・。
つまみの下の余白をクリックすると、1ページ下がり、上の余白をクリックすると、1ページ上がる・・・。
今回は1ページ = 1行なのでiNewPosを1増やしたり、1減らしたりする・・・。
新しい位置として、pScrollBar->SetScrollPosにiNewPosをセット・・・。
親クラスのOnVScrollに引数を渡して終わるが、この時はiNewPosじゃなくてnPosを渡す・・・。
これでどんなパターンでも自由につまみが動かせる・・・。
Sample/CWnd_.h at master · bg1bgst333/Sample · GitHub
Sample/CWnd_.cpp at master · bg1bgst333/Sample · GitHub
Sample/CWnd_Dlg.h at master · bg1bgst333/Sample · GitHub
Sample/CWnd_Dlg.cpp at master · bg1bgst333/Sample · GitHub
Sample/resource.h at master · bg1bgst333/Sample · GitHub
Sample/CWnd_.rc at master · bg1bgst333/Sample · GitHub
Sample/stdafx.h at master · bg1bgst333/Sample · GitHub
Sample/stdafx.cpp at master · bg1bgst333/Sample · GitHub