在程序中,CSpinButtonCtrl控件和CEdit控件组合大多数只支持控制正整数,而我们在应用中经常需要CSpinButtonCtrl每次被按下能增加或减少的值为小数,如0.1,同时显示在一个CEdit伴侣控件中,如何实现?最近自己刚好用上,提供两种我试过的方法。下次提供一个完整的封装类。
方法1
相应窗口消息消息ON_WM_VSCROLL();添加如下代码即可
void CAlongWallDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(nSBCode==SB_ENDSCROLL)
return;
if(pScrollBar->GetDlgCtrlID()==IDC_MYSPIN)
{
CString str;
CSpinButtonCtrl* pSpinBtCtrl=(CSpinButtonCtrl*)pScrollBar;
pSpinBtCtrl->GetBuddy()->GetWindowText(str);
int pos=_wtoi(str);
str.Format(_T("%2.1f"),(double)pos/10);
((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(str);
}
CAdUiDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
方法2,自己编写一个继承于CSpinButtonCtrl的类 重写鼠标左键点击事件,概要操作如下:
void CMySpinButtonCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CString strNum;
double retVal = 0.0;
CMySpinButtonCtrl::GetBuddy()->GetWindowText(strNum);
if ( g_IsNumber(strNum) ==FALSE ) //g_IsNumber函数在底下定义
MessageBox(_T("请输入合法的数字"));
return;
}
else
{
CRect Rect;
CMySpinButtonCtrl::GetWindowRect (&Rect);
if(point.y <((Rect.bottom-Rect.top)/2))
{
retVal = atof((LPCSTR)(LPCTSTR)strNum)+baseNum;
}
else
{
retVal = atof((LPCSTR)(LPCTSTR)strNum)-baseNum;
}
CString showVal;
showVal.Format(_T("f%"),retVal);
CMySpinButtonCtrl::GetBuddy()->SetWindowText(showVal);
}
CSpinButtonCtrl::OnLButtonDown(nFlags, point);
}
//====================================================
//输入参数:一个CString格式的数据
//功能:判断一个数据是否有效的double类型
//输出参数:一个表示数据有效性的Boolean
//说明:该函数自己随便编写,仅供参考用的,不能保证完全正确
//=====================================================
Boolean CMySpinButtonCtrl::g_IsNumber(CString strNum)
{
int num = 0;
for (int i=0; i<strNum.GetLength();i++)
{
if (strNum[i]=='.')
{
num++;
}
if (strNum[i]<'0'&&strNum[i]!='.')
{
return FALSE;
}
else if (strNum[i]>='9')
{
return FALSE;
}
}
if (num > 1)
{
return FALSE;
}
else if( num > 0)
{
if (strNum[0]=='.'||strNum[strNum.GetLength()-1]=='.')
{
return FALSE;
}
}
return TRUE;
}