From 303894ebc54b04ca8dbfa26e22851b7919e0ae5d Mon Sep 17 00:00:00 2001 From: weishigao Date: Fri, 20 Sep 2024 17:36:19 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E4=B8=80=E6=AD=A5=E5=AE=8C=E5=96=84Nu?= =?UTF-8?q?mberEdit=E6=8E=A7=E4=BB=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E5=B1=9E=E6=80=A7=E5=92=8C=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Controls/NumberEdit.md | 155 +++++++++++++++++++++++++++++++++- duilib/Control/NumberEdit.cpp | 104 ++++++++++++++++++++++- duilib/Control/NumberEdit.h | 81 ++++++++++++++++-- 3 files changed, 332 insertions(+), 8 deletions(-) diff --git a/docs/Controls/NumberEdit.md b/docs/Controls/NumberEdit.md index 0ea43660..e3641c48 100644 --- a/docs/Controls/NumberEdit.md +++ b/docs/Controls/NumberEdit.md @@ -8,6 +8,10 @@ | :--- | :--- | :--- | :--- | | intonly | false | BOOL | 是否仅支持输入整数,如(true) | | allownegative | false | BOOL | 是否允许输入负数,如(true) | +| maxvalueenabled | false | BOOL | 是否开启最大值控制,如(true) | +| minvalueenabled | false | BOOL | 是否开启最小值控制,如(true) | +| maxvalue | 0 | INT | 允许输入的最大值 | +| minvalue | 0 | INT | 允许输入的最小值 | ## 可用接口 @@ -17,6 +21,18 @@ | [SetIntOnly](#SetIntOnly) | 设置是否仅支持输入整数 | | [IsAllowNegative](#IsAllowNegative) | 判断是否允许输入负数 | | [SetAllowNegative](#SetAllowNegative) | 设置是否允许输入负数 | +| [GetIntValue](#GetIntValue) | 获取控件中的整数 | +| [GetValue](#GetValue) | 获取控件中的实数 | +| [SetValue](#SetValue) | 设置控件的数值(整数) | +| [SetValue](#SetValue-1) | 设置控件的数值(实数) | +| [IsMaxValueEnabled](#IsMaxValueEnabled) | 判断是否开启最大值控制 | +| [SetMaxValueEnabled](#SetMaxValueEnabled) | 设置是否是否开启最大值控制 | +| [IsMinValueEnabled](#IsMinValueEnabled) | 判断是否开启最小值控制 | +| [SetMinValueEnabled](#SetMinValueEnabled) | 设置是否是否开启最小值控制 | +| [GetMaxValue](#GetMaxValue) | 获取可输入的最大值 | +| [SetMaxValue](#SetMaxValue) | 设置可输入的最大值 | +| [GetMinValue](#GetMinValue) | 获取可输入的最小值 | +| [SetMinValue](#SetMinValue) | 设置可输入的最小值 | ### IsIntOnly @@ -31,7 +47,7 @@ bool IsIntOnly() ### SetIntOnly -判断是否仅支持输入整数 +设置是否仅支持输入整数 ```cpp void SetIntOnly(bool bIntOnly = true) @@ -64,5 +80,142 @@ void SetAllowNegative(bool bAllowNegative = true) - `bAllowNegative` 为 true 则允许进行负数输入,false 为不允许 - 返回值:无 +### GetIntValue + +获取控件中的整数 + +```cpp +int GetIntValue(int def = 0) +``` + + - 参 数: + - `def` 取值失败时返回的缺省值 + - 返回值:返回控件中的整数 + +### GetValue + +获取控件中的实数 + +```cpp +double GetValue(double def = 0) +``` + + - 参 数: + - `def` 取值失败时返回的缺省值 + - 返回值:返回控件中的实数 + +### SetValue + +设置控件的数值(整数) + +```cpp +void SetValue(int value) +``` + + - 参 数: + - `value` 要设置的整数值 + - 返回值:无 + +### SetValue + +设置控件的数值(实数) + +```cpp +void SetValue(double value) +``` + + - 参 数: + - `value` 要设置的实数值 + - 返回值:无 + +### IsMaxValueEnabled + +判断是否开启最大值控制 + +```cpp +bool IsMaxValueEnabled() +``` + + - 参 数:无 + - 返回值:返回 true 表示开启 + +### SetMaxValueEnabled + +设置是否是否开启最大值控制 + +```cpp +void SetMaxValueEnabled(bool bMaxValueEnabled = false) +``` + + - 参 数: + - `bMaxValueEnabled` 为 true 开启 + - 返回值:无 + +### IsMinValueEnabled + +判断是否开启最小值控制 + +```cpp +bool IsMinValueEnabled() +``` + + - 参 数:无 + - 返回值:返回 true 表示开启 + +### SetMinValueEnabled + +设置是否是否开启最小值控制 + +```cpp +void SetMinValueEnabled(bool bMinValueEnabled = false) +``` + + - 参 数: + - `bMinValueEnabled` 为 true 开启 + - 返回值:无 + +### GetMaxValue + +获取可输入的最大值 + +```cpp +int GetMaxValue() +``` + + - 参 数:无 + - 返回值:返回可输入的最大值 +### SetMaxValue +设置可输入的最大值 + +```cpp +void SetMaxValue(int value) +``` + + - 参 数: + - `value` 要设置的最大可输入值 + - 返回值:无 + +### GetMinValue + +获取可输入的最小值 + +```cpp +int GetMinValue() +``` + + - 参 数:无 + - 返回值:返回可输入的最小值 + +### SetMinValue + +设置可输入的最小值 + +```cpp +void SetMinValue(int value) +``` + + - 参 数: + - `value` 要设置的最小可输入值 + - 返回值:无 diff --git a/duilib/Control/NumberEdit.cpp b/duilib/Control/NumberEdit.cpp index d48532a7..da02de2f 100644 --- a/duilib/Control/NumberEdit.cpp +++ b/duilib/Control/NumberEdit.cpp @@ -1,15 +1,32 @@ #include "stdafx.h" #include "base/thread/thread_manager.h" - +#include // These constants are for backward compatibility. They are the // sizes used for initialization and reset in RichEdit 1.0 namespace ui { + template + T1 StringToNum(const std::string& input, const T1 def) { + std::istringstream iss(input); + T1 num; + iss >> num; + if (iss.fail()) { + return def; + } + else { + return num; + } + } + NumberEdit::NumberEdit() : RichEdit(), m_bIntOnly(false), - m_bAllowNegative(false) + m_bAllowNegative(false), + m_bMaxValueEnabled(false), + m_iMaxValue(0), + m_bMinValueEnabled(false), + m_iMinValue(0) //��Сֵ { m_bWantTab = false; m_lTwhStyle &= ~ES_MULTILINE; @@ -35,6 +52,65 @@ namespace ui { m_bAllowNegative = bAllowNegative; } + int NumberEdit::GetIntValue(int def) + { + return StringToNum(GetUTF8Text(), def); + } + + double NumberEdit::GetValue(double def) + { + return StringToNum(GetUTF8Text(), def); + } + + void NumberEdit::SetValue(int value) + { + SetText(std::to_wstring(value)); + } + + void NumberEdit::SetValue(double value) + { + SetText(std::to_wstring(value)); + } + + bool NumberEdit::IsMaxValueEnabled() + { + return m_bMaxValueEnabled; + } + + void NumberEdit::SetMaxValueEnabled(bool bMaxValueEnabled) + { + m_bMaxValueEnabled = bMaxValueEnabled; + } + + bool NumberEdit::IsMinValueEnabled() + { + return m_bMinValueEnabled; + } + + void NumberEdit::SetMinValueEnabled(bool bMinValueEnabled) + { + m_bMinValueEnabled = bMinValueEnabled; + } + + int NumberEdit::GetMaxValue() + { + return m_iMaxValue; + } + + void NumberEdit::SetMaxValue(int value) + { + m_iMaxValue = value; + } + + int NumberEdit::GetMinValue() + { + return m_iMinValue; + } + + void NumberEdit::SetMinValue(int value) + { + m_iMinValue = value; + } void NumberEdit::SetText(const std::wstring & strText) { std::wstring strNum = _ToNumberStr(strText); @@ -136,6 +212,26 @@ namespace ui { TxSendMessage(WM_KEYDOWN, event.wParam, event.lParam, NULL); } + bool NumberEdit::OnTxTextChanged() + { + if (m_pWindow != NULL) { + if (m_bMaxValueEnabled) { + if (GetValue() > m_iMaxValue) { + SetValue(m_iMaxValue); + } + } + + if (m_bMinValueEnabled) { + if (GetValue() < m_iMinValue) { + SetValue(m_iMinValue); + } + } + + m_pWindow->SendNotify(this, kEventTextChange); + } + + return true; + } void NumberEdit::SetAttribute(const std::wstring& strName, const std::wstring& strValue) { if (strName == _T("number")) {} @@ -143,6 +239,10 @@ namespace ui { else if (strName == _T("multiline")) {} else if (strName == _T("intonly")) SetIntOnly(strValue == _T("true")); else if (strName == _T("allownegative")) SetAllowNegative(strValue == _T("true")); + else if (strName == _T("maxvalueenabled")) SetMaxValueEnabled(strValue == _T("true")); + else if (strName == _T("minvalueenabled")) SetMinValueEnabled(strValue == _T("true")); + else if (strName == _T("maxvalue")) SetMaxValue(std::stoi(strValue)); + else if (strName == _T("minvalue")) SetMinValue(std::stoi(strValue)); else RichEdit::SetAttribute(strName, strValue); } diff --git a/duilib/Control/NumberEdit.h b/duilib/Control/NumberEdit.h index f7035c35..a3ad20c6 100644 --- a/duilib/Control/NumberEdit.h +++ b/duilib/Control/NumberEdit.h @@ -41,21 +41,92 @@ namespace ui */ void SetAllowNegative(bool bAllowNegative = false); + /** + * @brief �����ı�������ֵ + */ + int GetIntValue(int def = 0); + + /** + * @brief �����ı���ʵ��ֵ + */ + double GetValue(double def=0); + + /** + * @brief ���ı�������һ������ֵ + */ + void SetValue(int value); + + /** + * @brief ���ı�������һ��ʵ��ֵ + */ + void SetValue(double value); + + /** + * @brief �ж��Ƿ������ֵ���� + * @return ���� true ��ʾ�� + */ + bool IsMaxValueEnabled(); + + /** + * @brief �����Ƿ������ֵ���� + * @param[in] bMaxValueEnabled Ϊ true ���� + * @return �� + */ + void SetMaxValueEnabled(bool bMaxValueEnabled = false); + + /** + * @brief �ж��Ƿ�����Сֵ���� + * @return ���� true ��ʾ�� + */ + bool IsMinValueEnabled(); + + /** + * @brief �����Ƿ�����Сֵ���� + * @param[in] bMinValueEnabled Ϊ true ���� + * @return �� + */ + void SetMinValueEnabled(bool bMinValueEnabled = false); + + /** + * @brief �������ֵ�趨 + */ + int GetMaxValue(); + + /** + * @brief �������ֵ + */ + void SetMaxValue(int value); + + /** + * @brief ������Сֵ�趨 + */ + int GetMinValue(); + /** - * @brief ���ÿؼ����ı� - * @param[in] strText Ҫ���õ��ı����� - * @return �� - */ + * @brief ������Сֵ + */ + void SetMinValue(int value); + + /** + * @brief ���ÿؼ����ı� + * @param[in] strText Ҫ���õ��ı����� + * @return �� + */ virtual void SetText(const std::wstring& strText) override; + virtual void OnChar(EventArgs& event) override; virtual void OnKeyDown(EventArgs& event) override; + virtual bool OnTxTextChanged() override; virtual void SetAttribute(const std::wstring& pstrName, const std::wstring& pstrValue) override; protected: bool m_bIntOnly; //��֧������ Ĭ�Ϸ� bool m_bAllowNegative; //�������� Ĭ�Ϸ� - + bool m_bMaxValueEnabled; //�������ֵ���� + bool m_bMinValueEnabled; //������Сֵ���� + int m_iMaxValue; //���ֵ + int m_iMinValue; //��Сֵ private: std::wstring _ToNumberStr(std::wstring str); };