VC Edit控件自動換行顯示方法

方法一.將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");

這種方法直接向空間發送替換字符消息,控件收到該消息的時候就會自動增長消息。固然了,該方法仍然須要獲取主窗口的句柄,這個能夠在初始化的時候獲取,很明顯,這種方法減小了不少工做量,耦合性也少不少。建議使用此方法。

相關文章
相關標籤/搜索