(第四版中文版)[六]进度条,滑杆,微调控件

控件的 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 () 中加入代码。因为对话框数据交换代码会处理编辑控件的内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值