想要實現在輸入edit文本信息時,限制住輸入的字符長度,勢必要用到OnChar消息。
當我重寫這個消息之後,發現了一些問題:
1:爲什麼重新後的消息不能響應鍵盤的Backspace?只能響應Delete消息?
2:我在重寫的OnChar消息中,當獲取當前文本內容時,和輸入的內容不符?
在此,我可以分享下我的思路:
當前m_nLength表示設置限定字符串長度的個數
第一步:獲取以往現有的字符串內容
使用GetWindowText
CStringW strText0;
GetWindowText(strText0);
int nFirstLen = strText0.GetLength();
在此處就會遇到我上面所說的問題(2)了。
因爲我獲取edit控件的文本時,是在使用CEdit::OnChar消息之前,所以,每次獲取都只能獲取到錄入之前的內容。
只有在CEdit::OnChar消息之後獲取的文本纔是輸入後的信息。
第二步:判斷以前文本長度 大於 設定的字符串的長度
if (strText0.GetLength() >= m_nLength )
{
OutputDebugString(L"原始文本已經超出範圍\r\n");
return;
}
在這裏就會出現了上文我說的問題(1)了。居然不響應Backspace消息?我記得自己沒有攔截這個消息,也沒有想到是爲什麼。
後來看到了有關於Edit的鍵盤消息的走向,我才發現了問題出在什麼地方。
當使用鍵盤消息時,在程序中的過程是這樣的:
OnKeyDown ---->>> OnChar ------>>> OnKeyUp
在這裏,我直接把當長度大於設定長度時 ,Return了。這裏把後面的消息攔截了。
所以,想要響應鍵盤消息時,應該進行以下修改
if (strText0.GetLength() >= m_nLength && m_nLength != -100 )
{
OutputDebugString(L"原始文本已經超出範圍\r\n");
if (nChar == 8 )
{
CEdit::OnChar(nChar , nRepCnt , nFlags);
return;
}
else
return;
}
第三步:當小於設定文本長度時,直接返回系統的CEdit::OnChar
else
//說明現有的長度沒有超過規定的長度
{
CEdit::OnChar(nChar , nRepCnt , nFlags);
}