VC Edit控制項自動換行顯示方法

2021-07-03 14:52:16 字數 2598 閱讀 6118

自動換行有很多種實現方法,但edit控制項必須設定以下屬性:

當然了,不管用什麼方法,edit控制項的屬性一定需要設定:

edit控制項multiline屬性一定要設定為true,否則文字將只有一行,當multiline屬性被置為ture的時候,auto vscroll屬性(設為(ture)便可用了(豎直方向超出範圍自動滾屏,需要設為true,auto hscroll(設為ture)水平自動換行,否則文字到最行一行的時候,不會再滾動了.

方法一:將edit對映到一cstring

m_string = m_string + snewstring + "\r\n"

//自動換行

updatedata(false);

其中m_string是edit關聯的乙個cstring變數。

這種方法的基本原理是獲取原資料,新增新資料,然後再顯示。當字元數量很多的時候,會出現閃屏,資源消耗過多的弊端,不建議使用

方法二.將edit對映到一edit控制項變數(型別為control, cedit型別)

**m_edit.setsel(-1, -1); //自動滾屏

m_edit.replacesel(snewstring+」\r\n」); //自動換行**

其中m_edit是edit關聯的乙個cedit變數,這種方法利用控制項自身的特性,不需要消耗過多的資源,也不會有閃屏的問題。推薦此方法。

方法三.將edit對映到一edit控制項變數

dword dwlength = m_edit.sendmessage(wm_gettextlength);  //獲取字元長度

m_edit.setsel(dwlength, dwlength); //設定游標位置到末尾

m_edit.replacesel(newstr + 「\r\n」); //末尾加文字

這種方法跟2的道理很相似,但是相容性似乎不那麼好,測試有的時候有效,有的時候卻不好使。

追加內容:如果字元文字過多,我們怎麼清理呢?

範例:到200行時將所有內容清空

**:

int linenum=m_edit.getlinecount();     //獲取行號

if(linenum<=200) //追加

else

//清理

訊息類與edit控制項的通訊

在很多情況下,為了管理我們輸出的訊息,我們需要定義乙個訊息類,所有的訊息都由這個類來管理分發。那麼這個時候就會遇到乙個問題,訊息管理類怎樣與我們的控制項edit通訊呢?

乙個方案是將這個訊息類定義為全域性物件,這樣我們可以實時的獲取這個物件的資料,然後再將其顯示。但是,如果物件是全域性的,那麼如果同時有多個資料到達的時候,資料就會出現混亂,因為顯示執行緒只有乙個。乙個資料沒有處理好,其他的資料就會被覆蓋。

幾經嘗試,發現乙個可行的方案:在訊息類中使用sendmessage向edit控制項所在的對話方塊傳送自定義訊息,sendmessage有4個引數,其中hwnd可以在其主視窗初始化中得到,在初始化的過程中我們也可以同時獲取控制項的id,這樣在傳送的時候,wparam可以攜帶控制項id,lparam可以攜帶訊息指標,由於是同程序,對同乙個指標訪問沒有問題。

關鍵**如下:

傳送端

::sendmessage(hwnd, wm_showmsg, ctrid, (lparam)strlogmsg

.getbuffer(0));

接受端:

//自定義響應訊息

lresult cpage1::onshowmsg(wparam wparam, lparam lparam)

m_strlogmsg.setsel(-1);

m_strlogmsg.replacesel((lpcstr)lparam);

return 0

;}

在這個接受端,wparam本來是傳遞控制項id過來了,我們可以getdlgitem獲取其控制代碼,然後在呼叫其成員函式,也可以像上面一樣,直接將控制項繫結變數,然後再直接呼叫就好了。

在對話方塊的初始化**中,edit已經初始化好,直接給其傳送訊息,edit已經可以正常響應了。

上面的方法經過測試,的確有效可用,但是好像不太符合「高內聚,低耦合」封裝特性,為了配訊息類的工作,主視窗還要自己建立乙個自定義訊息響應函式,這個似乎不太合適。

於是我又發現了另外乙個方法,這個方法更簡潔高效。同樣是sengmessge如下:

::sendmessage(getdlgitem(edt_msg)->m_hwnd, em_replacesel, false, (lparam)"訊息到達 \r\n");
這種方法直接向空間傳送替換字元訊息,控制項收到該訊息的時候就會自動增加訊息。當然了,該方法仍然需要獲取主視窗的控制代碼,這個可以在初始化的時候獲取,很明顯,這種方法減少了很多任務作量,耦合性也少很多。建議使用此方法。

Masonry布局控制項,自動換行

masonry偏移量offset答疑 make.top.equalto self.view offset 10 make.left.equalto self.view offset 10 make.bottom.equalto self.view offset 10 make.right.equal...

VC 之Edit控制項自動換行

vc 中edit控制項中的文字換行標誌是 r n,而不是一般的 n。所以說,如果想在edit控制項中顯示兩行文字,可以使用如下方法 cstring str name r n pedit setwindowtext str 這樣就可以在edit空間中顯示兩行文字。前提是 該edit控制項必須設定為es...

MFC之CListBox自動換行顯示(實測)

需要在listbox控制項中顯示一些資訊。為方便檢視,不使用水平滾動條。當要輸出的字串占用的寬度超過listbox的寬度時,截斷字串,剩餘的在下一行顯示。1.計算listbox所佔的寬度,用getclientrect。getclientrect返回的是客戶區的大小。當listbox中有垂直滾動條時,...