編輯控件文字作業
系統會自動處理所有使用者起始的文字作業,並在作業完成時通知應用程式。
下列主題討論使用者起始的文字作業和應用程式的回應:
- 選取編輯控制件
- 設定和擷取文字
- 選取文字
- 取代文字
- 變更編輯控制項所使用的字型
- 剪下複製貼上和清除作業
- 修改文字
- 限制使用者輸入的文字
- 字元和線條作業
- 在編輯控制件中捲動文字
- 設定製表位和邊界
- 隱藏使用者輸入
- 使用整數
- 復原文字作業
- 處理文字包裝和換行符
- 擷取點和字元
- 字串的自動完成
- 編輯控制件中的複雜文稿
選取編輯控制件
用戶可以按下滑鼠或按 TAB 鍵來移至它,來選取編輯控制項。 Tabbing 方法是系統提供的預先定義鍵盤介面的一部分。 如需此介面的完整描述,請參閱 對話方塊。 當使用者選取編輯控件時,系統會為控件提供鍵盤焦點(請參閱關於鍵盤輸入中的「鍵盤焦點和啟用」,並使用反向視訊醒目提示其文字。
設定和擷取文字
應用程式可以使用 SetWindowText 函式、SetDlgItemText 函式或傳送控件WM_SETTEXT訊息,來設定編輯控件的文字。
若要從編輯控件擷取所有文字,請先使用 GetWindowTextLength 函式或WM_GETTEXTLENGTH訊息來判斷包含文字所需的緩衝區大小。 接下來,使用 GetWindowText 函式、GetDlgItemText 函式或WM_GETTEXT訊息來擷取文字。
選取文字
選取編輯控制件之後,使用者可以使用滑鼠或鍵盤來選取控件中的文字。 應用程式可以藉由傳送 控件 EM_GETSEL訊息,擷取編輯控件中目前選取範圍的開始和結束字元位置。 結束位置的傳回值是大於選取範圍中最後一個字元的傳回值(也就是最後一個選取字元之後的第一個字元的位置)。
應用程式也可以藉由傳送 含有選取範圍的開始和結束字元索引的EM_SETSEL 訊息,來選取編輯控件中的文字。 例如,應用程式可以使用 EM_SETSEL 搭配 EM_REPLACESEL,從編輯控件中刪除文字。
這三則訊息同時適用於單行和多行編輯控制件。
取代文字
應用程式可以使用取代文字的指標,將控件 傳送EM_REPLACESEL 訊息,以取代控件中的選取文字。 如果沒有目前的選取範圍, EM_REPLACESEL 插入點插入取代文字。 如果取代文字超過可用的記憶體,應用程式可能會收到 EN_ERRSPACE 通知碼。 此訊息同時適用於單行和多行編輯控制件。
應用程式可以使用 EM_REPLACESEL 來取代編輯控件文字的一部分或 SetDlgItemText 函式來取代所有文字。
變更編輯控制項所使用的字型
應用程式可以藉由傳送 WM_SETFONT 訊息來變更編輯控件所使用的字型。 大部分的應用程式會在 處理WM_INITDIALOG 訊息時執行此動作。 變更字型並不會變更編輯控件的大小;傳送 WM_SETFONT 訊息的應用程式可能必須擷取文字的字型計量,並重新計算編輯控件的大小。 如需字型和字型計量的詳細資訊,請參閱 字型和文字。
剪下複製貼上和清除作業
編輯控件與剪貼簿之間移動文字有四則訊息。 WM_COPY訊息會將目前的選取範圍(如果有的話)從編輯控件複製到剪貼簿,而不需從編輯控件中刪除。 WM_CUT訊息會刪除編輯控件中的目前選取範圍(如果有的話),並將已刪除的文字複製到剪貼簿。 WM_CLEAR訊息會從編輯控件中刪除目前的選取範圍(如果有的話),但不會將它複製到剪貼簿(除非使用者按下 SHIFT 鍵)。 WM_PASTE訊息會將剪貼簿中的文字複製到插入點的編輯控件。 這四則訊息同時適用於單行和多行編輯控制件。
Microsoft Windows NT 4.0 及更新版本:編輯控件包含內建操作功能表,讓使用者可以輕鬆地在編輯控件和剪貼簿之間移動文字。 當使用者以滑鼠右鍵按下控件時,就會顯示操作功能表。 操作功能表中的命令包括 [復原]、[剪下]、[複製]、[貼上]、[刪除] 和 [全選]。
修改文字
用戶可以在編輯控制項中選取、刪除或行動文字。 系統會針對每個編輯控件維護內部旗標,指出控件的內容是否已修改。 系統會在建立 控件時清除此旗標,並在每當修改控件中的文字時設定旗標。 應用程式可以藉由傳送控件 EM_GETMODIFY訊息來擷取 修改旗標。 然後,應用程式可以藉由傳送 控件EM_SETMODIFY 訊息來設定或清除修改旗標。 這些訊息同時套用至單行和多行編輯控制件。
限制使用者輸入的文字
用戶可以在編輯控制項中輸入之文字數量的預設限制為 32 KB。 應用程式可以藉由傳送控件 EM_SETLIMITTEXT 訊息來變更預設限制。 此訊息會將用戶可輸入編輯控件的位元組數目設定硬性限制,但不會影響當訊息傳送或 SetDlgItemText 函式或WM_SETTEXT訊息複製到控件時,控件中已經不存在的文字。 例如,假設應用程式使用 SetDlgItemText 函式在編輯控件中放置 500 個字節,而且使用者也會輸入 500 個字節(總計 1,000 個字節)。 如果應用程式接著傳送 EM_SETLIMITTEXT 訊息,將使用者輸入的文字限制為300個字節,則編輯控件中已有的1,000個字節會保留在該處,而且用戶無法再新增任何文字。 另一方面,如果應用程式傳送 EM_SETLIMITTEXT 訊息,將使用者輸入的文字限制為 1,300 個字節,則會保留 1,000 個字節,但使用者可以新增 300 個字節。
當用戶達到編輯控制件的字元限制時,系統會將包含EN_MAXTEXT通知碼的WM_COMMAND訊息傳送給應用程式。 此通知碼並不表示記憶體已用盡,但已達到使用者輸入文字的限制;用戶無法再輸入任何文字。 若要變更此限制,應用程式必須傳送具有較高限制的新 EM_SETLIMITTEXT 訊息。
例如,使用 EM_SETLIMITTEXT 和 EN_MAXTEXT,假設應用程式必須在編輯控件中限制用戶不超過四個字元。 應用程式會使用 EM_SETLIMITTEXT 來指定四個字元的限制。 如果使用者嘗試輸入第五個字元,系統會將EN_MAXTEXT通知碼傳送給應用程式。
字元和線條作業
有數則訊息會傳回編輯控件中字元和行的相關信息。 大部分的訊息都會傳回索引,通常是以零起始的數位,以參考字元或行。 例如,在包含 n 個字元的單行編輯控制項中,行索引為零,且字元會從零編制索引到 n-1。 在包含 m 行和 n 個字元的多行編輯控件中,這些行的索引是從零到 m-1,而且字元會從零編製索引到 n-1。 請注意,字元索引會忽略換行符。
應用程式可以將WM_GETTEXTLENGTH訊息傳送至編輯控制項,以判斷編輯控制件中的字元數。 此訊息會傳回單行或多行編輯控件中文字的長度,以字元為單位(不包括終止的 Null 字元)。 EM_LINELENGTH訊息會傳回行中字元索引所指定行的長度,以字元為單位。 傳回的長度不包含任何選取的字元。 應用程式可以在單行或多行編輯控件中使用這些訊息。
EM_GETFIRSTVISIBLELINE訊息會傳回多行編輯控件中最上層可見行的以零起始的索引,或單行編輯控件中第一個可見字元的以零起始的索引。 應用程式可以將EM_GETLINE訊息傳送至編輯控制項,將一行從編輯控件複製到緩衝區。 此行是由其行索引所指定,而接收緩衝區的第一個字則包含要複製到緩衝區的最大位元元組數目。 傳回值是複製的位元組數目。 此訊息也可以在單行或多行編輯控制項中使用。
有唯一的訊息可用來傳回多行編輯控件中線條的相關信息。 EM_GETLINECOUNT訊息會傳回編輯控制件中的行數。 EM_LINEFROMCHAR訊息會傳回包含指定字元索引之行的索引。 EM_LINEINDEX訊息會傳回指定行中第一個字元的索引。
在編輯控制件中捲動文字
若要在編輯控件中實作卷動,您可以使用編輯控件類型和樣式中討論的自動捲動樣式,也可以明確地將滾動條新增至編輯控件。 若要新增水準滾動條,請使用樣式WS_HSCROLL;若要新增垂直滾動條,請使用樣式 WS_VSCROLL。 具有滾動條的編輯控件會處理自己的滾動條訊息。 如需新增滾動條以編輯控件的詳細資訊,請參閱 滾動條。
系統提供三則訊息,應用程式可以使用滾動條傳送至編輯控件。 EM_LINESCROLL訊息可以垂直和水平捲動多行編輯控件。 lParam 參數會指定要從目前行開始垂直捲動的行數,而 wParam 參數會指定要水平捲動的字元數,從目前字元開始。 如果編輯控制件具有ES_CENTER或ES_RIGHT樣式,則不會確認水平捲動訊息。 EM_LINESCROLL訊息僅適用於多行編輯控制件。
EM_SCROLL訊息會垂直捲動多行編輯控制件。 wParam 參數會指定卷動動作。 EM_SCROLL訊息僅適用於多行編輯控制件。 EM_SCROLL與WM_VSCROLL訊息的效果相同。
EM_SCROLLCARET訊息會將插入號卷動到編輯控件的檢視中。
設定製表位和邊界
應用程式可以使用EM_SETTABSTOPS訊息,在多行編輯控件中設定製表位。 (制表位的預設值為八個字元。當應用程式將文字新增至編輯控件時,文字中的製表元會自動產生到下一個製表位的空間。 EM_SETTABSTOPS訊息不會自動導致系統重新繪製文字。 若要這樣做,應用程式可以呼叫 InvalidateRect 函式。 EM_SETTABSTOPS訊息僅適用於多行編輯控制件。
應用程式可以使用EM_SETMARGINS訊息來設定編輯控制元件的左右邊界寬度。 傳送此訊息之後,系統會重新繪製編輯控制項,以反映新的邊界設定。 應用程式可以藉由傳送 EM_GETMARGINS 訊息來擷取左右邊界的寬度。 根據預設,編輯控制邊界會設定為剛好足以容納編輯控件中目前字型的最大字元水準懸移(負 ABC 寬度)。
隱藏使用者輸入
應用程式可以使用編輯控制件中的密碼字元來隱藏使用者輸入。 設定密碼字元時,會顯示它來取代使用者輸入的每個字元。 拿掉密碼字元時,控件會顯示使用者輸入的字元。 如果應用程式使用樣式 ES_PASSWORD建立單行編輯控件,則默認密碼字元為星號 ≦。 應用程式可以使用EM_SETPASSWORDCHAR訊息來移除或定義不同的密碼字元和EM_GETPASSWORDCHAR訊息,以擷取目前的密碼字元。 這些訊息僅適用於單行編輯控制件。
使用整數
編輯控制件有兩個整數轉換函式,其設計目的是只包含數位。 SetDlgItemInt 函式會建立指定整數的字串表示法(帶正負號或不帶正負號),並將字串傳送至編輯控件。 SetDlgItemInt 不會傳回任何值。 GetDlgItemInt 函式會從編輯控件中的字串表示建立整數(帶正負號或不帶正負號)。 GetDlgItemInt 會傳回整數(或錯誤值)。
復原文字作業
每個編輯控制項都會維護復原旗標,指出應用程式是否可以反轉或復原編輯控件上最新的作業(例如復原文字刪除)。 編輯控件會設定復原旗標,指出作業可以復原並重設,以表示無法復原作業。 應用程式可以藉由傳送控件 EM_CANUNDO 訊息來判斷復原旗標的設定。
應用程式可以藉由傳送控件 EM_UNDO 訊息,來復原最新的作業。 如果不會先進行其他編輯控件作業,就可以復原作業。 例如,使用者可以刪除文字、取代文字(復原刪除),然後再次刪除文字(復原取代)。 EM_UNDO訊息同時套用至單行和多行編輯控件,而且一律適用於單行編輯控件。
應用程式可以藉由傳送控件EM_EMPTYUNDOBUFFER訊息來重設編輯控件的復原旗標。 每當編輯控制件收到 EM_SETHANDLE 或 WM_SETTEXT 訊息時,系統就會自動重設復原旗標。 SetDlgItemText 函式會傳送WM_SETTEXT訊息。
處理文字包裝和換行符
應用程式可以使用 Wordwrap 函式搭配多行編輯控件,找出應該包裝至下一行的文字或文字片段。 使用系統提供的預設 Wordwrap 函式,字組之間的空格一律會結束行。 應用程式可以藉由提供EditWordBreakProc Wordwrap函式,並將編輯控件傳送EM_SETWORDBREAKPROC訊息,以指定自己的Wordwrap函式。 應用程式可以藉由傳送控件 EM_GETWORDBREAKPROC訊息來擷取目前 Wordwrap 函式 的位址。
應用程式可能會指示多行編輯控件在包裝文字行結尾自動新增或移除軟換行符(兩個歸位字元和換行字元)。 應用程式可以藉由傳送編輯控制件 EM_FMTLINES 訊息來開啟或關閉此功能。 此訊息僅適用於多行編輯控件,且不會影響以硬換行符結尾的行(一個歸位字元和使用者輸入的換行字元)。 此外,在多行編輯控件中,應用程式也可以指定 ES_WANTRETURN 樣式,要求使用者在編輯控件中按下 ENTER 鍵時,要求系統插入歸位字元。
擷取點和字元
若要判斷最接近編輯控制項工作區中指定點的字元,請將EM_CHARFROMPOS訊息傳送至控件。 訊息會傳回最接近點之字元的字元索引和行索引。 同樣地,您可以傳送 EM_POSFROMCHAR 訊息來擷取指定字元的工作區座標。 訊息會傳回指定字元左上角的 x 和 y 座標。
字串的自動完成
自動完成會展開已部分在編輯控件中輸入到完整字串的字串。 例如,當使用者開始在內嵌於 Windows Internet Explorer 工具列的 [位址編輯] 控制項中輸入 URL 時,自動完成會將字串展開成一或多個與現有部分字元串一致的完整 URL。 部分 URL 字串,例如 「mic」 可能會展開為 “https://www.microsoft.com"或 “https://www.microsoft.com/windows"。 自動完成通常與編輯控件或具有內嵌編輯控制件的控制件搭配使用。
如需詳細資訊,請參閱 IAutoComplete 和 IAutoComplete2 介面檔。
編輯控制件中的複雜文稿
複雜腳本是一種語言,其列印格式不是以簡單的方式配置。 例如,複雜的腳本可能會允許雙向轉譯、圖像的內容成形,或結合字元。 標準編輯控件已擴充,以支援多語系文字和複雜腳本。 這包括不僅輸入和顯示,而且包含正確的游標在字元叢集上移動(例如在泰文和 Devanagari 腳本中)。
撰寫良好的應用程式會自動收到這項支援,而不需修改。 同樣地,您應該考慮新增對從右至左閱讀順序和靠右對齊的支援。 在此情況下,請切換編輯控件視窗的延伸樣式旗標來控制這些屬性,如下列範例所示。
// ID_EDITCONTROL is the control ID in the resource file.
HANDLE hWndEdit = GetDlgItem(hDlg, ID_EDITCONTROL);
LONG lAlign = GetWindowLong(hWndEdit, GWL_EXSTYLE) ;
// To toggle alignment
lAlign ^= WS_EX_RIGHT ;
// To toggle reading order
lAlign ^= WS_EX_RTLREADING ;
設定 lAlign 值之後,設定編輯控件視窗的延伸樣式,以啟用新的顯示,如下所示。
// This assumes your edit control is in a dialog box. If not,
// get the edit control handle from another source.
SetWindowLong(hWndEdit, GWL_EXSTYLE, lAlign);
InvalidateRect(hWndEdit, NULL, FALSE);
Uniscribe 是另一組函式,可提供處理複雜腳本的精細控制。 如需詳細資訊,請參閱 Uniscribe。