CEdit限定輸入的字符長度

想要實現在輸入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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章