代码之家  ›  专栏  ›  技术社区  ›  Kiril

CEDIT数值验证事件C++MFC

  •  4
  • Kiril  · 技术社区  · 15 年前

    我有一个CEdit文本框,它是属性窗格的一部分,只允许数值(正整数)。当人们输入非数字值时,该框可以正常工作,但当他们删除框中的值时,会弹出一个对话框,说明: “请输入一个正整数。”

    情况如下:
    1。我有一个号码(比如20)。
    2。我删除了号码。
    三。我得到错误对话框。
    有人能告诉我如何拦截这个事件并在其中输入默认值吗?

    我的属性窗格如下所示:

    
    const int DEFAULT_VALUE = 20;
    
    class MyPropertyPane:public CPropertyPane
    {
        //....
    private:
        CEdit m_NumericBox;
        int   m_value;
    
        //....
    public:
        afx_msg void OnEnChangeNumericBox();
    
        //....
    }
    void MyPropertyPane::MyPropertyPane()
    {
       // Set a default value
       m_value = DEFAULT_VALUE;
    }
    
    //....
    void MyPropertyPane::DoDataExchange(CDataExchange* pDX)
    {
        DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox);
    
        // this sets the displayed value to 20
        DDX_Text(pDX, IDC_NUMERIC_BOX, m_value);
    }
    
    //....
    void MyPropertyPane::OnEnChangeNumericBox()
    {
        // Somebody deleted the value in the box and I got an event
        // saying that the value is changed.
    
        // I try to get the value from the box by updating my data
        UpdateData(TRUE);
    
        // m_value is still 20 although the value is 
        // deleted inside the text box.
    }
    
    
    3 回复  |  直到 12 年前
        1
  •  8
  •   John Dibling    15 年前

    您正在接收的消息来自数据验证例程,而不是数据交换例程。dodataExchange()中可能有这样的调用:

    void MyPropertyPane::DoDataExchange(CDataExchange* pDX)
    {
        DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox);
        DDX_Text(pDX, IDC_NUMERIC_BOX, m_value);
        DDV_MinMaxInt(pDX, m_value, 1, 20); // if the value in m_value is outside the range 1-20, MFC will pop up an error dialog
    }
    

    您可以通过删除内置的MFC数据验证并添加自己的验证来解决此问题:

    void MyPropertyPane::DoDataExchange(CDataExchange* pDX)
    {
        DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox);
        DDX_Text(pDX, IDC_NUMERIC_BOX, m_value);
    
        if( m_value < 1 || m_value > 20 )
        {
            m_value = DefaultValue;
        }
    }
    
        2
  •  0
  •   Kiril    15 年前

    约翰·迪布林的暗示让我想到了这个解决方案:

    
    void MyPropertyPane::OnEnChangeNumericBox()
    {
        UpdateData(TRUE);
        CString value;
        m_NumericBox.GetWindowText(value);
        if( value.IsEmpty() )
        {
            m_value = DEFAULT_VALUE;
            UpdateData(FALSE);
        }
    }
    

    我真正需要做的唯一验证是检查该框是否包含值,因为实际的数字验证已经由该框处理。用户不能输入非数字值,但他们可以删除现有的值,因此在数据交换功能中很难处理这种情况,我必须“黑客”onchange事件。

        3
  •  0
  •   Rajagopal 웃    12 年前

    这个对我有用

    void CtimersDlg::OnEnChangeInterval()
    {
       CString value; //or use char *
       CWnd *pWnd = GetDlgItem(IDC_INTERVAL);//IDC_EDITBOX
    
       if(pWnd)
       {
          pWnd->GetWindowTextW(value);
       }
    
       int i = _wtoi(value); //if char * use _atol()
       if((!value.IsEmpty())&& (i))  //To check i = 0 or 00 entered or not
          UpdateData(TRUE);
    }
    
    推荐文章