1. 程式人生 > >MFC控制元件Edit Control

MFC控制元件Edit Control

入門篇:

Edit Control控制元件最常見的用法,一般有有以下幾種:

1、  顯示預設的字串;

2、  接受使用者輸入的字串。

3、  作為密碼框接受使用者輸入的字串。

Edit Control對應的MFC類為CEdit類。而CEdit是繼承自CWnd類的,所以也繼承了來自CWnd類的GetWindowText()和SetWindowText()。其實從這兩個函式的名字大家都可以看出來是做什麼用的了。

我們來一步一步實現Edit Control控制元件的這三種最常見的用法。

首先,先建立一個專案,在VC++中選擇MFC,選擇MFC應用程式,並選擇基於對話方塊的。專案完全開啟後,我們可以看到預設生成的對話方塊,我們從工具箱拉一個Edit Control到對話方塊上。使用Ctrl+左鍵雙擊,建立一個和Edit Control控制元件的一個變數,也即一個CEdit類的物件。此處為m_edit.

接下來我們可以在對話方塊的CXXXDlg::OnInitDialog()中新增程式碼。此處XXX是專案名稱。在此函式中新增:

m_edit.SetWindowText(_T("welcome to edit"));

然後我們除錯程式,就可以看到對話方塊上面放置的Edit Control中顯示了上述字串的內容。其實這個函式很簡單,只是一個需要設定的字串。我們來看下關於這個函式的具體內容:

CWnd::SetWindowText

void SetWindowText( LPCTSTR lpszString );

引數:

lpszString

指向一個CString物件或以null結尾的字串,將被用作新的標題或控制元件文字。

說明:這個函式將視窗的標題設為指定的文字。如果視窗為一個控制元件,則將設定控制元件內的文字。這個函式使一條WM_SETTEXT訊息被髮送到這個視窗。

而我們要得到Edit Control控制元件中輸入的內容的話,我們需要一個觸發。此處我們以點選確定鍵為觸發。雙擊資源中的對話方塊上的確定鍵,我們可以直接到達函式CXXXtDlg::OnBnClickedOk()的位置,然後我們可以在這個函式中新增如下程式碼:

          CString lpszStringBuf;

         m_edit.GetWindowText(lpszStringBuf);

    MessageBox(lpszStringBuf);

這幾句程式碼可以接受控制元件的文字內容,然後以一個訊息的形式顯示出來。

我們也來具體分析下GetWindowText:

CWnd::GetWindowText

int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;
void GetWindowText( CString& rString ) const;

返回值:指定了要拷貝的字串的長度,以位元組為單位,不包括結尾的空字元。如果CWnd沒有標題或標題為空,則為0引數:

lpszStringBuf

指向要接收視窗標題的複製字串的緩衝區。

nMaxCount

指定了要拷貝的緩衝區的最大字元數目。如果字串比nMaxCount指定的數目還要長,則被截斷。

rString

用於接收視窗標題的複製字串的CString物件。

說明:這個函式將CWnd的標題(如果有)拷貝到lpszStringBuf指向的緩衝區或者目的字串rString。如果CWnd物件是一個控制元件,則GetWindowText成員函式將拷貝控制元件內的文字(而不是控制元件的標題)。這個成員函式會向CWnd物件傳送一個WM_GETTEXT訊息。

    其實這兩個功能的實現都很簡單,只是使用了一個函式就可以實現了。如果要是想做一個密碼輸入框怎麼辦呢?其實跟上面的比起來,只需要在Edit Control控制元件的屬性中將Password的屬性改為TRUE就可以了。

提高篇:

一、利用WM_CTLCOLOR訊息實現Edit   Control的文字與背景色的改變 

首先要明白:WM_CTLCOLOR是一個由控制(Control)傳送給它父視窗的通知訊息(Notification   message)。 

實現步驟: 
生成一個標準的單文件應用程式框架,假設應用程式的名稱為Color。我將利用它的About對話方塊做示範。在About   dialog中新增兩個Edit   control,設定其ID為IDC_EDIT1與IDC_EDIT2。 

第一種方法(對應於IDC_EDIT1):   按照標準的Windows程式設計,由其父視窗的訊息處理函式負責處理WM_CTLCOLOR訊息。 

1.   在CAboutDlg中新增一個數據成員:HBRUSH   m_brMine; 
2.   利用嚮導對映AboutDlg的WM_CTLCOLOR訊息,產生函式:HBRUSH   CAboutDlg::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor); 
pDC是AboutDlg的裝置上下文,pWnd是AboutDlg中傳送該訊息的control指標,nCtlColor市Control的型別編碼。對其進行如下修改: 

HBRUSH   CAboutDlg::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)   

    if   ((pWnd-> GetDlgCtrlID()   ==   IDC_EDIT1)   &&   (nCtlColor   ==   CTLCOLOR_EDIT)) 
    { 
            COLORREF   clr   =   RGB(255,0,0); 
            pDC-> SetTextColor(clr);       //設定紅色的文字 
            clr   =   RGB(0,0,0); 
            pDC-> SetBkColor(clr);           //設定黑色的背景 
            m_brMine   =   ::CreateSolidBrush(clr); 
            return   m_brMine;     //作為約定,返回背景色對應的刷子控制代碼 
    } 
    else 
    { 
            HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor); 
            return   hbr; 
    } 


第二種方法(對應於IDC_EDIT2):   
利用MFC   4.0的新特性:   Message   reflection。 

1.利用嚮導新增一個新的類:CColorEdit,基類為CEdit; 
2.在CColorEdit中新增一個數據成員:   HBRUSH   m_bkBrush; 
3.利用嚮導對映CColorEdit的 "=WM_CTLCOLOR "訊息,產生函式: 

HBRUSH   CColorEdit::CtlColor(CDC*   pDC,   UINT   nCtlColor);   

對其進行如下修改: 

HBRUSH   CColorEdit::CtlColor(CDC*   pDC,   UINT   nCtlColor)   

    COLORREF   clr   =   RGB(0,0,0); 
    pDC-> SetTextColor(clr);       //設定黑色的文字 
    clr   =   RGB(255,0,0); 
    pDC-> SetBkColor(clr);           //設定紅色的背景 
    m_bkBrush   =   ::CreateSolidBrush(clr); 
    return   m_bkBrush;     //作為約定,返回背景色對應的刷子控制代碼 


4.利用嚮導為IDC_EDIT2生成一個數據成員CColorEdit   m_coloredit; 
5.在定義CAboutDlg的color.cpp檔案中加入:#include   "coloredit.h "  

二、關於CEdit控制元件的透明

關於CEdit控制元件的透明 
做一個透明的Edit控制元件的主要問題是字元的輸出,在Edit裡輸出的重新整理有幾個時機,一個是在接收到鍵盤或滑鼠訊息的時候 ,還有就是在接收到WM_PAINT訊息。重新整理的時候也不是全部重畫,所以想通過在繼承的Edit類中處理WM_PAINT訊息是行不通的。但是Edit 控制元件自己總是知道怎麼去重新整理,因此只要給控制元件發訊息,讓其自己來重新整理就可以了。通過使用spy++的得知需要重新整理有幾個時機,一個是按鍵的時候,內容變 化,另一個是選擇變化的時候,前者Edit控制元件會接收到GetCtlCode和KeyUp 訊息,後者會接收到GetCtlCode和CaptureChange訊息或KeyUp訊息,因此在GetCtlCode裡呼叫ReDrawWindow 來強迫Edit重新整理 整個控制元件。在ReDrawWindow中通過使用引數RDW_ERASE可以使控制元件重畫背景,即呼叫OnEraseBkgnd(CDC* pDC),在該函式中重 畫背景。比較特殊的情況是按住滑鼠左鍵並來回拖動滑鼠的時候,這時候選擇要改變,接收的訊息是MouseMove,為了正 確響應也要處理該訊息,但是在每一個MouseMove中都重新整理顯示的開銷太大,而且不可避免地有閃爍感,因此只有在滑鼠左 鍵按下的時候才重新整理顯示。
大概的程式碼如下,主要是繼承了一個CEdit的物件CTpEdit,使用的時候可以動態建立,或者採用SubClass的方法。我用的是後者。
class CTESTDLG : public CDialog
{
......
//宣告一個CTpEdit的成員變數
private:
CTpEdit m_tpedit;
};

//在OnInitDialog中Subclass對話方塊模板中的Edit控制元件
BOOL CTESTDLG::OnInitDialog() 
{
CDialog::OnInitDialog();
m_tpedit.SubclassDlgItem(IDC_EDIT,this);
return TRUE; 
}

//在OnCtlColor中設定背景的透明,要改變Edit控制元件字型的顏色也在這裡

HBRUSH CTESTDLG::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if((nCtlColor == CTLCOLOR_EDIT) && (pWnd->GetDlgCtrlID()==IDC_EDIT))
{
pDC->SetBkMode(TRANSPARENT); //設定背景透明,這樣,輸出字元的時候就
//是所謂的空心字,而不是有白的底色
pDC->SetTextColor(RGB(255,0,0)); //改變字型的顏色
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}

return hbr;
}

//CTpEdit物件

class CTpEdit : public CEdit
{
public:
//m_mousedown用來記錄滑鼠左鍵是否按下
BOOL m_mousedown;
protected:
//響應如下的訊息
//{{AFX_MSG(CTpEdit)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg UINT OnGetDlgCode();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

//CTpEdit的訊息響應函式如下
//畫背景圖
BOOL CTpEdit::OnEraseBkgnd(CDC* pDC) 
{
//得到Edit控制元件的外框,即背景區域
RECT updatarect; 
GetClientRect(&updatarect);
//畫背景,我畫的是一個黃色的矩形
CBrush newBrush;
newBrush.CreateSolidBrush(RGB(255,255,200));
CBrush * oldBrush = pDC->SelectObject(&newBrush);
pDC->Rectangle(&updatarect);
pDC->SelectObject(oldBrush);
return TRUE;
}

//強迫Edit控制元件擦除背景,重寫字元
UINT CTpEdit::OnGetDlgCode() 
{ RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE ); 
return CEdit::OnGetDlgCode();
}
//記錄滑鼠左鍵是否按下
void CTpEdit::OnLButtonDown(UINT nFlags, CPoint point) 
{
m_mousedown = TRUE;
SetCapture();
CEdit::OnLButtonDown(nFlags, point);
}

void CTpEdit::OnLButtonUp(UINT nFlags, CPoint point) 
{
if(m_mousedown) 
ReleaseCapture();
m_mousedown = FALSE;
CEdit::OnLButtonUp(nFlags, point);
}

//如果左鍵按下並且拖動滑鼠就要重新整理顯示
void CTpEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_mousedown)
RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE );
CEdit::OnMouseMove(nFlags, point);
}
//初始化成員變數
CTpEdit::CTpEdit()
{
m_mousedown=FALSE;
}

三、基本用法

通過類嚮導以生成兩種類成員變數,一種是cstring型別,一種是cedit型別。

在程式中使用時如果只是簡單的獲取 edit控制元件內容,或設定簡單的內容建議使用cstring型別成員變數。

示例:

CString m_strEdit;

//獲得edit框內容
UpdateData(true);

此時m_strEdit就是edit框內容的字串變數。

//要更新edit的話只要對m_strEdit進行賦值然後

UpdataData(false);//即可


如果是一些對edit框的複雜操作建議用cedit型別。

示例:

CEdit m_ctrlEdit;

//將游標移到開頭

m_ctrlEdit.SetSel(0,0);

//將游標移到末尾
m_ctrlEdit.SetSel(-1);

//選中所有內容

m_ctrlEdit.SetSel(0,-1);

//寫入值

m_ctrlEdit.ReplaceSel("替換內容");

//得到當前edit框中的所有字元數
int iStart,iCount;//iCount 為字元數
m_ctrlEdit.SetSel(0,-1);

m_ctrlEdit.GetSel(iStart,iCount);

還一種可以直接用控制元件的id值來進行操作

示例:

((CEdit*)GetDlgItem(IDC_EDIT)

他類似於上邊的m_ctrlEdit

這樣寫的好處是可以在訊息傳遞中使用,便於不同視窗間傳遞edit內容

例如:下面的訊息響應函式中
SetEditContent(WPARAM wPARAM, LPARAM lPARAM)

IDC_EDIT可以通過wPARAM傳遞近來,而字元傳內容可以直接通過lPARAM傳遞近來

CString Msg="要傳遞的訊息";

::SendMessage(m_hParent,WM_SENDMSG_EDIT,(WPARAM) IDC_EDIT, (LPARAM)(LPSTR)(LPCTSTR)Msg)

如:

((CEdit*)GetDlgItem(wPARAM))->SetSel(-1);

((CEdit*)GetDlgItem(wPARAM))->ReplaceSel((LPCSTR)lPARAM);

VC編輯框(EDIT)的自動換行與自動滾屏

經過多次測試,總結出VC編輯框(EDIT)的自動換行與自動滾屏的方法。

方法一:(當EDIT對映到一CString時)

m_String = m_String + sNewString + "/r/n" //自動換行

UpdateData(false);

此法只能做到自動換行,不會自動滾屏到最後一行。

方法二:(當EDIT對映到一EDIT時)

m_Edit.SetSel(-1, -1); //自動滾屏

m_Edit.ReplaceSel(sNewString+"/r/n"); //自動換行

UpdateData(true);

此法可以做到自動換行,並自動滾屏到最後一行。

以上,m_String、m_Edit.分別為給編輯框新增的成員變數;sNewString 為要顯示的字串

注意二法中UpdataData引數的區別。

四、引數

編輯框(Edit)控制元件實際上是一個簡易的文字編輯器,使用者可以在編輯框中輸入可新增或插入文字。還有複製、貼上、剪下、刪除等編輯功能。
  應用程式用CreateWindowEx建立編輯框控制元件時,可根據控制元件的用途在下表中選擇部份常數來設定其風格屬性(style)。
常數 說明
ES_MULTILINE 多行文字,指定編輯控制元件可以多行文字編輯,使用者每按一次Enter,在當前游標次輸入一個回車換行符(0Dh,0Ah),文字增加一行。
ES_LEFT 文字顯示居左。
ES_CENTER 文字顯示居中。
ES_RIGHT 文字顯示居右。
ES_LOWERCASE 把使用者輸入的字母統統轉換成小寫字母。
ES_UPPERCASE 把使用者輸入的字母統統轉換成大寫字母。
ES_OEMCONVERT 使編輯框中的正文可以在ANSI字符集和OEM字符集之間相互轉換。這在編輯框中包含檔名時是很有用的。
ES_AUTOHSCROLL 當用戶在行尾鍵入一個字元時,正文將自動向右滾動10個字元,當用戶按回車鍵時,正文總是滾向左邊。
ES_AUTOVSCROLL 當用戶在最後一個可見行按回車鍵時,正文向上滾動一頁。
ES_NUMBER 只接收數碼輸入,其它字元輸入一律無效。
ES_NOHIDESEL 當編輯框失去輸入焦點,正文中的選擇保持不變,預設時正文中的選擇將失效。
ES_READONLY 將編輯框設定成只讀的。
ES_PASSWORD 使所有鍵入的字元都用“*”來顯示。
ES_WANTRETURN 使多行編輯器接收回車鍵輸入並換行。如果不指定該風格,按回車鍵會選擇預設的命令按鈕,這往往會導致對話方塊的關閉。

  當用戶在編輯控制元件上進行各種操作時,其父視窗將收到WM_COMMAND通知訊息,同時wParam的低16位帶控制元件的ID。lParam帶控制元件控制代碼(hWnd),wParam的高16位帶有如下表的訊息程式碼。
訊息程式碼 使用者操作
EN_CHANGE 編輯框的內容被使用者改變了。與EN_UPDATE不同,該訊息是在編輯框顯示的正文被重新整理後才發出的。
EN_ERRSPACE 編輯框控制元件無法申請足夠的動態記憶體來滿足需要。
EN_HSCROLL 使用者在水平滾動條上單擊滑鼠。
EN_KILLFOCUS 編輯框失去輸入焦點。
EN_MAXTEXT 輸入的字元超過了規定的最大字元數。在沒有ES_AUTOHSCROLL或ES_AUTOVSCROLL的編輯框中,當正文超出了編輯框的邊框時也會發出該訊息。
EN_SETFOCUS 編輯框獲得輸入焦點。
EN_UPDATE 在編輯框準備顯示改變了的正文時傳送該訊息。
EN_VSCROLL 使用者在垂直滾動條上單擊滑鼠。

  應用程式可以通過呼叫SendMessage向控制元件傳送如下訊息來設定和查詢控制元件各種引數。
uMsg wParam lParam 說明
EM_UNDO 0 0 撤消前一次在控制元件的編輯操作,當重複傳送本訊息,控制元件將在撤消和恢復中來回切換。
EM_CANUNDO 0 0 檢測控制元件撤消緩衝區是否為空,通常控制元件把最後一次在控制元件的編輯操作儲存在一個撤消緩衝區,如果緩衝區非空則返回TRUE表示上次操作可以撤消,否則返回FALSE,應用程式可以利用該返回值來禁止或允許選單或工具條的“撤消”項。
EM_EMPTYUNDOBUFFER 0 0 清除控制元件的撤消緩衝區,使其不能撤消前一次編輯操作。
EM_REPLACESEL TRUE或FALSE 替換文字指標 用指定文字替換編輯控制元件中的當前選定內容,如果wParam為TRUE,則本次操作允許撤消,FALSE禁止撤消。
EM_SETSEL 起點 終點 設定編輯控制元件中文字選定內容範圍,該範圍被高亮度顯示,用於為複製、替換、貼上、剪下、刪除等編輯功能指定範圍。使用本 功能,鍵盤游標將被移至指定的終點後面,通常使用指定相同起點和終點來移動鍵盤游標而不選定範圍。當指定的起點等於0和終點等於-1時,全文全部被選中, 此法常用在清空編輯控制元件。當指定的起點等於-2和終點等於-1時,全文均不選,鍵盤游標移至文字未端,此法常用在文字未端追加內容。注意 :當控制元件沒有輸入焦點時,本操作將會失敗,一般在執行本操作前都應呼叫SetFocus先取得輸入焦點。
EM_GETSEL 起點緩衝地址
或NULL
終點緩衝地址
或NULL
取得編輯控制元件中選定內容的範圍,返回值中低16位為起點與高16位為終點,如果wParam和lParam中指定了地址,則會在該地址填入相應值(dword)。本操作也常用來求取鍵盤游標位置。
EM_CHARFROMPOS 0 位置 取得指定位置處的字元相對於文字頭部的偏移,使用本操作應先在lParam的高16位指定行號,低16位指定列號,行列是按編輯控制元件的客戶區左上角為原點(0,0)計算的。如果指定的位置超出控制元件客戶區則返回-1
EM_FMTLINES TRUE或FALSE 0 決定是否在取回的文字宇串中包含軟回車字元
EM_GETFIRSTVISIBLELINE 0 0 取得編輯控制元件中顯示的第一行
EM_GETHANDLE 0 0 取得編輯控制元件文字緩衝區。
EM_GETLIMITTEXT 0 0 獲取一個編輯控制元件中文字的最大長度
EM_GETLINE 行號 緩衝地址 從編輯控制元件取回一行的內容,緩衝區第一個字(word)必須先填寫緩衝區的長度,
EM_GETLINECOUNT 0 0 取得一個編輯控制元件的總行數
EM_GETMARGINS 0 0 獲取編輯控制元件的左、右邊距,返回值低16位為左邊距,高16位為右邊距
EM_GETMODIFY 0 0 取編輯控制元件的修改標誌,返回 TRUE則控制元件文字已被修改,返回FALSE則未變。此值可以來決定是否提示使用者存檔。
EM_GETPASSWORDCHAR 0 0 取得編輯控制元件用來顯示密碼的字元,返回NULL表示沒有字元。
EM_GETRECT 0 RECT結構地址 獲取一個編輯控制元件的格式化矩形
EM_GETTHUMB 0 0 取得多行文字編輯控制元件的滾動框的當前位置。
EM_GETWORDBREAKPROC 0 0 取得整字換行回撥函式EditWordBreakProc指標。
EM_LIMITTEXT 最大值 0 限制編輯中文字的最大長度
EM_LINEFROMCHAR 字元偏移 0 取得指定的字元偏移處的行號。
EM_LINEINDEX 行號 0 取得指定行第一個字元偏移
EM_LINELENGTH 字元偏移 0 取得指定字元偏移處對應的一行長度字元數。
EM_LINESCROLL 列字元 行數 滾動編輯控制元件
EM_POSFROMCHAR POINT結構地址 字元偏移 取得指定字元偏移的顯示位置行列號,行列是按編輯控制元件的客戶區左上角為原點(0,0)計算的。字元偏移是相對於文字頭部的偏移。
EM_SCROLL SB_LINEDOWN
SB_LINEUP
SB_PAGEDOWN
SB_PAGEUP
0 編輯框顯示文字垂直滾動。滾動方向:SB_LINEDOWN向下滾動一行,SB_LINEUP向上滾動一行,SB_PAGEDOWN向下滾動一頁,SB_PAGEUP向上滾動一頁。
EM_SCROLLCARET 0 0 把鍵盤游標移至可見範圍。
EM_SETHANDLE 緩衝區指標 0 為編輯控制元件指定新的文字緩衝區。此操作僅適用對話方塊建立帶DS_LOCALEDIT風格的控制元件。
EM_SETLIMITTEXT 長度(位元組) 0 限制編輯控制元件中的文字緩衝區最大長度。
EM_SETMARGINS EC_LEFTMARGIN
EC_RIGHTMARGIN
EC_USEFONTINFO
邊距 設定編輯控制元件的左、右邊距,當wParam含EC_LEFTMARGIN時在lParam的低16位指定左邊距點數,當 wParam含EC_RIGHTMARGIN時在lParam的高16位指定右邊距點數。當指定wParam為EC_USEFONTINFO時,則用當前 字型的字元"A"的寬度指定右邊距和字元"C"的寬度指定左邊距lParam被忽略。
EM_SETMODIFY TRUE或FALSE 0 用於設定或清除一個編輯控制元件的修改標誌
EM_SETPASSWORDCHAR 字元 0 指定控制元件用來顯示密碼字元,預設為“*”。當wParam為0時,本操作將清除控制元件的ES_PASSWORD風格,並按實際字元顯示。
EM_SETREADONLY TRUE或FALSE 0 決定是否將編輯控制元件設為只讀,同時決定控制元件的ES_READONLY風格
EM_SETRECT 0 RECT結構地址 為一個編輯控制元件設定格式化矩形
EM_SETRECTNP 0 RECT結構地址 與EM_SETRECT類似,只是控制元件此時不會重畫
EM_SETTABSTOPS 製表站數 站距表地址 設定編輯控制元件中的製表站間距,當製表站數為0時lParam被忽略,所有制表站距均為32個對話方塊單位,當製表站數不為0時lParam指向一個由32位(dword)組成的站距表,以對話方塊單位為寬度計算單位。
EM_SETWORDBREAK 0 0 本操作現已不支援,請使用EM_SETWORDBREAKPROC。
EM_SETWORDBREAKPROC 0 函式入口地址 設定整字換行回撥函式EditWordBreakProc指標。
五、 vc edit box 控制元件使用

SetSel(start,end)作用:
定製EDIT的所選擇內容.間接地可以用於定位游標位置.

使用例子:
EXP1:設定游標
CEdit*      pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);   
pEdit->SetSel(2,2);   
pEdit->SetFocus();

EXP2:選擇內容
CEdit*      pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);   
pEdit->SetSel(0,2);//兩個字元  


說明:
如果出現游標設定失效的情況,可能是由於以下情況:因為UpdateData()的作用也會重置游標,所以用於設定游標時一定要放在UpdateData()之後.
如果用於選擇內容:SetSel(0,-1)表示全選;SetSel(-1,i)表示刪除所有.     

1.怎麼在CEDIT執行回車換行顯示的功能?

CEdit控制元件設定want return 屬性 並設定Multiline屬性,此時用

CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
pEdit->SetWindowText("第一/r/n第二/r/n第三");

將顯示3行。

2。作為密碼輸入控制元件使用。

m_WndEDIT4.SetPasswordChar('*');

3。CEDIT沒有AppendText功能怎麼辦?

   int nLength = m_WndEDIT4.SendMessage(WM_GETTEXTLENGTH);
   m_WndEDIT4.SetSel(nLength, nLength);
   m_WndEDIT4.ReplaceSel( " abc " );

1.如果文字框和變數建立了關聯直接
UpdateData(TRUE) //用於獲得文字框中的內容;
UpdateData(FALSE) //用於更新文字框的內容並和更新關聯的變數
例如:
DDX_Text(pDX, IDC_EDIT1, m_sEdit1);//把變數m_sEdit1與IDC_EDIT1建立聯絡

//讓文字框中顯示“Hello”
m_sEdit1 = "Hello";
UpdateData(FALSE);

//獲得文字框的使用者輸入內容
UpdateData(TRUE);//如果使用者寫入的是"MingFei",那麼m_sEdit1的值應該是"MingFei"
if (m_sEdit1 == "MingFei")
{
AfxMessageBox("OK");
}
2.
CString str;
GetDlgItemText(IDC_EDIT1, str);//獲得文字框中的內容,儲存在str中
SetDlgItemText(IDC_EDIT1, str);//向文字框中寫入str
3.麻煩點,其實就是第二種方法
CEdit *edit=(CEdit*)GetDlgItem(IDC_EDIT1);
CString dir;
edit->GetWindowText(dir);

(47) 如何限制編輯框中的准許字元 
  如果使用者在編輯控制元件中只允許接收數字,可以使用一個標準的編輯控制元件並指定新的建立標誌ES_NUMBERS,它是Windows 95新增加的標誌,該標誌限制 編輯控制元件只按收數字字元。如果使用者需要複雜的編輯控制元件,可以使用Microsoft 的遮蔽編輯控制元件,它是一個很有用的OLE定製控制元件。 
如果希望不使用OLE 定製控制元件自己處理字元,可以派生一個CEdit類並處理WM_CHAR訊息,然後從編輯控制元件中過濾出特定的字元。首先,使用ClassWizard建立一 個 CEdit的派生類,其次,在對話類中指定一個成員變數將編輯控制元件分類在OnInitdialog 中呼叫CWnd: : SubclassDlgItem . 
  //In your dialog class declaration (.H file ) 
  private : CMyEdit m_wndEdit // Instance of your new edit control . 
  //In you dialog class implementation (.CPP file ) 
  BOOL CSampleDialog : : OnInitDialog ( ) 
  { 
  … 
  //Subclass the edit lontrod . 
  m_wndEdit .SubclassDlgItem (IDC_EDIT,this) 
  … 
  }

  使用ClassWizard處理WM_CHAR訊息,計算nChar參量並決定所執行的操作,使用者可以確定是否修改、傳送字元。下例說明了如何顯示字母字元,如果字元是字母字元,則呼叫CWnd OnChar,否則不呼叫OnChar. 
  //Only display alphabetic dharacters . 
  void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags ) 
  { 
  //Determine if nChar is an alphabetic character. 
  if (: : IsCharAlpha ( ( TCHAR) nChar ) ) 
  CEdit : : OnChar (nChar, nRepCnt , nFlags ) 
  }

  如果要修改字元,則不能僅僅簡單地用修改過的nChar呼叫CEdit: : OnChar,然後CEdit: : OnChar呼叫CWnd: : Default獲取原來的wParam 和lParam 的值,這樣是不行的。要修改一個字元,需要首先修改nChar,然後用修改過的nChar呼叫CWnd: : DefWindowProc。下例說明了如何將字元轉變為大寫: 
  //Make all characters uppercase 
  void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags ) 
  { 
  //Make sure character is uppercase . 
  if (: : IsCharAlpha ( .( TCHAR) nChar) 
  nChar=: : CharUpper(nChar ) 
  //Bypass default OnChar processing and directly call 
  //default window proc. 
  DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt, nFlags )) 
  }

列舉所有字型 
LOGFONT lf; 
lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structure 
strcpy(lf.lfFaceName,""); 
CClientDC dc (this); 
// Enumerate the font families 
::EnumFontFamiliesEx((HDC) dc,&lf, (FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0); 
//列舉函式 
int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf, 
                             LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam) 
                   

    // Create a pointer to the dialog window 
    CDay7Dlg* pWnd = (CDay7Dlg*) lparam; 
    // add the font name to the list box 
    pWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName); 
    // Return 1 to continue font enumeration 
    return 1; 
}

用Edit Box 顯示系統實時時間: 在對話方塊的初始化函式OnInitDialog()中新增以下程式: SYSTEMTIME st;
GetLocalTime(&st);
CString str_temp;
str_temp.Format("%u/%u/%u %u:%u:%u:%u/n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
CEdit* edt = (CEdit*)GetDlgItem(IDC_EDIT_TIME);
edt->SetWindowText(str_temp);
用Edit Box 顯示系統當前時間 在對話方塊的初始化函式OnInitDialog()中新增以下程式: CString str;
CTime tm;
 
tm = CTime::GetCurrentTime(); //把獲得的當前時間儲存到變數tm中
str = tm.Format("%Y年%m月%d日 %X");
this->GetDlgItem(IDC_EDIT1)->SetWindowText(str);
   用Edit Box 只接受數字輸入: 在對話方塊初始化函式中新增以下程式碼: CEdit* m_edit = (CEdit*)GetDlgItem(IDC_EDIT1);
long wl = GetWindowLong(m_edit->m_hWnd, GWL_STYLE);   //獲得Edit Box的視窗風格 
SetWindowLong(m_edit->m_hWnd, GWL_STYLE, wl | ES_NUMBER); //
 設定Edit Box新風格 自定義Edit Box的可輸入內容: 過載對話方塊的PreTranslateMessage函式,並且新增以下程式碼: BOOL CLangziDlg::PreTranslateMessage(MSG* pMsg)
{
   CEdit* m_edit = (CEdit*)GetDlgItem(IDC_EDIT1);
   if((pMsg->hwnd == m_edit->m_hwnd) && (pMsg->message == WM_CHAR))
   {
     if(65 != pMsg->wParam) //只允許輸入字母A(A的ascll碼是65)
         return TRUE;
   }
}
六、MFC中EDIT 控制元件使用     1、新建一個基於Dialog工程,拖一個Edit控制元件進去。
   2、設定支援換行操作,在屬性設定中Multiline和Want return勾上。
     若想編輯內容到最右邊後自動換行,將Auto HScroll前面的勾去掉。
   3、想Edit控制支援全選、複製、粘帖、剪下、撤銷操作,實現過程如下:
     在類嚮導中新增PreTranslateMessage函式,然後在該函式中編輯如下程式碼:

   BOOL CProcessDlg::PreTranslateMessage(MSG *pMsg)
   {
   // 編輯框快捷鍵操作
   if(WM_KEYDOWN == pMsg->message) 
   {
    if(GetKeyState( VK_CONTROL) & 0x8000) 
    {
     // 全選
     if( pMsg->wParam == 'A' || pMsg->wParam == 'a')
     {
      m_CtrlEdit.SetSel(0, -1); //m_CtrlEdit為控制元件的名字
      return true;
     }
     
     // 複製
     if( pMsg->wParam == 'C' || pMsg->wParam == 'c')
     {
      m_CtrlEdit.Copy();
      return true;
     }
     // 貼上
     if( pMsg->wParam == 'V' || pMsg->wParam == 'v')
     {
      m_CtrlEdit.Paste();
      return true;
     }   
     // 剪下
     if( pMsg->wParam == 'X' || pMsg->wParam == 'x')
     {
      m_CtrlEdit.Cut();
      return true;
     }
     // 撤銷
     if( pMsg->wParam == 'Z' || pMsg->wParam == 'z')
     {
      m_CtrlEdit.Undo();
      return true;
     }
     
    }
   }
   return CDialog::PreTranslateMessage(pMsg);
   }