雞啄米上一節講了靜態文本框,本節要講的編輯框(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:指定編輯框的風格??梢允?a target="_blank" href="http://www.9385095.live/software/139.html">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_WANTRETURN風格。

       其他三個參數與靜態文本框的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,BOOL bNoScroll=FALSE);

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

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

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

       int GetLineCount() const;

       獲取正文的行數,只適用于多行編輯框。如果編輯框沒有正文則返回1。

       int LineLength( int nLine = –1 ) const;

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

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

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

       UINT GetLimitText( ) const;

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

       void LimitText(int nChars = 0);

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

       CEdit類應用實例

       下面雞啄米為大家寫一個簡單的例子,來說明CEdit類的幾個成員函數的使用方法。此例的功能是,首先在編輯框中顯示一行正文,然后替換其中部分字符為另一個含有回車符的字符串,最終顯示為兩行正文。下面是簡單的步驟介紹:

       1.創建基于對話框的MFC程序,名稱為“Example21”。

       2.在自動生成的對話框模板IDD_EXAMPLE21_DIALOG中,刪除靜態文本框“TODO: Place dialog controls here.”,添加一個編輯框,ID設為IDC_MULTI_LINE_EDIT,屬性Multiline設置為true。

       3.為編輯框IDC_MULTI_LINE_EDIT添加CEdit類型的控件變量m_editMultiLine。

       4.修改CExample21Dlg::OnInitDialog()函數為:

C++代碼
  1. BOOL CExample21Dlg::OnInitDialog()   
  2. {   
  3.     CDialogEx::OnInitDialog();   
  4.   
  5.     // Add "About..." menu item to system menu.   
  6.   
  7.     // IDM_ABOUTBOX must be in the system command range.   
  8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
  9.     ASSERT(IDM_ABOUTBOX < 0xF000);   
  10.   
  11.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
  12.     if (pSysMenu != NULL)   
  13.     {   
  14.         BOOL bNameValid;   
  15.         CString strAboutMenu;   
  16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   
  17.         ASSERT(bNameValid);   
  18.         if (!strAboutMenu.IsEmpty())   
  19.         {   
  20.             pSysMenu->AppendMenu(MF_SEPARATOR);   
  21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
  22.         }   
  23.     }   
  24.   
  25.     // Set the icon for this dialog.  The framework does this automatically   
  26.     //  when the application's main window is not a dialog   
  27.     SetIcon(m_hIcon, TRUE);         // Set big icon   
  28.     SetIcon(m_hIcon, FALSE);        // Set small icon   
  29.   
  30.     // TODO: Add extra initialization here   
  31.     m_editMultiLine.SetWindowText(_T("雞啄米博客/software"));  // 設置編輯框正文為“雞啄米博客.com”   
  32.     m_editMultiLine.SetSel(3, 5);                            // 選擇起始索引為3,終止索引為5(不包括在選擇范圍內)的正文,即“博客”   
  33.     m_editMultiLine.ReplaceSel(_T("\r\nwww.9385095.live"));  // 將選擇的“博客”替換為“\r\nwww.9385095.live”   
  34.   
  35.     return TRUE;  // return TRUE  unless you set the focus to a control   
  36. }  

      5.編譯運行程序,結果對話框如下:

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

      關于編輯框的介紹就到這里了。CEdit類成員函數的更詳細的講解可以查閱MSDN。雞啄米謝謝您的持續關注。

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.9385095.live/software/181.html
2012年5月26日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:36