スクロールバーの操作

ウィンドウに貼り付けたスクロールバーを操作するためには、 まず親ウィンドウのOnInitDialog関数でスクロールの範囲とスクロールボックスの初期位置を決める必要がある。
	BOOL CUKScrollBarDlg::OnInitDialog()
	{
		CDialog::OnInitDialog();
		……

		// TODO: 特別な初期化を行う時はこの場所に追加してください。
		// m_hscroll1はCScrollBarクラスの水平スクロールバー。ClassWizardで設定する
		m_hscroll1.SetScrollRange(-20, 20);
		m_hscroll1.SetScrollPos(0);
	
		return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
	}
これでスクロールバーの左端が-20、右端が20となり、初期位置は0(つまりスクロールバーの中央)に設定される。
スクロールバー上でスクロールボックスをドラッグさせたり、両端の矢印をクリックするなどしてスクロールを実行すると、 親ウィンドウにWM_HSCROLLメッセージ(垂直スクロールバーの場合はWM_VSCROLL)が送られる。 親ウィンドウのOnHScrollハンドラをカスタマイズすることで、このメッセージを取得、操作することができる。
	void CUKScrollBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
	{
		// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
		int iPos = pScrollBar->GetScrollPos();
		int iMin, iMax;
		pScrollBar->GetScrollRange(&iMin, &iMax);

		switch(nSBCode) {
		case SB_LINELEFT:		// 左端の矢印をクリックした場合(または←キー)
			iPos--;
			if( iPos < iMin )
				iPos = iMin;
			break;
		case SB_LINERIGHT:		// 右端の矢印をクリックした場合(または→キー)
			iPos++;
			if( iPos > iMax )
				iPos = iMax;
			break;
		case SB_PAGELEFT:		// スクロールボックスの左側をクリックした場合(またはPageUpキー)
			iPos -= 10;
			if( iPos < iMin )
				iPos = iMin;
			break;
		case SB_PAGERIGHT:		// スクロールボックスの右側をクリックした場合(またはPageDownキー)
			iPos += 10;
			if( iPos > iMax )
				iPos = iMax;
			break;
		case SB_THUMBPOSITION:		// スクロールボックスを絶対移動させた場合
		case SB_THUMBTRACK:		// スクロールボックスをドラッグ移動させた場合
			iPos = nPos;
			break;
		}

		pScrollBar->SetScrollPos(iPos);

		// デフォルトの処理は実行せずにコメント化する
		// CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
	}
やっていることは簡単で、要するにCScrollBar::SetScrollPos関数で新しい位置にスクロールボックスを移動させているだけである。

目次へ