CSpinButtonCtrl控件 控制小数,指定步长,指定类型数据

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
}

在MFC中,SpinControl是一个用于实现微调功能的控件。通常与可编辑文本框(CEdit)一起使用。以下是SpinControl的用法: 1. 在对话框界面上添加一个编辑框控件和一个SpinControl控件。 2. 为编辑框和SpinControl控件分别添加变量。例如,编辑框添加一个CString类型的变量m_editNum1,SpinControl添加一个CSpinButtonCtrl类型的变量m_Spin。 3. 在初始化函数中绑定这两个控件。使用SetBuddy函数将SpinControl与编辑框关联起来,并设置SpinControl的取值范围。例如: ``` int temp = _wtoi(m_editNum1); m_Spin.SetBuddy(GetDlgItem(temp)); m_Spin.SetRange(0, 100); ``` 4. 为SpinControl添加消息响应事件。在响应事件中,可以通过UpdateData函数将编辑框中的值更新到变量中,然后根据点击的箭头方向进行微调操作,并将结果更新到编辑框中。例如: ``` void CSpinctrlDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR); UpdateData(true); CString ss; if (pNMUpDown->iDelta == -1) // 往下的箭头 { double a; a = wcstod(m_editNum1, NULL) - 1; ss.Format(_T("%.1f"), a); } else if (pNMUpDown->iDelta == 1) // 往上的箭头 { double a; a = wcstod(m_editNum1, NULL) + 1; ss.Format(_T("%.1f"), a); } m_editNum1 = ss; UpdateData(false); *pResult = 0; } ``` 以上是SpinControl在MFC中的简要用法。通过与可编辑文本框配合使用,可以实现对数值的微调操作。 #### 引用[.reference_title] - *1* [MFC中Spin control的使用](https://blog.csdn.net/yousss/article/details/80061662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [MFC中spin control控件的使用方法](https://blog.csdn.net/komtao520/article/details/48541671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MFC控件spin control](https://blog.csdn.net/whysnlc/article/details/7776840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值