MFC編輯框&最多顯示30000字符的解決方法

將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);




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章