1. 程式人生 > >通過編寫串口助手工具學習MFC過程——(六)添加Edit編輯框控件

通過編寫串口助手工具學習MFC過程——(六)添加Edit編輯框控件

word ash 問題 相關操作 數據 說明 true 特殊功能 包含

通過編寫串口助手工具學習MFC過程

因為以前也做過幾次MFC的編程,每次都是項目完成時,MFC基本操作清楚了,但是過好長時間不再接觸MFC的項目,再次做MFC的項目時,又要從頭開始熟悉。這次通過做一個串口助手再次熟悉一下MFC,並做了一下記錄,以便方便以後查閱。做的過程中多是遇到問題直接百度和谷歌搜索來的,所以很多都是不求甚解,知其然不知其所以然。另外做此工具只是為了熟悉了解,許多功能還沒有完善!(開發工具VS2008)

(六)添加Edit編輯框控件

屬性說明:

Auto HScroll 設置True當編輯框輸入的文字大於邊框時自動水平方向增加。

Auto VScroll 設置True就可以實現每一行填滿後自動換行了。

Vetrical Scroll屬性設置為True,當輸入或顯示超過編輯框的大小後就會出現垂直滾動條。

Multiline 屬性設置為True,多行使能,當編輯框輸入的文字大於邊框時可以向下換行。

ReadOnly 設置True只能顯示和讀取,不能做為輸入編輯,可以使用SetWindowText顯示。

添加控件、修改屬性ID和增加變量部分略,參見按按鈕部分。

1、Edit的基本功能:

SetWindowText()設置文本顯示

GetWindowText()獲取文本顯示

這兩個函數是API函數,多數控件均支持這兩個函數。

2、實現特殊功能:自動換行,垂直滾動條自動下移

(1)將其Multiline屬性設置為True,Auto HScroll屬性設置False,Auto VScroll屬性設置True,這樣就可以實現每一行填滿後自動換行了(Auto VScroll設置成Faile也可以實現 )。

(2)再將Vetrical Scroll屬性設置為True,當輸入或顯示超過編輯框的大小後就會出現垂直滾動條。

(3)如果是輸入,滾動條會自動移動跟隨到當前輸入行,但是如果是設置將很多內容一次性讓編輯框顯示,滾動條就會一直處於最上方,需要手動拉到最下面才能看見最後一行的內容,在很多時候這是我們不需要的,而是想要滾動條處於最下方,如下的代碼將實現這一功能:
this->SetDlgItemTextW(IDC_ALLMSG_SHOW,allMsg);//將allMsg內容顯示到ID為IDC_ALLMSG_SHOW的編輯框
m_showmsg.LineScroll(m_showmsg.GetLineCount());//m_showmsg為該編輯框的control變量名
(使用控件變量的一些成員函數設置滾動條的位置)

這個功能實現方法,以上內容 引用:http://blog.sina.com.cn/s/blog_5d2bad130100sysh.html

本例中實現顯示的方法是SetWindowText。

m_EditRXData.SetWindowText(pCComSer->m_strRXData); //顯示接收

m_EditRXData.LineScroll(m_EditRXData.GetLineCount());//EditRXData為該編輯框的control變量名(使用控件變量的一些成員函數設置滾動條的位置)

CEdit::LineScroll
void LineScroll(int nLine,int nChars = 0);
參數:

nLine

指定縱向滾動的行數。

nChars

指定水平滾動的字符數。如果編輯控件使用ES_RIGHT或ES_CENTER風格,此值無效。

說明:
調用此成員函數滾動多行編輯控件的文本。
此成員函數僅用於多行編輯控件。
編輯控件的縱向滾動不能超過該文本的最後一行,如果當前行號加上由nLines指定的行數超過編輯控件中的總行數,則它的值被調整而使得文本的最後一行滾動達到編輯控件窗口的頂端。
此函數可以水平滾動經過每行的最後一個字符。

3、實現特殊功能:限定Edit輸入指定內容的代碼

Update事件和 change事件都可以

void CserialtestDlg::OnEnUpdateEdit1()

{

// TODO: 如果該控件是RICHEDIT 控件,它將不

// 發送此通知,除非重寫CDialog::OnInitDialog()

// 函數,以將EM_SETEVENTMASK 消息發送到該控件,

// 同時將ENM_UPDATE 標誌“或”運算到lParam 掩碼中。

// TODO: 在此添加控件通知處理程序代碼

/*

CString strTemp=_T("");

edit1.GetWindowText(strTemp);

int len = strTemp.GetLength();

for (int i = 0; i < len; i ++)

{

if(strTemp.GetAt(i) <‘0‘ || strTemp.GetAt(i) > ‘9‘)

{

strTemp = strTemp.Left(i);

edit1.SetWindowText(strTemp);

edit1.SetSel(i,i,TRUE);

AfxMessageBox(_T("輸入數字不對!"));

return;

}

}

*/

}

void CserialtestDlg::OnEnChangeEdit1()

{

// TODO: 如果該控件是RICHEDIT 控件,它將不

// 發送此通知,除非重寫CDialog::OnInitDialog()

// 函數並調用CRichEditCtrl().SetEventMask(),

// 同時將ENM_CHANGE 標誌“或”運算到掩碼中。

// TODO: 在此添加控件通知處理程序代碼

CString strTemp=_T("");

TCHAR TxTmp ;

edit1.GetWindowText(strTemp);

int len = strTemp.GetLength();

for (int i = 0; i < len; i ++)

{

TxTmp = strTemp.GetAt(i);

if((TxTmp>=_T(‘0‘) && TxTmp <= _T(‘9‘))|| (TxTmp>=_T(‘a‘) && TxTmp <= _T(‘f‘)) \

|| (TxTmp>=_T(‘A‘) && TxTmp <= _T(‘F‘)) || (TxTmp == _T(‘ ‘)))

{

;

}

else

{

//strTemp = strTemp.Left(i); // 從左取字串

strTemp.Delete(i,1); //現在還不太完善

m_EditTXData.SetWindowText(strTemp);

m_EditTXData.SetSel(i,i,TRUE);

AfxMessageBox(_T("請輸入正確格式0-9 a-f A-F!"));

return;

}

}

}

這兩個函數的實現方法完全一樣,只是不同的事件類型,一個是update更新事件,一個是change改變事件,這兩個事件均能實現,任選其一。

函數實現方法是從編輯框中獲取文本內容,逐個字符檢查是否是數字(此功能用於發送16進制數字時,禁止輸入非數字的字符),檢測到此字符後,將這個字符刪除,並重新顯示剩下的字符串,並設置編輯框中光標位置。

此函數中涉及了幾個字符串CString類型的操作,這個是VC中的數據類型,相關操作請參考API,以後也會直接介紹。在VC操作中用這個類型操作字符串還是比較方便的,類似於JAVA的String類型。這裏簡單介紹一下這裏用到的幾個函數。

TCHAR TxTmp ;//TCHAR 與環境有關,Unicode字符集是Wchar,多字節字符集是char類型

CString strTemp=_T(""); //初始化 strTemp為空字符串。

int len = strTemp.GetLength(); //獲取字符串的長度。不包含結尾的空字符。

TxTmp = strTemp.GetAt(i);

TCHAR GetAt( int nIndex ) const;
返回下標為nIndex的字符,與字符串的[]用法相同

strTemp = strTemp.Left(i); // 從左取字串 ,此句在此處的功能是,如在字符串的中間修改一個字符或插入一個字符不是數字的,從這個字符到後面的字符串都將刪除,顯然不夠合理。

strTemp.Delete(i,1); //現在還不太完善

int Delete( int nIndex, int nCount = 1 )
刪除字符,刪除從下標nIndex開始的nCount個字符。

此句在此處的功能是從字符串中間刪除一個字符,如果插入一個不是數字的字符,直接將此字符刪除,但如果修改字符串中的一個字符使之成為非數字字符,直接將此字符刪除,這樣原來存在的字符也就刪除了,雖然比上面的函數稍好一些,但也不是十分完美。

m_EditTXData.SetSel(i,i,TRUE); //將光標位置置於插入字符處

CEdit::SetSel
void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE);
void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = False);
參數:

dwSelection

低位字指定起始位置,高位字為結束位置。如果低位為0,高位為-1,則編輯控件中的全部文本被選中;如果低位字為-1,則任何當前選定內容被去掉選定狀態。

bNoScroll

指示是否顯示脫字符是滾動可見的。如果值為FALSE,則顯示,TRUE不顯示。

nStartChar

指出當前選中部分的開始位置。如果nStartChar=0且nEndChar=-1,則編輯控件的文本被全選;如果nStartChar=-1,則任何當前選定內容被去掉選定狀態。

nEndChar

指出結束位置。

說明:
調用此成員函數在一個編輯控件中選擇一定範圍的字符。

AfxMessageBox(); MFC中的函數 ,彈出信息框用於顯示。與WIN32 API的MessageBox()有些區別,具體可查尋相關資料。

通過編寫串口助手工具學習MFC過程——(六)添加Edit編輯框控件