編輯類控件

  以窗口類名"EDIT"創建的編輯類控件是一個可以用來接受用戶鍵盤字符輸入的矩形區域,可以在其內進行編輯操作。該控件是程序接受用戶字符輸入的一種主要手段,輸入的內容存放在其父窗口容量有限的(32KB)局部堆中。

  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("內容已改變!");
}

 

 

 

 
編輯框(Edit)控件實際上是一個簡易的文本編輯器,用戶可以在編輯框中輸入可添加或插入文本。還有複製、粘貼、剪切、刪除等編輯功能。
  應用程序用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指針。

 

發佈了4 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章