1、添加文本框&spin控件,Ctrl+D设置tab顺序,使文本框后面紧接着是spin控件
2、设置spin控件属性
a、styles-auto buddy
b、styles-alignment-right 其它属性均按默认配置
3、初始化中为spin控件设置范围,随便设个范围即可
((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1))->SetRange(0,1);
4、为spin控件添加UDN_DELTAPOS事件响应函数,红色为添加代码,根据实际需要添加
void OnDeltaposSpinALL(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
const MSG* pMsg=GetCurrentMessage(); // 得到你当前正在处理的消息的MSG结构
UINT nID = LOWORD(pMsg->wParam); // 消息wParam参数的低16位为发送消息的控件ID
CWnd* pWnd = ((CSpinButtonCtrl*)GetDlgItem(nID))->GetBuddy();
if (nID == IDC_SPIN1 || nID == IDC_SPIN2)
{
SpinChange(pNMUpDown,pWnd);
}
else
{
if(nID == IDC_SPIN3)
{
SpinChange(pNMUpDown,pWnd,0.1f,2);
}
else
{
SpinChange(pNMUpDown,pWnd,5,1);
}
}
*pResult = 0;
}
5、 SpinChange方法实现。
void SpinChange(NM_UPDOWN* pNMUpDown,CWnd* pWnd,float fstep = 1,int iFormat = 1);
void SpinChange(NM_UPDOWN* pNMUpDown,CWnd* pWnd,float fstep,int iFormat)
{
CString strValue;
pWnd->GetWindowText(strValue); //得到编辑框中的内容
float fvalue;
if(pNMUpDown->iDelta >0) //如果点击的是Spin中的往上按钮
{
float pos = atof(strValue);
fvalue =pos+fstep;
}
else if(pNMUpDown->iDelta<0) //如果点击的是Spin中往下按钮
{
float pos = atof(strValue);
fvalue = pos-fstep+0.0001;//此处预防0.1-0.1 != 0 时,出现-0.0的情况
}
switch(iFormat)
{
case 1:
strValue.Format("%d",int(fvalue));
break;
case 2:
strValue.Format("%3.1f",fvalue);
break;
default:
break;
}
pWnd->SetWindowText(strValue); //保存修改
//数据校检
CDataExchange dx(this, true);
TRY
{
DoDataExchange(&dx);
}
CATCH(CUserException, e)
{
}
AND_CATCH_ALL(e)
{
}
END_CATCH_ALL
}