CEdit類提供了Windows 編輯控件中的功能。編輯控件是一個子窗口矩形,用戶可以向其中輸入文本。可以通過對話模板或直接從代碼中創建一個編輯控件。在兩種情形下,首先調用CEdit構造程序構造CEdit對象,再調用Create成員函數創建Windows 編輯控件並將其與CEdit對象連接。構造在CEdit的派生類中可以單步實現。爲派生類編寫構造程序並從構造程序中調用Create。CEdit從CWnd 繼承了重要的功能,要在CEdit對象中設置或獲取文本,使用CWnd 成員函數SetWindowText和GetWindowText,可以設置和得到編輯控件的全部內容,即使它是一個多行控件。如果編輯控件是多行的,使用CEdit成員函數GetLine,GetSel,GetSel和ReplaceSel來獲取和寫入控件的部分文本。
如果要處理編輯控件發往其父類(通常是一個CDialog派生類)的通知消息,則向父類中爲每一消息添加一個消息映射入口和消息處理成員函數。各消息映射入口可採用如下形式:
ON_Notification(id,memberFxn)
其中id指定了發送通知的編輯控件的子窗口ID,memberFxn爲你寫好的處理通知的父成員函數的名字。父函數形式如下:
afx_msg void memberFxn();
下面是一組可能的消息映射入口,以及在何種情況下向父類發送的描述:
ON_EN_CHANGE 用戶採取的行動可能會改變編輯控件的文本。與EN_UPDATE通知消息不同,該通知是在
Windows 更新顯示之後發送的。
ON_EN_ERRSPACE 編輯控件不能爲特定請求分配足夠的空間。
ON_EN_HSCROLL 用戶單擊了編輯控件中的水平滾動條,父窗口在屏幕更新之前被通知。
ON_EN_KILLFOCUS 編輯控件失去輸入焦點。
ON_EN_MAXTEXT 當前輸入超過了爲編輯控件指定的數目,並作截尾處理。當編輯控件不具有
ON_EN_HSCROLL風格且要輸入的字符會超過編輯控件的寬度時,發送消息。當編輯控件
不具有ON_EN_VSCROLL風格且要輸入的字符會超過編輯控件的高度時,也會發送消息。
ON_EN_SETFOCUS 編輯控件獲得焦點。
ON_EN_UPDATE 編輯控件將要顯示變動的文本。在控件對文本格式化之後但在顯示文本之前發送消息,
以便在必要時改變窗口尺寸。
ON_EN_VSCROLL 用戶單擊了編輯控件中的垂直滾動條,父窗口在屏幕更新之前被通知。
如果在對話框內創建CEdit對象,CEdit對象在用戶關閉對話框時自動被刪除。如果使用對話框編輯器從對話資源中創建CEdit對象,CEdit對象在用戶關閉對話框時自動被刪除。如果在窗口內創建CEdit對象,也需要刪除它。如果在棧上創建CEdit對象,它被自動刪除。如果使用new函數在堆上創建CEdit對象,在用戶中止編輯控件時,必須對其調用delete來刪除它。如果在CEdit對象中分配存儲空間,覆蓋CEdit析構程序來處理分配情況。關於CEdit的更多信息,請參閱聯機文檔“Visual C++程序員指南”中的“控件主題”。
#include<afxwin.h>
1 CEdit類的成員
1.1 構造函數
CEdit 構造一個CEdit控件對象
Create 創建一個Windows編輯控件,並將其與CEdit對象連接CEdit
屬性
CanUndo 決定一個編輯控件操作是否能夠被撤銷
GetLineCount 獲得多行編輯控件中的行數GetModify決定編輯控件的內容是否被修改SetModify爲編輯控件設置或清除修改標記
GetRect 爲編輯控件獲取格式化的矩形
GetHandle 獲得爲當前多行編輯控件分配的內存的句柄
SetHandle 設置爲多行編輯控件使用的本地內存的句柄
SetMargins 爲CEdit設置左邊和右邊的空白邊界
GetMargins 獲得爲CEdit設置左邊和右邊的空白邊界
SetLimitText 設置CEdit能夠容納的文本的最大量
GetLimitText 獲得CEdit能夠容納的文本的最大量
PosFromChar 獲得指定字符索引的左上角的座標
CharFromPos 獲得最靠近指定位置的字符的行和字符索引
GetLine 從編輯控件中獲得一行文本
GetPasswordChar 獲得當用戶輸入文本時在編輯控件中顯示的口令
GetFirstVisibleLeLine 決定在編輯控件中最頂部的可視的行
1.2 CEdit 操作
EmptyUndoBuffer 重新設置(清除)編輯控件的撤銷標記
FmtLines 設置在多行編輯控件中的軟回車打開或關閉
LimitText 用戶在輸入文本時的文本長度限制
LineFromChar 獲得包含指定字符索引的行的數目
LineIndex 獲得在多行編輯控件中的某行的字符索引
LineLength 獲得編輯控件中的行的長度
LineScroll 在多行編輯控件中滾動文本
ReplaceSel 用指定文本覆蓋編輯控件中當前被選中的文本
SetPasswordChar 設置或清除當用戶輸入文本時在編輯控件中顯示的口令
SetRect 設置多行編輯控件的帶格式的矩形,並更新該控件
SetRectNP 設置多行編輯控件的帶格式的矩形,而不必重新繪製
SetSel 在編輯控件中選定文本
SetTabStops 設置多行編輯控件的製表鍵停頓位
SetReadOnly 爲編輯控件設置只讀狀態
1.3 CEdit剪貼板操作
Undo 撤銷上一次的編輯控件操作
Clear 刪除(清除)編輯控件中當前選中的文本
Copy 將編輯控件中的當前選中文本以CF_TEXT格式拷貝到剪貼板中
Cut 刪除編輯控件中當前選中的文本,並將刪除的文本以CF_TEXT格式拷貝到剪貼板中
Paste 在當前光標位置插入剪貼板內的文本。只有在剪貼板數據爲CF_TEXT格式時才進行插入
2 成員函數
2.1 CEdit::CanUndo
BOOL CanUndo() const;
返回值如果上一次編輯操作可以用Undo成員函數撤銷,則返回非零值,否則爲0。說明調用該函數來決定上一次編輯操作是否可以撤銷。
要了解更多信息,請參閱Win 32文檔中的EM_CANUNDO 。請參閱 CEdit::Undo,CEdit::EmptyUndoBuffer
2.2 CEdit::CEdit
CEdit();說明構造一個CEdit對象。使用Create來創建Windows 編輯控件。
請參閱 CEdit::Create
2.3 CEdit::CharFromPos
int CharFromPos(CPoint pt) const;
返回值返回WORD低位的字符索引,以及WORD高位的行索引。參數pt在客戶區域中的CEdit對象的點的座標。說明調用該函數來獲取基於0索引的行和最接近CEdit控件中指定點的字符索引。
注意 該成員函數在Windows 95和Windows NT 4.0中有效。
要了解更多的信息,請參閱Win 32文檔中的EM_CHARFROMMOPS。請參閱 CEdit::PosFromChar
2.4 CEdit::Clear
void Clear();
說明調用該函數來刪除(清除)編輯控件中當前選中的文本。
由Clear進行的操作可以通過調用Undo成員函數撤銷。要刪除當前選定文本並將其拷貝到剪貼板上,調用Cut成員函數。要了解更多的信息,請參閱Win 32文檔中的WM_CLEAR。請參閱 CEdit::Undo,CEdit::Copy,CEdit::Cut,CEdit::Paste
2.5 CEdit::Copy
oid Copy();
說明調用該函數將編輯控件中的當前選中文本以CF_TEXT格式拷貝到剪貼板中。要了解更多的信息,請參閱Win 32文檔中的WM_COPY。請參閱 CEdit::Clear,CEdit::Cut,CEdit::Paste
2.6 CEdit::Create
BOOL Create(DWORD dwStyle,const RECT&rect,CWnd*pParentWnd,UNIT nID);
返回值初始化成功,則返回非零值,否則爲0。參數dwStyle指定編輯控件的風格。可以組合使用控件的編輯風格。
rect 指定控件的尺寸和位置。可以是RECT結構或CRect對象 。
pParentWnd 指定編輯控件的父窗口(通常使用CDialog )。其值不能爲NULL。
nID 指定編輯控件的ID。
說明
構造CEdit對象分兩步。首先調用CEdit構造程序,再調用Create,這樣就創建了一個Windows 編輯控件,並將其與CEdit對象連接。當執行Create時,Windows 發送WM_NCCREATE ,WM_NCCALCSIZE ,WM_CREATE 和WM_GETMINMAXINFO 消息到編輯控件。
缺省地,這些消息由CWnd 基類中的OnNcCalcSize,OnCreate,OnNcCreate和OnGetMinMaxInfo成員函數處理。要擴展缺省的消息處理,先從CEdit派生一個類,爲新類添加消息映射並覆蓋上述消息處理成員函數。例如,覆蓋OnCreate爲新類執行所需要的初始化操作。
可以爲編輯控件應用如下的風格:
WS_CHILD 總是採用
WS_VISIBLE 經常採用
WS_DISABLED 很少採用
WS_GROUP 組合控件
WS_TABSTOP 按製表鍵次序包含編輯控件
請參閱 CEdit::CEdit
2.7 CEdit::Cut
void Cut();
說明調用該函數來刪除(剪切)在編輯控件中的當前選定文本,並將其用CF_TEXT格式拷貝到剪貼板中。由Cut執行的刪除可以由Undo成員函數來撤銷。刪除當前選定部分而不將已刪除文本置於剪貼板,調用Clear成員函數。要了解更多的信息,請參閱Win 32文檔中的WM_CUT。請參閱 CEdit::Undo ,CEdit::Clear,CEdit::Copy,CEdit::Paste
2.8 CEdit::EmptyUndoBuffer
Void EmptyUndoBuffer();
說明調用此成員函數重新設置(清除)一個編輯控件中的撤消標記,使編輯控件不可撤消最近一次操作。撤消標記在編輯控件的某個操作可以撤消時建立。當調用SetWindows 或SetHandle Cwnd成員函數時,撤消標記自動被清除。要了解更多的信息,請參閱Win32文檔中的EM_EMPTYUNDOBUFFER。請參閱 CEdit::CanUndo, CEdit::SetHandle, CEdit::Undo,CWnd::SetWindowText
2.9 CEdit::FmtLines
BOOL FmtLines(BOOL bAddEOL);
返回值如果發生格式化,則返回非零值,否則爲0。
參數
bAddEOl
指定是否要插入軟斷行符,值爲True時插入軟斷行符,爲False時去掉軟斷行符。說明調用此成員函數用於設置在一個多行編輯控件中是否包含軟斷行符。一個軟斷行符包含在斷行行末插入兩個回車和一個換行,這是因爲一行可容納的文字有限。而一個硬斷行符包含一個回車和一個斷行。以硬斷行符結束的行不受FmtLines的影響。
僅在CEdit對象是一個多行編輯控件時Windows才響應此命令。FmtLines僅影響GetHandle返回的緩衝區和WM_GETTEXT返回的文本,而對編輯控件中的顯示無影響。
要了解更多信息,請參閱Win32文檔中的EM_FMTLINES。
請參閱 CEdit::GetHandle, CWnd::GetWindowText
2.10 CEdit::GetFirstVisibleLine
int GetFirstVisibleLine()const;
返回值可視的最頂端行的行號(行號由0開始),對單行編輯控件來說,返回值爲0。說明調用此成員函數決定編輯控件中可視的最頂端行的行號。
要了解更多信息,請參閱Win32文檔中的EM_GETFIRSTVISIBLELINE。
請參閱 CEdit::GetLine
2.11 CEdit::GetHandle
HLOCAL GetHandle() const;
返回值一個用於標識編輯控件內容的局部內存句柄。如果發生錯誤,例如發送信息到一個單行編輯控件,則返回值爲0。說明調用此成員函數來獲取一個多行編輯控件中當前分配的內存句柄。此句柄是一個局部內存句柄,可被任何局部Windows存儲函數作爲一個參數來獲得。
GetHandle僅僅被多行編輯控件處理。
在一個多行編輯控件的對話框中調用此成員函數時,對話框必須由DS_LOCAL-EDIT的樣式標誌集生成。如果不是,雖然也可以得到一個非零的返回值,但此返回值不可被使用。
注意
GetHandle不可在Windows 95下運行。如果在Windows 95下調用,會返回NULL。GetHandle可在Windows NT 3.51版及以上使用。要了解有關的更多信息,請參閱Win32文檔中的EM_GETHANDLE。
請參閱 CEdit::SetHandle
2.12 CEdit::GetLimitText
UINT GetLimitText() const;
返回值對當前CEdit對象的文本大小限制,以字節計算。說明調用此成員函數來獲取該CEdit對象的文本大小限制,文本限制是此編輯控件可以接收的文本的最大長度(以字節計算)。
注意
此成員函數僅在Windows 95和Windows NT 4.0以上版本中可用。要了解更多信息,請參閱Win32文檔中的EM_GETLIMITTEXT。
請參閱 CEdit::SetLimitText, CEdit::LimitText
2.13 CEdit::GetLine
int GetLine(int nIndex, LPCTSTR lpszBuffer) const;
int GetLine(int nIndex, LPCTSTR lpszBuffer, int nMaxLength) const;
返回值實際拷貝的字節數。如果由nIndex指定的行號大於此編輯控件的行數,則返回值爲0。
參數
nIndex 指定從多行編輯控件中檢索的行的行號,行號由0指定。對單行編輯控件,此參數被忽略。
lpszBuffer指向獲取此行備份的緩衝區。緩衝區的第一個字必須指定能被拷貝到緩衝區的最大字節數。 nMaxLength指定能被拷貝到緩衝區的最大字節數,GetLine在調用Windows之前將此值放置到lpszBuffer的第一個字中。說明調用此成員函數從編輯控件中獲取文本的一行並將其放置到lpszBuffer緩衝區。被拷貝的行不包括空終止符。要了解更多信息,請參閱Win32文檔中的EM_GETLINE。
3 文本控件的常用通知消息
消息名稱 消息說明
EN_CHANGE 編輯控件的內容一旦發生改變,就發送這條消息。
EN_ERRSPACE 任何時候只要由於內存不足以完成一項編輯操作,就發送這條消息。
EN_HSCROLL 只要用戶單擊了從屬於一個編輯控件的水平滾動條的任何地方,就會發送這條消息。注意這條消息是在控件更新顯示之前發送出去的。
EN_KILLFOCUS 一旦控件丟失了輸入焦點,則發出這條消息。
EN_MAXTEXT 只要用戶輸人的文字試圖超出由EM_LIMITTEXT消息規定購界限,或試圖超出由VB Maxlength屬性規定的界限,就會發送這條消息。此外,倘若不允許自動進行水平滾動,同時插入點要超出控件的寬度;或者不允許自動自動滾動,同時插入點要超出接件的高度,那麼也會觸發這條消息。
EN_SETFOCUS 一旦控件接收到了輸入焦點,就發出這條消息。
EN_UPDATE / EN_VSCROLL 只要用戶單擊了從屬於一個編輯控件的垂直滾動條的任何地方,就會發送這條消息。注意這條消息是在控件更新顯示之前發送出去的。
4 文本控件的常用消息
消息名稱 消息說明
EM_CANUNDO 決定前一次編輯操作是否能夠撤消
EM_EMPTYUNDOBUFFER 清除控件的撤消緩衝區,使其不可能撤消前一次編輯操作
EM_UNDO 撤消前一次編輯操作
EM_FMTLINES 決定是否在取回的文本宇串中包含軟回車字符
EM_GETLIMITTEXT 獲取一個編輯控件中文本的最大長度
EM_GETMARGINS 獲取編輯控件的左、右邊距(不得用於NT3.51)
EM_GETRECT 獲取一個編輯控件的格式化矩形
EM_LIMITTEXT 限制編輯耀件甲購文本長度
EM_SETLIMITTEXT 限制編輯控件中的文本長度(不得用於NT3.51)
EM_SETMARGINS 設置編輯控件的左、右邊距(不得用於NT3.51)
EM_SETRECT 爲一個編輯控件設置格式化矩形
EM_SETRECTNP 與EM_SETRECT類似,只是控件此時不會重畫
EM_SETTABSTOPS 設置編輯控件中的製表站間距
EM_CHARFROMPOS 判斷編輯控件指定位置處的字符(不適用於NT3.51)
EM_GETFIRSTVISIBLEIN 判斷編輯控件中顯示的第一行
EM_GETLINE 從編輯控件取回…行的內容
EM_GETLINECOUNT 判斷一個編輯控件的總行數
EM_GETMODIFY 判斷編輯控件的內容是否已發生變化
EM_GETPASSWORDCHAR 取得編輯控件的密碼字符
EM_GETSEL 判斷編輯控件中一段選定內容的起點與終點
EM_LINEFROMCHAR 判斷是哪一行顯示了某個特殊字符
EM_LINEINDEX 判斷指定行第一個字符的編號
EM_LINELENGTH 判斷一行長度
EM_LINESCROLL 滾動編輯控件
EM_POSFROMCHAR 判斷指定字符在編輯控件的位置(用於NT3.51)
EM_REPLACESEL 用指定文本替換編輯控件中的當前選定內容
EM_SETMODIFY 用於設置或清除一個編輯控件的修改標誌
EM_SETPASSWORDCHAR 爲指定的控件設置密碼字符
EM_READONLY 決定是否將編輯控件設爲只讀
EM_SETSEL 設置編輯控件中一段選定內容的起點一終點