CSpinButtonCtrl使用说明

CSpinButtonCtrl使用说明

CSpinButtonCtrl使用起来比较特殊,使用起来,需要注意一些地方.实际的教程也比较少.为了让后人少走弯路,这里写这篇文章以说明.
1.添加EDIT控件
2.添加Spin控件
如果不是这样的顺序的话,使用ctrl+D改变Tab顺序,使spin紧靠edit后面
3.在EDIT控件上面设置group属性(特别注意)
4.在Spin控件上设置
Auto Buddy 为 true
Set Buddy Integer 为 true(如果要使用小数,此处为false)
Alignment 为 Right Align
5.添加Edit控件 int 变量 m_nNumK;
这个时候点击向下应该可以增加数值
6.在OnInitDialog中添加以下语句
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN1))->SetRange(-100, 100);
这个时候向上的箭头为增加,向下的箭头为减小.
7.如果要设置你需要的步长:
使用SetAccel(int nAccel,UDACCEL* pAccel )函数
参数nAccel表示由pAccel指定的UDACCEL结构的数目.
pAccel指向一个UDACCEL结构数组的指针,
该数组包含了加速信息,其结构如下:
    typedef struct{
      UINT nSec;//位置改变前所等待的秒数。
      UINT nInc;//位置增量。
    }UDACCEL,FAR* LPUDACCEL;
例如:UDACCEL   Accel; 
Accel.nSec=0; 
Accel.nInc=10;    
m_MySpin.SetRange(1950,1999); 
m_MySpin.SetAccel(1,&Accel); 

在看书的时候发现教材写的很不完整,导致我Auto Buddy属性没有设置为true,结果运行的时候点了半天edit控件的内容都是空白的...

以下是我的代码,个人比较笨,手动设置buddy...

OnInitDialog()
{
    
    CDialog::OnInitDialog();
    CSpinButtonCtrl 
*pSpinRed =(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_RED);
    ASSERT(pSpinRed
!=NULL);
    
    pSpinRed
->SetBuddy(GetDlgItem(IDC_EDIT_RED));
    pSpinRed
->SetRange(0,255);
    pSpinRed
->SetBase(3);
    pSpinRed
->SetPos(128);

    CSpinButtonCtrl 
*pSpinGREEN =(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_GREEN);
    ASSERT(pSpinGREEN
!=NULL);
    pSpinGREEN
->SetBuddy(GetDlgItem(IDC_EDIT_GREEN));
    pSpinGREEN
->SetRange(0,255);
    pSpinGREEN
->SetBase(1);
    pSpinGREEN
->SetPos(128);

    CSpinButtonCtrl 
*pSpinBLUE =(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_BLUE);
    ASSERT(pSpinBLUE
!=NULL);
    pSpinBLUE
->SetBuddy(GetDlgItem(IDC_EDIT_BLUE));
    pSpinBLUE
->SetRange(0,255);
    pSpinBLUE
->SetBase(1);
    pSpinBLUE
->SetPos(128);

    
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    
//  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    
// TODO: 在此添加额外的初始化代码
    
    
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

 
       

用Spin控件完成增减

响应 UDN_DELTAPOS消息 旋转按钮控件的消息 UDN_DELTAPOS 表示控件的位置将要改变  重载 Spin控件的 UDN_DELTAPOS消息  , 将会多出如下函数 : void CTestDlg::OnDeltaposSpin3(NMHDR* pNMHDR, LRESULT* pResult) {     NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;     if(pNMUpDown->iDelta == 1)        // 如果此值为 1 , 说明点击了 Spin的往下箭头     {          //做相关处理       }     else if(pNMUpDown->iDelta == -1) // 如果此值为 -1 , 说明点击了 Spin的往上箭头     {      //做相关处理      }       *pResult = 0; } 详细做法 : 1: 假设你编辑框为 IDC_EDIT , SPIN按钮为 IDC_SPIN . 2: Ctrl + W  , 进入 Class Wizard , Object IDs列选择 IDC_SPIN , Messages列选择 UDN_DELTAPOS ,点击 "Add Function" 按钮 .将弹出 "OnDeltaposSpin"的对话框  ,OK 添加这个函数 .然后点 "Edit Code"  , 进入新添加的函数里  . 3: 将会新添加一个函数 . void CTestDlg::OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult) . . . 4: 添加如下代码 :   void CTestDlg::OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult) {     NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;       CWnd* pWnd = (CWnd*)GetDlgItem(IDC_EDIT);    //得到指向编辑框的窗口指针     CString strValue ;     pWnd->GetWindowText(strValue);                 //得到编辑框中的内容       if(pNMUpDown->iDelta == 1)                    //如果点击的是 Spin中的往上按钮     {              if(!strValue.IsEmpty())              {                   strValue.SetAt(0 , strValue[0] + 1);   //编辑框首字母加 1                  pWnd->SetWindowText(strValue);         //保存修改              }     }     else if(pNMUpDown->iDelta == - 1)    //如果点击的是 Spin中往下按钮     {              if(!strValue.IsEmpty())              {                   strValue.SetAt(0 , strValue[0] - 1);   //编辑框首字母减 1                   pWnd->SetWindowText(strValue);         //保存修改              }     }     *pResult = 0; }   使用上述做法,后来遇到一个问题:当一直按住上或者下时,增大16个后就不再增大,后来发现,将条件改成大于0和小于0就可以了,大于0表示向上按钮

在对话框中用CSpinButtonCtrl调节参数
1.编辑资源:
假设CSpinButtonCtrl控件的ID为IDC_SPIN1,它与一编辑框IDC_EDIT1相关联
修改ID_SPIN1控件的属性:
将Auto Buddy 及Set Buddy Integers设置为TRUE
2.为IDC_EDIT1控件关联变量,如double m_rScale;
3.重载C*Dlg的OnInitDlg()方法
在其中添加:
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);
pSpin->SetRange(0,static_cast(10/m_step));
//m_step为步长,控件增量,注意下限为0
4.在C*Dlg中响应WM_ONVSCROLL消息
          void C*Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
并在其中添加:
switch(pScrollBar->GetDlgCtrlID()){
             case IDC_SPIN1:{
                       m_rScale = (nPos-5/m_step)*m_step; 
                      //(nPos-5/m_step)使得编辑框中可以为负数
                       CString str;
                      str.Format(CString("%.1f"),m_rScale); 
                      //".1f"将m_rScale格式化为具有1位小数的字符串
                      ((CEdit*)GetDlgItem(IDC_EDIT1))->SetWindowText(str);
                       break;
             }
           default:
                       break;
}
此种方法有问题,不能从CEDIT控件的当前值开始增加或减少。如果要从当前值开始还是需要
重载Spin控件的UDN_DELTAPOS

你可能感兴趣的:(CSpinButtonCtrl使用说明)