CWnd::OnVScroll

縦方向のスクロールバーが操作されたとき、親ウィンドウのダイアログにWM_VSCROLLが送信される・・・。
(WM_VSCROLLの項を参照のこと・・・。)
CWnd::OnVScrollは、WM_VSCROLLのイベントハンドラで、ここにスクロールバーの操作に対する処理を書く・・・。

CWnd::OnVScroll

ダイアログをクリックして、

f:id:BG1:20160410133548p:plain

プロパティがダイアログになってる状態で、

f:id:BG1:20160410133452p:plain

このアイコン(メッセージ)を選択し、

f:id:BG1:20160410134232p:plain

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を渡す・・・。

f:id:BG1:20160410141433p:plain

これでどんなパターンでも自由につまみが動かせる・・・。

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