📄 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 + -