控件的 tab 值设置:
单击第一个到按既定顺序的控件,则后面的控件 tab将在最后的值上加 1。。。
进度条控件:
因为 ClassWinzard 不会为进度条产生一个数据成员,故在类的头文件里加入:m_nProgress,构造函数中初为 0,后在OnInitDialog加入:
CProgressCtrl * pProg = ( CProgressCtrl * ) GetDlgItem (IDC_PROGRESS1);
pProg->SetRange( 0, 100 );
pProg->SetPos( m_nProgress ) ;
连续的滑杆条:
加入m_nTrackbar1 ,构造函数初始化为 0,在 OnInitDialog() 加入:
CString strText1;
CSliderCtrl * pSlide1= ( CSliderCtrl * ) GetDlgItem ( IDC_TRACKBAR1 ) ;
pSlide1->SetRange ( 0,100 ) ;
pSlider1->SetPos (m_nTrackbar1 );
strText1.Format("%d ", pSlider1->GetPos() ) ;
SetDlgItemText ( IDC_STATIC_TRACK1, strText1 );
为保持静态文本控件的更新,映射滑杆条发给对话框的 WM_HSCROLL 消息:
OnHScroll (参数)
{
CSliderCtrl * pSlider = (CSliderCtrl * ) pScrollBar ;
CString strText ;
strText . Format (" %d ", pSlider->GetPos() );
SetDlgItemText ( IDC_STATIC_TRACK1, strText );
当单击OK按钮,则要更新滑杆条的 m_nTrackbar1 ,应该将代码放到 OnOK() 中,然而如果对话框的其他控件引起数据交换确认错误时,此时即使选择取消对话框,消息控制函数仍然会设置 m_nTrackbar1 ,为避免此问题,将代码加到 DoDataExchange() 里,如果进行确认并检测到问题,就可以调用 CDataExchange::Fail() ,它会给一个提示:
DoDataExchange()
{
......
if( pDX->m_bSaveAndValidate ) {
TRACE(" updating trackbar data members /n") ;
CSliderCtrl * pSlider = ( CSliderCtrl * ) GetDlgItem ( IDC_TRACKBAR1 ) ;
m_nTrackbar1 = pSlider1 -> GetPos () ;
}
}
}
离散的滑杆条:
加入变量:m_nTrackbar2 = 0 ;
.h 中加入数组:double dValue[5] ;
.cpp 中初始化数组: double CXXXDialog::dValue[5] = { 1.2 ,1.3, 1.4 ,1.5 ,1.6 } ;
OnInitDialog () 初始化滑杆条:
CString strText2;
CSliderCtrl * pSlide2 = ( CSliderCtrl * ) GetDlgItem( IDC_TRACKBAR2 ) ;
pSlide2->SetRange( 0, 4 ) ;
pSlide2->SetPos( m_nTrackbar2 ) ;
strText2 . Format(" %3.1 f", dValue[ pSlide2->GetPos() ] ) ;
SetDlgItemText( IDC_STATIC_TRACK2, strText2 ) ;
由于有两个滑杆条,所以在要 OnHScroll () 中区分是哪个:
OnHSCroll ()
{
CSliderCtrl * pSlede = ( CSliderCtrl * ) pScrollBar ;
CString strText ;
switch ( pScrollBar -> GetDlgCtrlID() )
{
case IDC_TRACKBAR1:
strText . Format (" %d " , pSlide->GetPos() );
SetDlgItemText ( IDC_STATIC_TRACK1, strText ) ;
break ;
case IDC_TRACKBAR2:
strText . Format ( " %3.1 f" , dValue[pSlide->GetPos() ] ) ;
SetDlgItemText( IDC_STATIC_TRACK2, strText ) ;
break ;
}
}
还需要在 DoDataExchange () 的 if 块中加入:
CSliderCtrl * pSlide2 = ( CSliderCtrl * ) GetDlgItem ( IDC_TRACKBAR2 ) ;
m_nTrackbar2 = pSlide2 -> GetPos() ;
微调控件:
需要一个 tab 值刚好在它前面的 编辑控件。在 OnInitDialog () 设置初值。
CSpinButtonCtrl * pSpin = (CSpinButtonCtrl * ) GetDlgItem ( IDC_SPIN1 ) ;
pSpin -> SetRange ( 0, 100 ) ;
pSpin->SetPos ( (int) (m_dSpin * 10.0 ));
为在编辑控件中显示当前值,要映射 WM_VSCroll 消息函数 OnVScroll () :
if ( nSBCode == SB_ENDSCROLL ) {
return ;
}
if ( pScrollBar -> GetDlgCtrlID() == IDC_SPIN1 ) {
CString strValue ;
strValue.Format("%3.1 f " , (double) nPos / 10.1 ) ;
((CSpinButtonCtrl *) pScrollBar ) -> GetBuddy() -> SetWindowText( strValue ) ;
}
不需要在 DoDataExchange() 或者 OnOK () 中加入代码。因为对话框数据交换代码会处理编辑控件的内容。