MFC編程入門之二十一(常用控件:編輯框Edit Control)


  上一節講了靜態文本框,本節講的是編輯框(Edit Control)同樣是一種很常用的控件,我們可以在編輯框中輸入並編輯文本。在前面加法計算器的例子中已經演示了編輯框的基本應用。下面具體講解編輯框的使用。

  編輯框的通知消息

  編輯框發生某些事件時會向父窗口發送通知消息。在對話框模板中的編輯框上點擊右鍵,選擇“Add Event Handler”,為編輯框添加消息處理函數時,可以在"Message type"列表中看到這些消息。下面簡單介紹編輯框的部分通知消息。

  EN_CHANGE:編輯框的內容被用戶改變了,與EN_UPDATE不同,該消息是在編輯框顯示的正文被刷新后才發出的。

  EN_ERRSPACE:編輯框控件無法申請足夠的動態內存來滿足需要。

  EN_HSCROLL:用戶在水平滾動條上單擊鼠標。

  EN_KILLFOCUS:編輯框失去輸入焦點。

  EN_MAXTEXT:輸入的字符超過了規定的最大字符數。在沒有ES_AUTOHSCROLL或

  ES_AUTOVSCROLL:的編輯框中,正文超出了編輯框的邊框時也會發出該消息。

  EN_SETFOCUS:編輯框獲得輸入焦點。

  EN_UPDATE:在編輯框准備顯示改變了的正文時發送改消息。

  EN_VSCROLL:用戶在垂直滾動條上單擊鼠標。

  編輯框的創建

  MFC為編輯框提供了CEdit類。編輯框的所有操作都封裝到了CEdit類中。

  與靜態文本框的創建類似,除了可以在對話框模板上拖進一個編輯框,然后關聯一個變量或通過API函數使用,也可以在程序中動態創建編輯框,即調用CEdit類的成員函數CReate。Create成員函數的原型如下:

  virtual BOOL Create(

    DWORD dwStyle,

    const RECT& rect,

    CWnd* pParentWnd,

    UINT nID

  );

  參數說明:

  dwStyle:指定編輯框的風格。可以是MSDN中"edit styles"包含風格的任意組合。下面是"edit styles"的所有風格說明。

  ES_AUTOHSCROLL:當用戶在行尾鍵入一個字符是,正文將自動向右滾動10個字符,當用戶按回車鍵時,正文總是滾向左邊。

  ES_AUTOVSCROLL:當用戶在最后一個可見行按回車鍵時,正文向上滾動一頁。

  ES_CENTER:在多行編輯框中使用正文居中。

  ES_LEFT:左對齊正文。

  ES_LOWERCASE:把用戶輸入的字母統統轉換成小寫字母。

  ES_MULTILINE:指定一個多行編輯器。若多行編輯器不指定ES_AUTOHSCROLL風格,則會自動換行,若不指定ES_AUTOVSCROLL,則多行編輯器會在窗口中正文裝滿時發出警告聲響。

  ES_NOHIDESEL:默認時,當編輯框失去輸入焦點會隱藏所選的正文,當獲得輸入焦點時又顯示出來。設置該風格可禁止這種默認行為。

  ES_NUMBER:編輯框中只允許輸入數字。

  ES_OEMCONVERT:使用編輯框中的正文可以在ANSI字符集和OEM字符集之間相互轉換。這在編輯框中包含文件名時是很有用的。

  ES_PASSWORD:使所有鍵入的字符都用"*"來顯示。

  ES_READONLY:將編輯框設置成只讀的。

  ES_RIGHT:右對齊正文。

  ES_UPPERCASE:把用戶輸入的字母統統轉換成大寫字母。

  ES_WANTRETURN:使多行編輯器接收回車鍵輸入並換行。如果不指定該風格,按回車鍵會選擇默認的命令按鈕,這往往會導致對話框的關閉。

  除了上面的風格外,編輯框一般還會設置WS_CHILD、WS_VISIBLE、WS_BORDER等窗口風格。另外,編輯框可以是多行的,也就是在編輯框中顯示多行文字,這就需要設置ES_MULTILINE風格,如果想要多行編輯框支持回車鍵,則還要設置ES_WANTRETURN。

  對於在對話框模板中創建編輯框,它的屬性中包含了上述的風格,例如,Multiline屬性對應的就是ES_MULTILINE風格,Want Return屬性對應ES_EANTRETURN風格。

  其他三個參數與靜態文本框的Create函數的參數類似,就不介紹了。

  CEdit類的主要成員函數

  使用編輯框最重要的莫過於,獲取和設置編輯框中的正文,它們對應的成員函數分別是GetWindowText和SetWindowText,這兩個函數都是繼承自CWnd類的成員函數,另外,還可以使用CWnd類的GetWindowTextLength函數獲取編輯框中的正文的長度。

  下面簡單介紹CEdit類的其他幾個主要的成員函數:

  int LineFromChar(int nIndex = -1) const;

  返回多行編輯框中指定索引的字符所在行的行號(從零開始),只適用用於多行編輯框。nIndex等於-1則返回所選擇正文的第一個字符所在行的索引。如果沒有選擇正文,則返回當前行的行號。

 

  int LineIndex(int nLine = -1) const;

  返回由nLine指定行的起始字符在編輯框的整個字符串中的索引,只適用於多行編輯框。如果制定行超過編輯框的最大行數,則返回-1,如果nLine為-1,則返回當前插入符所在行的起始字符的索引。

 

  void GetSel(int& nStartChar, int& nEndChar) const;

  獲取選擇正文的索引范圍。nStartChar返回被選擇正文的起始索引,nEndChar返回被選擇正文的終止索引(不包括在選擇范圍內)。如果沒有選擇正文,則兩者均為當前插入符的索引。

 

  void SetSel(int& nStartChar, int& nEndChar) const;

  選擇編輯框中的正文。nStartChar為選擇開始處的索引,nEndChar為選擇結束處的索引。如果nStartChar為0並且nEndChar為-1,則選擇所有正文,而如果nStartChar為-1則取消所有選擇。bNoScroll為FALSE時滾動插入符並使之可見,為TRUE時不滾動。

 

  void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE);

  用lpszNewText指向的字符串來替換選擇的正文。如果bCanUndo為TRUE則替換可以被取消。

  

  int LineLength(int nLine = -1) const;

  獲取指定字符索引所在行的字節長度(行尾的回車和換行符不計算在內),參數nLine說明了為字符索引。如果nLine的值為-1,則函數返回當前行的長度(假如沒有正文被選擇),或選擇正文占據的行的字符總數減去選擇正文的字符數(假如有正文被選擇)。若用於單行編輯框,則函數返回整個行的長度。

  

  int GetLine(int nIndex, LPCTSTR lpszBuffer) const;

  int GetLine(int nIndex, LPCTSTR lpszBuffer, int nMaxLength) const;

  用來獲得指定的正文(不包括行尾的回車和換行符),只適用於多行編輯框。參數nIndex是行號,lpszBuffer指向存放正文的緩沖區,nMaxLength規定了拷貝的最大字節數。若指定的行號小於編輯框的實際行數,函數返回實際拷貝的字節數,若指定的行號大於編輯框的實際行數,則函數返回0。需要注意的是,GetLine函數不會在緩沖區中字符串的末尾添加字符串結束符(NULL)。

  

  UINT GetLimitText() const

  獲取編輯框能夠接受的正文的最大字節數。

 

  void LimitText(int nChars = 0);

  設置用戶在編輯框中可以輸入的正文的最大長度(字節數)。如果nChars為0,則最大長度為UINT_MAX個字節。如果nChars為0,則最大長度為UINT_MAX個字節。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM