?? vctip6.html
字號:
<html><head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"><meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0"><meta NAME="doccomm" CONTENT="sss"><meta NAME="Template" CONTENT="C:\MSOffice\Template\Sl_BOOK.dot"><meta NAME="Author" CONTENT="Cheng Jinxing"><title>Visual C++編程技巧之六</title></head><body TEXT="#000000" BGCOLOR="#CCFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"><p align="center"><br><font SIZE="+3" FACE="楷體_GB2312">Visual C++編程技巧之六</font> </p><p><a HREF="#tip41"><font SIZE="+0" FACE="Times New Roman">41</font><font SIZE="+0">、如何一個創建三態下壓按鈕</font></a> </p><p><a HREF="#tip42"><font SIZE="+0" FACE="Times New Roman">42</font><font SIZE="+0">、如何動態創建控件</font></a> </p><p><a HREF="#tip43"><font SIZE="+0" FACE="Times New Roman">43</font><font SIZE="+0">、如何限制編輯框中的準許字符</font></a> </p><p><a HREF="#tip44"><font SIZE="+0" FACE="Times New Roman">44</font><font SIZE="+0">、如何改變控件的顏色</font></a> </p><p><a HREF="#tip45"><font SIZE="+0" FACE="Times New Roman">45</font><font SIZE="+0">、當向列表框中添加多個項時如何防止閃爍</font></a> </p><p><a HREF="#tip46"><font SIZE="+0" FACE="Times New Roman">46</font><font SIZE="+0">、如何向編輯控件中添加文本</font></a> </p><p><a HREF="#tip47"><font SIZE="+0" FACE="Times New Roman">47</font><font SIZE="+0">、如何訪問預定義的</font><fontSIZE="+0" FACE="Times New Roman">GDI</font><font SIZE="+0">對象</font></a> </p><p><a HREF="#tip48"><font SIZE="+0" FACE="Times New Roman">48</font><font SIZE="+0">、如何獲取</font><fontSIZE="+0" FACE="Times New Roman">GDI</font><font SIZE="+0">對象的屬性信息</font></a> </p><p><font SIZE="+2"><b> </b></font> </p><p><a NAME="tip41"></a><b><font SIZE="+2"><font FACE="Times New Roman">41</font><fontFACE="黑體">、如何一個創建三態下壓按鈕</font></font></b> </p><p><font SIZE="+0">可以使用新的<font FACE="Times New Roman">BS_PUSHBUTTON </font>風格位和檢測框以及按鈕來創建一個三態下壓按鈕。這很容易,只需將檢測框和按鈕拖拉到對話中并指定屬性<fontFACE="Times New Roman">Push</font>—<font FACE="Times New Roman">like</font>即可。不用任何附加程序就可以成為三態下壓按鈕。</font> </p><p><a NAME="tip42"></a><b><font SIZE="+2"><font FACE="Times New Roman">42</font><fontFACE="黑體">、如何動態創建控件</font></font></b> </p><p><font SIZE="+0">分配一個控件對象的實例并調用其<fontFACE="Times New Roman">Create</font>成員函數。開發者最容易忽略兩件事:忘記指定<fontFACE="Times New Roman">WS_VISBLE</font>標簽和在棧中分配控件對象。下例動態地創建一個下壓按鈕控件:</font> </p><p><font SIZE="+0" FACE="Times New Roman">//In class declaration (.H file ).</font> </p><p><font SIZE="+0" FACE="Times New Roman">private :</font> </p><p><font SIZE="+0" FACE="Times New Roman">CButton* m _pButton ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">//In class implementation (.cpp file ) .</font> </p><p><font SIZE="+0" FACE="Times New Roman">m_pButton =new CButton ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">ASSERT_VALID (m_pButton);</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">m_pButton </font>—<fontFACE="Times New Roman">>Create (_T ("Button Title ") , WS_CHILD </font>|<fontFACE="Times New Roman">WS_VISIBLE </font>|<font FACE="Times New Roman">BS_PUSHBUTTON.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">Crect ( 0, 0, 100 , 24) , this , IDC _MYBUTTON )</font> </p><p><a NAME="tip43"></a><b><font SIZE="+2"><font FACE="Times New Roman">43</font><fontFACE="黑體">、如何限制編輯框中的準許字符</font></font></b> </p><p><font SIZE="+0">如果用戶在編輯控件中只允許接收數字,可以使用一個標準的編輯控件并指定新的創建標志<fontFACE="Times New Roman">ES_NUMBERS,</font>它是<font FACE="Times New Roman">Windows 95</font>新增加的標志,該標志限制 編輯控件只按收數字字符。如果用戶需要復雜的編輯控件,可以使用<fontFACE="Times New Roman">Microsoft </font>的屏蔽編輯控件,它是一個很有用的<fontFACE="Times New Roman">OLE</font>定制控件。</font> </p><p><font SIZE="+0">如果希望不使用<font FACE="Times New Roman">OLE </font>定制控件自己處理字符,可以派生一個<fontFACE="Times New Roman">CEdit </font>類并處理<font FACE="Times New Roman">WM_CHAR</font>消息,然后從編輯控件中過濾出特定的字符。首先,使用<fontFACE="Times New Roman">ClassWizard </font>建立一個 <font FACE="Times New Roman">CEdit</font>的派生類,其次,在對話類中指定一個成員變量將編輯控件分類在<fontFACE="Times New Roman">OnInitdialog </font>中調用<font FACE="Times New Roman">CWnd: : SubclassDlgItem .</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">//In your dialog class declaration (.H file )</font> </p><p><font SIZE="+0" FACE="Times New Roman">private :</font> </p><p><font SIZE="+0" FACE="Times New Roman">CMyEdit m_wndEdit ; // Instance of your new edit control .</font> </p><p><font SIZE="+0" FACE="Times New Roman">//In you dialog class implementation (.CPP file )</font> </p><p><font SIZE="+0" FACE="Times New Roman">BOOL CSampleDialog : : OnInitDialog ( )</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Subclass the edit lontrod .</font> </p><p><font SIZE="+0" FACE="Times New Roman">m_wndEdit .SubclassDlgItem (IDC_EDIT,this );</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">使用<font FACE="Times New Roman">ClassWizard</font>處理<fontFACE="Times New Roman">WM_CHAR</font>消息,計算<font FACE="Times New Roman">nChar</font>參量并決定所執行的操作,用戶可以確定是否修改、傳送字符。下例說明了如何顯示字母字符,如果字符是字母字符,則調用<fontFACE="Times New Roman">CWnd ; OnChar</font>,否則不調用<font FACE="Times New Roman">OnChar.</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">//Only display alphabetic dharacters .</font> </p><p><font SIZE="+0" FACE="Times New Roman">void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Determine if nChar is an alphabetic character .</font> </p><p><font SIZE="+0" FACE="Times New Roman">if (: : IsCharAlpha ( ( TCHAR) nChar ) )</font> </p><p><font SIZE="+0" FACE="Times New Roman">CEdit : : OnChar (nChar, nRepCnt , nFlags );</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">如果要修改字符,則不能僅僅簡單地用修改過的<fontFACE="Times New Roman">nChar</font>調用<font FACE="Times New Roman">CEdit : : OnChar</font>,然后<fontFACE="Times New Roman">CEdit: : OnChar</font>調用<font FACE="Times New Roman">CWnd: : Default</font>獲取原來的<font FACE="Times New Roman">wParam </font>和<fontFACE="Times New Roman">lParam </font>的值 ,這樣是不行的。要修改一個字符,需要首先修改<fontFACE="Times New Roman">nChar</font>,然后用修改過的<font FACE="Times New Roman">nChar</font>調用<fontFACE="Times New Roman">CWnd: : DefWindowProc</font>。下例說明了如何將字符轉變為大寫:</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Make all characters uppercase</font> </p><p><font SIZE="+0" FACE="Times New Roman">void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Make sure character is uppercase .</font> </p><p><font SIZE="+0" FACE="Times New Roman">if (: : IsCharAlpha ( .( TCHAR) nChar)</font> </p><p><font SIZE="+0" FACE="Times New Roman">nChar=: : CharUpper (nChar ) ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Bypass default OnChar processing and directly call</font> </p><p><font SIZE="+0" FACE="Times New Roman">//default window proc.</font> </p><p><font SIZE="+0" FACE="Times New Roman">DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt , nFlags )) ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><a NAME="tip44"></a><b><font SIZE="+2"><font FACE="Times New Roman">44</font><fontFACE="黑體">、如何改變控件的顏色</font></font></b> </p><p><font SIZE="+0">有兩種方法。其一,可以在父類中指定控件的顏色,或者利用<fontFACE="Times New Roman">MFC4.0</font>新的消息反射在控件類中指定顏色。當控件需要重新著色時,工作框調用父窗口(通常是對話框)的<fontFACE="Times New Roman">CWnd: : OnCrtlColor,</font>可以在父窗口類中重置該函數并指定控件的新的繪畫屬性。例如,下述代碼將對話中的所有編輯控件文本顏色改為紅色:</font> </p><p><font SIZE="+0" FACE="Times New Roman">HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor );</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Draw red text for all edit controls .</font> </p><p><font SIZE="+0" FACE="Times New Roman">if (nCtlColor= = CTLCOLOR_EDIT )</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">pDC </font>—<font FACE="Times New Roman">> SetTextColor (RGB (255 , 0 , 0 , ) ) ;</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">return hbr ;</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">然而,由于每個父窗口必須處理通知消息并指定每個控件的繪畫屬性,所以,這種方法不是完全的面向對象的方法。控件處理該消息并指定繪畫屬性更合情合理。消息反射允許用戶這樣做。通知消息首先發送給父窗口,如果父窗口沒有處理則發送給控件。創建一個定制彩色列表框控件必須遵循下述步驟。</font> </p><p><font SIZE="+0">首先,使用<font FACE="Times New Roman">ClassWizard </font>創建一個<fontFACE="Times New Roman">CListBox </font>的派生類并為該類添加下述數據成員。</font> </p><p><font SIZE="+0" FACE="Times New Roman">class CMyListBox ; publilc CListBox</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">private;</font> </p><p><font SIZE="+0" FACE="Times New Roman">COLORREF m_clrFor ; // foreground color</font> </p><p><font SIZE="+0" FACE="Times New Roman">COLORREF m_clrBack ; //background color</font> </p><p><font SIZE="+0" FACE="Times New Roman">Cbrush m_brush ; //background brush</font> </p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -