MFC的CEdit類提供了有關編輯類控件的功能函數。編輯控件既可以在對話框模板上創建也可以通過代碼來直接創建,這兩種方式均要通過CEdit的構造函數來構造一個CEdit對象。CEdit類從CWnd繼承了一些重要的函數,比如可以通過使用CWnd類成員函數SetWindowText()和GetWindowText()來設定和獲取一個編輯控件中的文本。同按鈕類控件類似,如果要處理由編輯控件發送給其父窗口的通知消息,需要在父窗口類中爲每一個待處理消息增添消息映射入口和消息響應函數。
在調用Create()函數創建編輯控件時,Windows系統將發出WM_NCCREATE、WM_NCCALCSIZE、WM_CREATE和WM_GETMINMAXINFO等消息給編輯控件。這些消息缺省地分別由OnNcCreate()、OnNcCalcSize()、OnCreate()和OnGetMinMaxInfo()等CWnd類成員函數進行處理,可以根據實際需要對其進行重載使用。作爲一種特殊的窗口,編輯控件除了需要指定普通窗口風格外,還可以通過選用不同的控件風格而獲取相應的功能效果,可選用的編輯風格列表如下:
編輯風格 | 說明 |
ES_AUTOHSCROLL | 當在行尾添加一個字符後自動向右滾動10個字符。 |
ES_AUTOVSCROLL | 當輸入回車後自動上滾一行。 |
ES_CENTER | 字符居中顯示。 |
ES_LEFT | 字符左對齊。 |
ES_LOWERCASE | 統一轉化爲小寫字母。 |
ES_MULTILINE | 允許多行顯示。 |
ES_NOHIDESEL | 當編輯失去焦點時隱藏對字符的選定,重新獲得焦點後以反色顯示選中內容。 |
ES_OEMCONVERT | 將ANSI字符轉化爲OEM字符。 |
ES_PASSWORD | 以星號顯示字符,多用於回顯密碼。 |
ES_RIGHT | 字符右對齊 |
ES_UPPERCASE | 統一轉化爲大寫字母。 |
ES_READONLY | 設置字符爲只讀。 |
ES_WANTRETURN | 接受回車鍵輸入。 |
下面給出創建、用編輯控件的示例代碼,該示例首先通過Create()函數創建一個控件對象,並通過SetWindowText()函數爲其設置字符。通過添加對控件通知消息的響應代碼可以檢測文本是否發生了改變。程序主要實現清單如下:
// 控件的創建部分: // 創建編輯控件 m_ctrEdit.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | ES_WANTRETURN | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, CRect(10, 50, 250, 150), this, ID_EDIT1); // 爲控件設置字符 m_ctrEdit.SetWindowText("Hello World!"); …… // 添件對控件通知消息的響應 //{{AFX_MSG(CSample02View) afx_msg void OnEnChange(); //}}AFX_MSG DECLARE_MESSAGE_MAP() …… BEGIN_MESSAGE_MAP(CSample02View, CView) //{{AFX_MSG_MAP(CSample02View) ON_EN_CHANGE(ID_EDIT1, OnEnChange) //}}AFX_MSG_MAP END_MESSAGE_MAP() …… void CSample02View::OnEnChange() { // 通知消息響應代碼 AfxMessageBox("內容已改變!"); } |
應用程序用CreateWindowEx創建編輯框控件時,可根據控件的用途在下表中選擇部份常數來設定其風格屬性(style)。
常數 | 說明 |
ES_MULTILINE | 多行文本,指定編輯控件可以多行文本編輯,用戶每按一次Enter,在當前光標次輸入一個回車換行符(0Dh,0Ah),文本增加一行。 |
ES_LEFT | 文本顯示居左。 |
ES_CENTER | 文本顯示居中。 |
ES_RIGHT | 文本顯示居右。 |
ES_LOWERCASE | 把用戶輸入的字母統統轉換成小寫字母。 |
ES_UPPERCASE | 把用戶輸入的字母統統轉換成大寫字母。 |
ES_OEMCONVERT | 使編輯框中的正文可以在ANSI字符集和OEM字符集之間相互轉換。這在編輯框中包含文件名時是很有用的。 |
ES_AUTOHSCROLL | 當用戶在行尾鍵入一個字符時,正文將自動向右滾動10個字符,當用戶按回車鍵時,正文總是滾向左邊。 |
ES_AUTOVSCROLL | 當用戶在最後一個可見行按回車鍵時,正文向上滾動一頁。 |
ES_NUMBER | 只接收數碼輸入,其它字符輸入一律無效。 |
ES_NOHIDESEL | 當編輯框失去輸入焦點,正文中的選擇保持不變,缺省時正文中的選擇將失效。 |
ES_READONLY | 將編輯框設置成只讀的。 |
ES_PASSWORD | 使所有鍵入的字符都用“*”來顯示。 |
ES_WANTRETURN | 使多行編輯器接收回車鍵輸入並換行。如果不指定該風格,按回車鍵會選擇缺省的命令按鈕,這往往會導致對話框的關閉。 |
當用戶在編輯控件上進行各種操作時,其父窗口將收到WM_COMMAND通知消息,同時wParam的低16位帶控件的ID。lParam帶控件句柄(hWnd),wParam的高16位帶有如下表的消息代碼。
消息代碼 | 用戶操作 |
EN_CHANGE | 編輯框的內容被用戶改變了。與EN_UPDATE不同,該消息是在編輯框顯示的正文被刷新後才發出的。 |
EN_ERRSPACE | 編輯框控件無法申請足夠的動態內存來滿足需要。 |
EN_HSCROLL | 用戶在水平滾動條上單擊鼠標。 |
EN_KILLFOCUS | 編輯框失去輸入焦點。 |
EN_MAXTEXT | 輸入的字符超過了規定的最大字符數。在沒有ES_AUTOHSCROLL或ES_AUTOVSCROLL的編輯框中,當正文超出了編輯框的邊框時也會發出該消息。 |
EN_SETFOCUS | 編輯框獲得輸入焦點。 |
EN_UPDATE | 在編輯框準備顯示改變了的正文時發送該消息。 |
EN_VSCROLL | 用戶在垂直滾動條上單擊鼠標。 |
應用程序可以通過調用SendMessage向控件發送如下消息來設定和查詢控件各種參數。
uMsg | wParam | lParam | 說明 |
EM_UNDO | 0 | 0 | 撤消前一次在控件的編輯操作,當重複發送本消息,控件將在撤消和恢復中來回切換。 |
EM_CANUNDO | 0 | 0 | 檢測控件撤消緩衝區是否爲空,通常控件把最後一次在控件的編輯操作保存在一個撤消緩衝區,如果緩衝區非空則返回TRUE表示上次操作可以撤消,否則返回FALSE,應用程序可以利用該返回值來禁止或允許菜單或工具條的“撤消”項。 |
EM_EMPTYUNDOBUFFER | 0 | 0 | 清除控件的撤消緩衝區,使其不能撤消前一次編輯操作。 |
EM_REPLACESEL | TRUE或FALSE | 替換文本指針 | 用指定文本替換編輯控件中的當前選定內容,如果wParam爲TRUE,則本次操作允許撤消,FALSE禁止撤消。 |
EM_SETSEL | 起點 | 終點 | 設置編輯控件中文本選定內容範圍,該範圍被高亮度顯示,用於爲複製、替換、粘貼、剪切、刪除等編輯功能指定範圍。使用本功能,鍵盤光標將被移至指定的終點後面,通常使用指定相同起點和終點來移動鍵盤光標而不選定範圍。當指定的起點等於0和終點等於-1時,全文全部被選中,此法常用在清空編輯控件。當指定的起點等於-2和終點等於-1時,全文均不選,鍵盤光標移至文本未端,此法常用在文本未端追加內容。注意:當控件沒有輸入焦點時,本操作將會失敗,一般在執行本操作前都應調用SetFocus先取得輸入焦點。 |
EM_GETSEL | 起點緩衝地址 或NULL |
終點緩衝地址 或NULL |
取得編輯控件中選定內容的範圍,返回值中低16位爲起點與高16位爲終點,如果wParam和lParam中指定了地址,則會在該地址填入相應值(dword)。本操作也常用來求取鍵盤光標位置。 |
EM_CHARFROMPOS | 0 | 位置 | 取得指定位置處的字符相對於文本頭部的偏移,使用本操作應先在lParam的高16位指定行號,低16位指定列號,行列是按編輯控件的客戶區左上角爲原點(0,0)計算的。如果指定的位置超出控件客戶區則返回-1 |
EM_FMTLINES | TRUE或FALSE | 0 | 決定是否在取回的文本宇串中包含軟回車字符 |
EM_GETFIRSTVISIBLELINE | 0 | 0 | 取得編輯控件中顯示的第一行 |
EM_GETHANDLE | 0 | 0 | 取得編輯控件文本緩衝區。 |
EM_GETLIMITTEXT | 0 | 0 | 獲取一個編輯控件中文本的最大長度 |
EM_GETLINE | 行號 | 緩衝地址 | 從編輯控件取回一行的內容,緩衝區第一個字(word)必須先填寫緩衝區的長度, |
EM_GETLINECOUNT | 0 | 0 | 取得一個編輯控件的總行數 |
EM_GETMARGINS | 0 | 0 | 獲取編輯控件的左、右邊距,返回值低16位爲左邊距,高16位爲右邊距 |
EM_GETMODIFY | 0 | 0 | 取編輯控件的修改標誌,返回 TRUE則控件文本已被修改,返回FALSE則未變。此值可以來決定是否提示用戶存盤。 |
EM_GETPASSWORDCHAR | 0 | 0 | 取得編輯控件用來顯示密碼的字符,返回NULL表示沒有字符。 |
EM_GETRECT | 0 | RECT結構地址 | 獲取一個編輯控件的格式化矩形 |
EM_GETTHUMB | 0 | 0 | 取得多行文本編輯控件的滾動框的當前位置。 |
EM_GETWORDBREAKPROC | 0 | 0 | 取得整字換行回調函數EditWordBreakProc指針。 |
EM_LIMITTEXT | 最大值 | 0 | 限制編輯中文本的最大長度 |
EM_LINEFROMCHAR | 字符偏移 | 0 | 取得指定的字符偏移處的行號。 |
EM_LINEINDEX | 行號 | 0 | 取得指定行第一個字符偏移 |
EM_LINELENGTH | 字符偏移 | 0 | 取得指定字符偏移處對應的一行長度字符數。 |
EM_LINESCROLL | 列字符 | 行數 | 滾動編輯控件 |
EM_POSFROMCHAR | POINT結構地址 | 字符偏移 | 取得指定字符偏移的顯示位置行列號,行列是按編輯控件的客戶區左上角爲原點(0,0)計算的。字符偏移是相對於文本頭部的偏移。 |
EM_SCROLL | SB_LINEDOWN SB_LINEUP SB_PAGEDOWN SB_PAGEUP |
0 | 編輯框顯示文本垂直滾動。滾動方向:SB_LINEDOWN向下滾動一行,SB_LINEUP向上滾動一行,SB_PAGEDOWN向下滾動一頁,SB_PAGEUP向上滾動一頁。 |
EM_SCROLLCARET | 0 | 0 | 把鍵盤光標移至可見範圍。 |
EM_SETHANDLE | 緩衝區指針 | 0 | 爲編輯控件指定新的文本緩衝區。此操作僅適用對話框創建帶DS_LOCALEDIT風格的控件。 |
EM_SETLIMITTEXT | 長度(字節) | 0 | 限制編輯控件中的文本緩衝區最大長度。 |
EM_SETMARGINS | EC_LEFTMARGIN EC_RIGHTMARGIN EC_USEFONTINFO |
邊距 | 設置編輯控件的左、右邊距,當wParam含EC_LEFTMARGIN時在lParam的低16位指定左邊距點數,當wParam含EC_RIGHTMARGIN時在lParam的高16位指定右邊距點數。當指定wParam爲EC_USEFONTINFO時,則用當前字體的字符"A"的寬度指定右邊距和字符"C"的寬度指定左邊距lParam被忽略。 |
EM_SETMODIFY | TRUE或FALSE | 0 | 用於設置或清除一個編輯控件的修改標誌 |
EM_SETPASSWORDCHAR | 字符 | 0 | 指定控件用來顯示密碼字符,缺省爲“*”。當wParam爲0時,本操作將清除控件的ES_PASSWORD風格,並按實際字符顯示。 |
EM_SETREADONLY | TRUE或FALSE | 0 | 決定是否將編輯控件設爲只讀,同時決定控件的ES_READONLY風格 |
EM_SETRECT | 0 | RECT結構地址 | 爲一個編輯控件設置格式化矩形 |
EM_SETRECTNP | 0 | RECT結構地址 | 與EM_SETRECT類似,只是控件此時不會重畫 |
EM_SETTABSTOPS | 製表站數 | 站距表地址 | 設置編輯控件中的製表站間距,當製表站數爲0時lParam被忽略,所有制表站距均爲32個對話框單位,當製表站數不爲0時lParam指向一個由32位(dword)組成的站距表,以對話框單位爲寬度計算單位。 |
EM_SETWORDBREAK | 0 | 0 | 本操作現已不支持,請使用EM_SETWORDBREAKPROC。 |
EM_SETWORDBREAKPROC | 0 | 函數入口地址 | 設置整字換行回調函數EditWordBreakProc指針。 |