方法一.将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");
|
这种方法直接向空间发送替换字符消息,控件收到该消息的时候就会自动增长消息。固然了,该方法仍然须要获取主窗口的句柄,这个能够在初始化的时候获取,很明显,这种方法减小了不少工做量,耦合性也少不少。建议使用此方法。