【问题标题】:MFC - Remove leading zeros for CEdit number controlMFC - 删除 CEdit 数字控制的前导零
【发布时间】:2017-08-18 03:34:27
【问题描述】:

我发现 CEdit 控件在其属性中有选项“数字”,这样我就可以防止用户在此文本框中输入非数字字符 - 它现在是 CEdit 数字控件。 如果有一个选项“数字”,我想也许有一种方法可以删除 CEdit 的前导零,就像选项“数字”一样简单。

我尝试过Dialog Data Exchange,希望它会自动为我删除前导零,但它不会。

然后我认为这样做的方法是为每个 CEdit 数字控件添加 EN_KILLFOCUS 消息,但我发现这已经筋疲力尽了。

所以我认为更好的方法是添加 EN_KILLFOCUS,但所有 CEdit 数字控件都失去焦点事件点到一个函数,在这个函数中,我将删除“当前”控件的前导零,但在 C# 中我可以得到'current'控件,在C++中我不知道是否支持。

或继承 CEdit 以使 CEditNum - 实现失去焦点删除前导零功能,但使用此解决方案,我无法在 Visual Studio 设计窗口上设计它(我认为)。希望有类似this solution的解决方案(是Draw&Drop问题的解决方案)

无论如何,在应用最终解决方案(EN_KILLFOCUS)之前,我想确定是否有更好的方法 - 最少实现,重用 MFC 的现有实现。

关于删除前导零的一点说明:您在 CEdit 控件中输入:00001,然后失去焦点,CEdit 控件会向您显示:1. 当您在其单元格中输入数字时,这个想法就像 MS Excel。

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    “但是所有的CEdit数字控件失去焦点事件点到一个函数”

    确实如此,但您将获得刚刚失去焦点的控件的控件 ID 作为参数。

    将此添加到您的消息表中,将 IDC_FIRST、IDC_LAST 替换为您的编辑控件的第一个和最后一个 ID,或者使用 0、0xFFFFFFFF。

    ON_CONTROL_RANGE(EN_KILLFOCUS, IDC_FIRST, IDC_LAST, OnKillFocus). 
    

    这是 OnKillFocus 的签名,以及如何获取 CWnd 以应用更改。

    void CMyDialogClass::OnKillFocus(UINT nID) 
    {
        // you can further check if the ID is one of interest here...
        // if your edit control control IDs are not contiguous, for example.
    
        // you can get a CEdit* here, but only if you used DDX to map the 
        // control to a CEdit.  
        CWnd* pCtrl = GetDlgItem(nID);
        if (pCtrl)
        {
            CString str;
            pCtrl->GetWindowText(str);
            // remove zeroes, or format as you like....
            str.Format(_T("%d"), _tcstoi(str));
            pCtrl->SetWindowText(str);
        }
    }
    
    // if you mapped the control to a CEdit, here's how you can safely          
    // get a pointer to a CEDit
    
    CEdit* pEdit = (CEdit*)GetDlgItem(nID);
    ASSERT_KINDOF(CEdit, pEdit);  // debug check
    if (pEdit && pEdit->IsKindOf(RUNTIME_CLASS(CEdit)))  // standard check
    {
    // ....
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      相关资源
      最近更新 更多