3

在我的对话框中,有一个 CEdit 框,用于设置最大字符数。下面在 DoDataExchange 函数中:

void CDlgSurvey::DoDataExchange(CDataExchange* pDX)
{
    DDX_Control(pDX, IDC_EDIT_SURVEY_ID, m_SurveyIDEdit);//ACUTALLY THE ISSUE IS HERE,SO LATER WE MODIFIED THE CLASS FUNCTION Onchar in m_SurveyIDEdit RELATED
    DDX_Text(pDX, IDC_EDIT_SURVEY_ID, m_SurveyID);
    DDV_MaxChars(pDX, m_SurveyID, SURVEY_ID_FIELD_LENGTH);
}

我发现它有效。这意味着我不能键入超过 SURVEY_ID_FIELD_LENGTH 的字符。但问题是当我已经输入了 SURVEY_ID_FIELD_LENGTH 长度的字符时,我试图通过在文本末尾使用退格键来删除一些字符。它不起作用。有人遇到过这样的问题吗?我还尝试使用另一种方式在 OnInitDialog 中设置最大文本,

BOOL CDlgSurvey::OnInitDialog()
{
    //set Max Text in Edit Box
    CEdit* pEditControl = (CEdit*)GetDlgItem(IDC_EDIT_SURVEY_ID);
    if (pEditControl)
    {
        pEditControl->SetLimitText(SURVEY_ID_FIELD_LENGTH);
    }

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

问题是一样的,再次,达到最大字符后我不能使用退格键。有人对如何解决它有任何想法吗?谢谢,

4

1 回答 1

2

SetLimitText检查代码后,它与or无关DDV_MaxChars。实际问题涉及DDX_Control.

使用变量m_SurveyIDEdit我们检查字符限制。一旦我们发现文本长度已经达到(MaxLength),它只是简单地返回。那就是问题所在。

所以我们修改了代码。我们仍然处理CEdit::OnChar方法。所以处理这个问题的关键是:每次你都应该检查所有不相关的代码,看看会发生什么。

我的编辑控件实际上是从CRestrictedEdit. 我的解决方案是调整OnChar处理程序。

void CRestrictedEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // Get the text of the edit control
    CString sText;
    GetWindowText(sText);

    // if the control limit is already reached, no need to validate the character.
    if ((static_cast<UINT>(sText.GetLength())) == this->GetLimitText())
    {
        CEdit::OnChar(nChar, nRepCnt, nFlags); //THIS IS NEW LINE ADDED
        return;
    }
}
于 2018-02-19T23:21:36.197 回答