ウィンドウに貼り付けたスクロールバーを操作するためには、
まず親ウィンドウの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関数で新しい位置にスクロールボックスを移動させているだけである。
目次へ