CNumSpinCtrl - 简单的数字微调控件






4.90/5 (44投票s)
用于处理实数的数字微调控件
引言
当我需要一个数值微调控件时,我搜索了 CodeGuru 和 CodeProject。令人惊讶的是,我只在 CodeGuru 上找到了 T. VU KHAC 的一篇文章,但事实证明他的 CNumSpinCtrl
只能与 CNumEdit
配对使用,这对于我的目的来说太过于限制。 所以我最终编写了自己的数值微调控件。
CNumSpinCtrl
允许您非常轻松地处理非整数数字。 它提供了设置值范围、增量和当前位置的方法。 它还允许您通过指定小数位数或提供您自己的格式化字符串来格式化输出值。
用法
使用该控件与使用 CSpinButtonCtrl
没有太大区别。 您可以子类化一个对话框项目或动态创建控件。 然后您需要做的就是设置范围和位置,如果需要,还可以设置输出格式。 这是来自演示项目的一个示例
BOOL CCNumSpinCtrlDemoDlg::OnInitDialog() { CDialog::OnInitDialog(); m_spinValue.SetDecimalPlaces (3); m_spinValue.SetTrimTrailingZeros (FALSE); m_spinValue.SetRangeAndDelta (0.1, 1.0, 0.05); m_spinValue.SetPos (0.5); ...
但是有一件事需要注意 - 样式。 确保取消选中“Set buddy integer”样式,或者,如果您是动态创建控件,请不要添加 UDS_SETBUDDYINT 样式。 否则,当用户单击向上/向下箭头时,Windows 会自动将伙伴控件的值重置为某个整数。
格式化
有两种方法可以格式化输出值:通过指定小数位数或提供格式化字符串。 对于第一种方法,您将使用调用 SetDecimalPlaces
函数来指定小数位数。 将 -1 传递给此函数将关闭舍入到小数位数(该值将使用 "%g"
格式字符串输出)。 您还可以通过调用 SetTrimTrailingZeros
来指定是否要删除任何尾随零。 对于第二种方法,您只需提供您自己的格式化字符串,该字符串稍后将与 CString
的 Format
函数一起使用。 示例: SetFormatString ("%.2e")
备注
请务必设置适当的格式设置。 如果您的格式设置不足以满足当前范围和增量,则伙伴控件中的文本可能根本不会更改。 例如,如果您将增量设置为 0.005,但小数位数仅设置为 1,则当用户单击向上和向下箭头时,伙伴控件中的值不会更改。 这是因为该控件不会在内部保留当前值。 该值是在递增或递减之前从伙伴控件获得的。 然后对其进行格式化并传递回伙伴控件。 因此,格式设置非常重要。
修订
2002-07-03 | 注释掉了 InitControl 中的 ModifyStyle - 它不起作用,没有删除 UDS_SETBUDDYINT 样式。 而是放置了 ASSERT 。 所以现在,如果您忘记在资源中删除 UDS_SETBUDDYINT 样式,程序将会断言。修复了环绕。 在某些情况下,由于机器精度较差,环绕条件无法正确评估。 |
2002-06-05 | Warren Stevens 添加了环绕功能。 如果将微调控件的样式设置为“wrap”,则如果增加或减少超过范围限制,该值将环绕。 |
2002-04-17 | 修复了裁剪零的错误。 如果小数位数设置为零,它仍然会裁剪零(例如,100 将变为 1)。 |
2001-08-24 | 将 ON_NOTIFY_REFLECT 更改为 ON_NOTIFY_REFLECT_EX ,以便父级也可以处理来自微调控件的通知消息。 感谢 Emmanuil Tsagarakis。 |
2001-07-06 | 原始版本。 |