將Multiline設爲true,Auto Hscroll設爲false,Auto Vscroll設爲true,Vertical Scroll設爲true。
1.(轉)問題:將將串口收到的數據顯示到Edit control控件中時,發現最多隻能顯示30000個字符,超過字符則不顯示
解決:
默認情況下Edit control控件最多顯示30000個字符,如果要修改這個最大顯示個數值則需要初始化的時候講這個值修改,最大值爲庫定義的UINT_MAX(即0xFFFFFFFF)。
BOOL appDlg::OnInitDialog()//在這個函數中增加設置
CEdit *p_Edit;
p_Edit = (CEdit*)GetDlgItem(IDC_EDIT_RECEIVE);
p_Edit->SetLimitText(UINT_MAX);//設置顯示最大字符數
2.編輯框向下滾動的方法
方法一:(目前感覺最好)
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT7);
ASSERT(pEdit && pEdit->GetSafeHwnd());
pEdit->SetSel(-1, -1);
pEdit->ReplaceSel(m_editStr);
其中m_editStr爲編輯框關聯變量,賦值時直接賦值,如m_editStr=“12345678”,而不是m_editStr+=“12345678”.方法二:(有閃爍)
m_editStr=editStr;
UpdateData(FALSE);
m_editCtrl.LineScroll(m_editCtrl.GetLineCount());
其中editStr爲累加後的字符串。
方法三:
int nLen=m_editCtrl.GetWindowTextLength();
m_editCtrl.SetSel(nLen, nLen);
m_editCtrl.ReplaceSel(m_editStr);
nLen+=m_editStr.GetLength();
3.問題:由於向編輯框添加字符串的速度太快(5ms大約50個字符串),導致整個界面有卡頓的情況發生,即使是單獨開線程也無濟於事。
解決:不要接收一次字符串往編輯框發一次,可以攢一攢,做一個緩衝區,這樣可以解決卡頓問題。
定義結構體:
typedef struct
{
UINT16 point_index;
UINT16 rx_index;
CString strDisplayBuff[600];
}DisplayCanBuff_s;
DisplayCanBuff_s DisplayCanBuff;
在接收字符串的地方添加:其中editStr爲要顯示的字符串,如editStr=“12345678”,而不是editStr+=“12345678”
if(DisplayCanBuff.rx_index>500)
DisplayCanBuff.rx_index=0;
DisplayCanBuff.strDisplayBuff[DisplayCanBuff.rx_index++]=editStr;
開一個線程:
if(m_startstopdisplay==0)
{
CString strSendBuff(_T(""));
for (int i = 0; i < 50; i++)
{
if (DisplayCanBuff.point_index != DisplayCanBuff.rx_index)
{
//strSendBuff += DisplayCanBuff.strDisplayBuff.GetAt(DisplayCanBuff.point_index++);
strSendBuff += DisplayCanBuff.strDisplayBuff[DisplayCanBuff.point_index++];
if (DisplayCanBuff.point_index >= BUFF_MAX)
{
DisplayCanBuff.point_index = 0;
}
}
else
{
break;
}
}
if (!strSendBuff.IsEmpty())
{
dlg->GetDlgItem(IDC_EDIT7)->SendMessage(EM_SETSEL,-2,-1);
dlg->GetDlgItem(IDC_EDIT7)->SendMessage(EM_REPLACESEL,NULL,(LPARAM)(LPTSTR)(LPCTSTR)strSendBuff);
}
}
4.獲取編輯框內容,如果用下面方式獲取
GetDlgItem(IDC_EDIT1)->GetWindowText(char1,10);
GetDlgItem(IDC_EDIT3)->SetWindowText(char3);
GetDlgItemText(IDC_EDIT1,char1,10);
SetDlgItemText(IDC_EDIT3,char3);
獲取到的是CString類型的,還需要使用sscanf_s(char1,"%d",&data);進行數據轉換。如果直接想獲取編輯框的int值,可以使用
num1=GetDlgItemInt(IDC_EDIT1);
SetDlgItemInt(IDC_EDIT2,num2);
後面一個函數是設置int值,不需要進行類型轉換了,十分方便此外還有發送消息的方式獲取編輯框內容
使用發送消息的方式。
(1)。採用全局類的SendMessage來發送獲取消息內容的。
注意 第一個參數是目標窗口控件的句柄,第二個參數是固定的表示符,第三個是第四個字符變量的大小,第四個是字符變量數組的指針。
::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)char1);
也可以這要獲取句柄。
::SendMessage(m_the_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)char1);
(2)。在窗口類中也有SendMessage函數。
GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)char1);
或者這樣
m_the_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)char1);
也有省事的SendDlgItemMessage 函數,可以直接發送獲取文本的消息指指定控件的ID。
SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,(LPARAM)char2);