轉(zhuǎn)帖|行業(yè)資訊|編輯:鮑佳佳|2021-02-25 13:10:12.787|閱讀 2188 次
概述:本節(jié)要講的編輯框(Edit Control)同樣是一種很常用的控件,我們可以在編輯框中輸入并編輯文本。在前面加法計(jì)算器的例子中已經(jīng)演示了編輯框的基本應(yīng)用。下面具體講解編輯框的使用
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Xtreme Toolkit Pro是MFC開發(fā)中最全面界面控件套包,它提供了Windows開發(fā)所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
點(diǎn)擊下載最新版Xtreme Toolkit Pro
上一節(jié)講了靜態(tài)文本框,本節(jié)要講的編輯框(Edit Control)同樣是一種很常用的控件,我們可以在編輯框中輸入并編輯文本。在前面加法計(jì)算器的例子中已經(jīng)演示了編輯框的基本應(yīng)用。下面具體講解編輯框的使用。
編輯框的通知消息
編輯框發(fā)生某些事件時(shí)會(huì)向父窗口發(fā)送通知消息。在對(duì)話框模板中的編輯框上點(diǎn)右鍵,選擇“Add Event Handler”,為編輯框添加消息處理函數(shù)時(shí),可以在“Message type”列表中看到這些消息。下面簡(jiǎn)單介紹編輯框的部分通知消息。
EN_CHANGE:編輯框的內(nèi)容被用戶改變了,與EN_UPDATE 不同,該消息是在編輯框顯示的正文被刷新后才發(fā)出的
EN_ERRSPACE: 編輯框控件無法申請(qǐng)足夠的動(dòng)態(tài)內(nèi)存來滿足需要
EN_HSCROLL: 用戶在水平滾動(dòng)條上單擊鼠標(biāo)
EN_KILLFOCUS: 編輯框失去輸入焦點(diǎn)
EN_MAXTEXT:輸入的字符超過了規(guī)定的最大字符數(shù)。在沒有ES_AUTOHSCROLL 或
ES_AUTOVSCROLL: 的編輯框中,當(dāng)正文超出了編輯框的邊框時(shí)也會(huì)發(fā)出該消息
EN_SETFOCUS: 編輯框獲得輸入焦點(diǎn)
EN_UPDATE: 在編輯框準(zhǔn)備顯示改變了的正文時(shí)發(fā)送該消息
EN_VSCROLL: 用戶在垂直滾動(dòng)條上單擊鼠標(biāo)
編輯框的創(chuàng)建
MFC為編輯框提供了CEdit類。編輯框的所有操作都封裝到了CEdit類中。
與靜態(tài)文本框的創(chuàng)建類似,除了可以在對(duì)話框模板上拖進(jìn)一個(gè)編輯框,然后關(guān)聯(lián)一個(gè)變量或通過API函數(shù)使用,也可以在程序中動(dòng)態(tài)創(chuàng)建編輯框,即調(diào)用CEdit類的成員函數(shù)Create。Create成員函數(shù)的原型如下:
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
參數(shù)說明:
dwStyle:指定編輯框的風(fēng)格。可以是MSDN>中“edit styles”包含風(fēng)格的任意組合。下面是“edit styles”的所有風(fēng)格說明。
ES_AUTOHSCROLL:當(dāng)用戶在行尾鍵入一個(gè)字符時(shí),正文將自動(dòng)向右滾動(dòng)10 個(gè)字符,當(dāng)用戶按回車鍵時(shí),正文總是滾向左邊
ES_AUTOVSCROLL: 當(dāng)用戶在最后一個(gè)可見行按回車鍵時(shí),正文向上滾動(dòng)一頁
ES_CENTER: 在多行編輯框中使正文居中
ES_LEFT :左對(duì)齊正文
ES_LOWERCASE: 把用戶輸入的字母統(tǒng)統(tǒng)轉(zhuǎn)換成小寫字母
ES_MULTILINE:指定一個(gè)多行編輯器。若多行編輯器不指定ES_AUTOHSCROLL 風(fēng)格,則會(huì)自動(dòng)換行,若不指定ES_AUTOVSCROLL,則多行編輯器會(huì)在窗口中正文裝滿時(shí)
發(fā)出警告聲響
ES_NOHIDESEL:默認(rèn)時(shí),當(dāng)編輯框失去輸入焦點(diǎn)后會(huì)隱藏所選的正文,當(dāng)獲得輸入焦點(diǎn)時(shí)又顯示出來。設(shè)置該風(fēng)格可禁止這種默認(rèn)行為
ES_NUMBER :編輯框中只允許輸入數(shù)字
ES_OEMCONVERT:使編輯框中的正文可以在ANSI 字符集和OEM 字符集之間相互轉(zhuǎn)換。這在編輯框中包含文件名時(shí)是很有用的
ES_PASSWORD: 使所有鍵入的字符都用“*”來顯示
ES_READONLY: 將編輯框設(shè)置成只讀的
ES_RIGHT :右對(duì)齊正文
ES_UPPERCASE: 把用戶輸入的字母統(tǒng)統(tǒng)轉(zhuǎn)換成大寫字母
ES_WANTRETURN:使多行編輯器接收回車鍵輸入并換行。如果不指定該風(fēng)格,按回車鍵會(huì)選擇默認(rèn)的命令按鈕,這往往會(huì)導(dǎo)致對(duì)話框的關(guān)閉
除了上面的風(fēng)格外,編輯款一般還會(huì)設(shè)置WS_CHILD、WS_VISIBLE、WS_BORDER等窗口風(fēng)格。另外,編輯框可以是多行的,也就是在編輯框中顯示多行文字,這就需要設(shè)置ES_MULTILINE風(fēng)格,如果想要多行編輯框支持回車鍵,則還要設(shè)置ES_WANTRETURN。
對(duì)于在對(duì)話框模板中創(chuàng)建的編輯框,它的屬性中包含了上述的風(fēng)格,例如,Multiline屬性對(duì)應(yīng)的就是ES_MULTILINE風(fēng)格,Want Return屬性對(duì)應(yīng)ES_WANTRETURN風(fēng)格。
其他三個(gè)參數(shù)與靜態(tài)文本框的Create函數(shù)的參數(shù)類似,就不介紹了。
CEdit類的主要成員函數(shù)
使用編輯框最重要的莫過于,獲取和設(shè)置編輯框中的正文,它們對(duì)應(yīng)的成員函數(shù)分別是GetWindowText和SetWindowText,這兩個(gè)函數(shù)都是繼承自CWnd類的成員函數(shù),另外,還可以使用CWnd類的GetWindowTextLength函數(shù)獲取編輯框中正文的長(zhǎng)度。
下面簡(jiǎn)單介紹CEdit類的其他幾個(gè)主要的成員函數(shù):
int LineFromChar(int nIndex = –1) const;
返回多行編輯框中指定索引的字符所在行的行號(hào)(從零開始),只適用于多行編輯框。nIndex等于-1則返回所選擇正文的第一個(gè)字符所在行的索引。如果沒有選擇正文,則返回當(dāng)前行的行號(hào)。
int LineIndex(int nLine = –1) const;
返回由nLine指定行的起始字符在編輯框的整個(gè)字符串中的索引,只適用于多行編輯框。如果指定行超過編輯框的最大行數(shù),則返回-1,而如果nLine為-1,則返回當(dāng)前插入符所在行的起始字符的索引。
void GetSel(int& nStartChar,int& nEndChar) const;
獲取選擇正文的索引范圍。nStartChar返回被選擇正文的起始索引,nEndChar返回被選擇正文的終止索引(不包括在選擇范圍內(nèi))。如果沒有選擇正文,則兩者均為當(dāng)前插入符的索引。
void SetSel(int nStartChar,int nEndChar,BOOL bNoScroll=FALSE);
選擇編輯框中的正文。nStartChar為選擇開始處的索引,nEndChar為選擇結(jié)束處的索引。如果nStartChar為0并且nEndChar為-1,則選擇所有正文,而如果nStartChar為-1則取消所有選擇。bNoScroll為FALSE時(shí)滾動(dòng)插入符并使之可見,為TRUE時(shí)不滾動(dòng)。
void ReplaceSel(LPCTSTR lpszNewText,BOOL bCanUndo = FALSE);
用lpszNewText指向的字符串來替換選擇的正文。如果bCanUndo為TRUE則替換可以被撤銷。
int GetLineCount() const;
獲取正文的行數(shù),只適用于多行編輯框。如果編輯框沒有正文則返回1。
int LineLength( int nLine = –1 ) const;
獲取指定字符索引所在行的字節(jié)長(zhǎng)度(行尾的回車和換行符不計(jì)算在內(nèi)),參數(shù)nLine 說明了為字符索引。如果nLine 的值為-1,則函數(shù)返回當(dāng)前行的長(zhǎng)度(假如沒有正文被選擇),或選擇正文占據(jù)的行的字符總數(shù)減去選擇正文的字符數(shù)(假如有正文被選擇)。若用于單行編輯框,則函數(shù)返回整個(gè)正文的長(zhǎng)度。
int GetLine( int nIndex, LPTSTR lpszBuffer ) const;
int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;
用來獲得指定行的正文(不包括行尾的回車和換行符),只適用于多行編輯框。參數(shù)nIndex 是行號(hào),lpszBuffer 指向存放正文的緩沖區(qū),nMaxLength 規(guī)定了拷貝的最大字節(jié)數(shù)。若指定的行號(hào)小于編輯框的實(shí)際行數(shù),函數(shù)返回實(shí)際拷貝的字節(jié)數(shù),若指定的行號(hào)大于編輯框的實(shí)際行數(shù),則函數(shù)返回0。需要注意的是,GetLine 函數(shù)不會(huì)在緩沖區(qū)中字符串的末尾添加字符串結(jié)束符(NULL)。
UINT GetLimitText( ) const;
獲取編輯框能夠接受的正文的最大字節(jié)數(shù)。
void LimitText(int nChars = 0);
設(shè)置用戶在編輯框中可以輸入的正文的最大長(zhǎng)度(字節(jié)數(shù))。如果nChars為0,則最大長(zhǎng)度為UINT_MAX個(gè)字節(jié)。
CEdit類應(yīng)用實(shí)例
下面雞啄米為大家寫一個(gè)簡(jiǎn)單的例子,來說明CEdit類的幾個(gè)成員函數(shù)的使用方法。此例的功能是,首先在編輯框中顯示一行正文,然后替換其中部分字符為另一個(gè)含有回車符的字符串,最終顯示為兩行正文。下面是簡(jiǎn)單的步驟介紹:
1.創(chuàng)建基于對(duì)話框的MFC程序,名稱為“Example21”。
2.在自動(dòng)生成的對(duì)話框模板IDD_EXAMPLE21_DIALOG中,刪除靜態(tài)文本框“TODO: Place dialog controls here.”,添加一個(gè)編輯框,ID設(shè)為IDC_MULTI_LINE_EDIT,屬性Multiline設(shè)置為true。
3.為編輯框IDC_MULTI_LINE_EDIT添加CEdit類型的控件變量m_editMultiLine。
4.修改CExample21Dlg::OnInitDialog()函數(shù)為:
C++代碼
BOOL CExample21Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_editMultiLine.SetWindowText(_T("雞啄米博客/software")); // 設(shè)置編輯框正文為“雞啄米博客.com” m_editMultiLine.SetSel(3, 5); // 選擇起始索引為3,終止索引為5(不包括在選擇范圍內(nèi))的正文,即“博客” m_editMultiLine.ReplaceSel(_T("\r\nwww.jizhuomi.com")); // 將選擇的“博客”替換為“\r\nwww.jizhuomi.com” return TRUE; // return TRUE unless you set the focus to a control }
5.編譯運(yùn)行程序,結(jié)果對(duì)話框如下:
關(guān)于編輯框的介紹就到這里了。CEdit類成員函數(shù)的更詳細(xì)的講解可以查閱MSDN。
轉(zhuǎn)載自:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn