1. 程式人生 > >EDIT控制元件的用法

EDIT控制元件的用法

一、利用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控制元件的透明 
作者:monsoon 
--- 前幾天和風在這裡討論關於CEdit控制元件的透明問題。主要的目的就是要做一個有圖形背景的Edit控制元件,經過一番努,終於做出了一個還算象樣的Edit控制元件。
做一個透明的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;
}


 


 


三、基本用法


http://hi.baidu.com/matthew49/blog/item/0dc0a7d6f62d1d2307088bcf.html






通過類嚮導以生成兩種類成員變數,一種是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引數的區別。

四、引數

http://hi.baidu.com/callstudio/blog/item/422c43b781506f7f8ad4b240.html


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




五、 vc edit box 控制元件使用


http://hi.baidu.com/lilipangtou/blog/item/131c16f90d2363849f51467e.html


轉載自 dongfangjack
最終編輯 lilipangtou
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; 
}


 


本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/cciey/archive/2008/07/24/2702356.aspx


用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 控制元件使用




http://hi.baidu.com/whudd/blog/item/e39ef1172d1eb04720a4e9d5.html




對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);
   }