方法一.將EDIT映射到一CString 函數
1
2
|
m_String = m_String + sNewString + "\r\n" //自動換行
UpdateData(false);
|
其中m_String是edit關聯的一個CString變量。 測試
這種方法的基本原理是獲取原數據,添加新數據,而後再顯示。當字符數量不少的時候,會出現閃屏,資源消耗過多的弊端,不建議使用。 spa
方法二.將EDIT映射到一EDIT控件變量 線程
1
2
|
m_Edit.SetSel(-1, -1); //自動滾屏
m_Edit.ReplaceSel(sNewString+"\r\n"); //自動換行
|
其中m_Edit是edit關聯的一個CEdit變量,這種方法利用控件自身的特性,不須要消耗過多的資源,也不會有閃屏的問題。推薦此方法。 指針
方法三.將EDIT映射到一EDIT控件變量 對象
1
2
3
|
DWORD dwLength = m_Edit.SendMessage(WM_GETTEXTLENGTH); //獲取字符長度
m_Edit.SetSel(dwLength, dwLength); //設置光標位置到末尾
m_Edit.ReplaceSel(NewStr + 「\r\n」); //末尾加文本
|
這種方法跟2的道理很類似,可是兼容性彷佛不那麼好,測試有的時候有效,有的時候卻很差使。 進程
追加內容:若是字符文本過多,咱們怎麼清理呢? ci
範例:到200行時將全部內容清空 資源
代碼: it
1
2
3
4
5
6
7
8
9
10
11
|
int LineNum=m_Edit.GetLineCount(); //獲取行號
if(LineNum<=200) //追加
{
m_Edit.SetSel(-1, -1);
m_Edit.ReplaceSel(str+"\r\n");
}
else //清理
{
m_Edit.SetSel(0, -1);
m_Edit.Clear();
}
|
固然了,無論用什麼方法,edit控件Multiline屬性必定要設置爲True,不然文本將只有一行,當Multiline屬性被置爲Ture的時候,Auto Vscroll屬性即可用了,須要設爲TRUE,不然文本到最行一行的時候,不會再滾動了.
消息類與edit控件的通信
在不少狀況下,爲了管理咱們輸出的消息,咱們須要定義一個消息類,全部的消息都由這個類來管理分發。那麼這個時候就會遇到一個問題,消息管理類怎樣與咱們的控件edit通信呢?
一個方案是將這個消息類定義爲全局對象,這樣咱們能夠實時的獲取這個對象的數據,而後再將其顯示。可是,若是對象是全局的,那麼若是同時有多個數據到達的時候,數據就會出現混亂,由於顯示線程只有一個。一個數據沒有處理好,其餘的數據就會被覆蓋。
幾經嘗試,發現一個可行的方案:在消息類中使用sendMessage向edit控件所在的對話框發送自定義消息,sendMessage有4個參數,其中HWND能夠在其主窗口初始化中獲得,在初始化的過程當中咱們也能夠同時獲取控件的ID,這樣在發送的時候,WPARAM能夠攜帶控件ID,LPARAM能夠攜帶消息指針,因爲是同進程,對同一個指針訪問沒有問題。
關鍵代碼以下:
發送端
1
|
::SendMessage(hWnd, WM_SHOWMSG, ctrId, (LPARAM)strLogMsg.GetBuffer(0));
|
接受端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//自定義響應消息
LRESULT CPage1::OnShowMsg(WPARAM wParam, LPARAM lParam)
{
DWORD dwLineCount = m_strLogMsg.GetLineCount();
//行數超過200,就清理
if (dwLineCount >= 200)
{
m_strLogMsg.SetSel(0,-1);
m_strLogMsg.Clear();
}
m_strLogMsg.SetSel(-1);
m_strLogMsg.ReplaceSel((LPCSTR)lParam);
return 0;
}
|
在這個接受端,WPARAM原本是傳遞控件ID過來了,咱們能夠GetDlgItem獲取其句柄,而後在調用其成員函數,也能夠像上面同樣,直接將控件綁定變量,而後再直接調用就行了。
在對話框的初始化代碼中,Edit已經初始化好,直接給其發送消息,edit已經能夠正常響應了。
上面的方法通過測試,的確有效可用,可是好像不太符合「高內聚,低耦合」封裝特性,爲了配消息類的工做,主窗口還要本身創建一個自定義消息響應函數,這個彷佛不太合適。
因而我又發現了另一個方法,這個方法更簡潔高效。一樣是SengMessge以下:
1
|
::SendMessage(GetDlgItem(EDT_MSG)->m_hWnd, EM_REPLACESEL, FALSE, (LPARAM)"消息到達 \r\n");
|
這種方法直接向空間發送替換字符消息,控件收到該消息的時候就會自動增長消息。固然了,該方法仍然須要獲取主窗口的句柄,這個能夠在初始化的時候獲取,很明顯,這種方法減小了不少工做量,耦合性也少不少。建議使用此方法。