📄 chap6_1.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>6.1 传统控件</title>
</head>
<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="85%" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0"
cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><a
href="../../vc.htm"><span style="text-decoration: none"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></span></a></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="CENTER"></b></font><font
color="#3973DE" FACE="Times New Roman" size="5">6.1 </font><font color="#3973DE" size="5">传统控件</font><font
FACE="Times New Roman" size="5"></p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY"></font><span
style="font-size: 9pt"> 在上一课的表5.1已经列出了Windows的传统控件及其对应的控件类。在这些控件中,读者应该重点掌握命令按钮、选择框、单选按钮、编辑框、列表框和组合框。</span></p>
<b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">.1.1
传统控件的控件通知消息</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 控件通过向父窗口发送控件通知消息来表明发生了某种事件.例如,当用户在按钮上单击鼠标时,按钮控件会向父窗口发送BN_CLICKED消息.传统控件的通知消息实际上是通过WM_COMMAND消息发给父窗口的(滚动条除外),在该消息的wParam中含有通知消息码(如BN_CLICKED)和控件的ID,在lParam中则包含了控件的句柄.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 利用ClassWizard可以很容易地为控件通知消息加入消息映射和消息处理函数,这在上一章中已经演示过了.传统控件的消息映射宏是ON_XXXX,其中XXXX表示通知消息码,如BN_CLICKED.ON_XXXX消息映射如下所示,该宏有两个参数,一个是控件的ID,一个是消息处理函数名.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ON_XXXX(nID, memberFxn)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">消息处理函数的声明应该有如下形式:</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void memberFxn( );</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">例如,某按钮的BN_CLICKED消息的消息映射及其处理函数的声明如下所示</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ON_BN_CLICKED(IDC_ADD,OnAdd)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void OnAdd( );</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 有时,为了处理方便,需要把多个ID连续的控件发出的相同消息映射到同一个处理函数上.这就要用到ON_CONTROL_RANGE宏.ON_CONTROL_RANGE消息映射宏的第一个参数是控件消息码,第二和第三个参数分别指明了一组连续的控件ID中的头一个和最后一个ID,最后一个参数是消息处理函数名。例如,要处理一组单选按钮发出的BN_CLICKED消息,相应的消息映射如下所示:</span></p>
<blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ON_CONTROL_RANGE(BN_CLICKED, IDC_FIRST,
IDC_LAST, OnRadioClicked)</span></p>
</blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">函数OnRadioClicked的声明如下,该函数比上面的OnAdd多了一个参数nID以说明发送通知消息的控件ID.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void OnRadioClicked(UINT nID);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ClassWizard不支持ON_CONTROL_RANGE宏,所以需要手工建立消息映射和消息处理函数.</span></p>
<div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="90%"
bgcolor="#9BCDFF">
<tr>
<td width="100%"><span style="font-size: 9pt">提示:事实上,在使用ClassWizard时只要运用一个小小的技巧,就可以把不同控件的通知消息映射到同一个处理函数上,也可以把一个控件的不同通知消息映射到同一个处理函数上.这个技巧就是在用ClassWizard创建消息处理函数时,指定相同的函数名即可.此方法的优点在于控件的ID不必是连续的,缺点是处理函数没有nID参数,因而不能确定是哪一个控件发送的消息.</span></td>
</tr>
</table>
</center></div><b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font
color="#3973DE">6.1.2 静态控件</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 静态控件包括静态正文(Static
Text)和图片控件(Picture)。静态正文控件用来显示正文。图片控件可以显示位图、图标、方框和图元文件,在图片控件中显示图片的好处是不必操心图片的重绘问题。静态控件不能接收用户的输入。在上一章中,读者已经用过静态正文和组框控件。图片控件的例子可以在AppWizard创建的IDD_ABOUTBOX对话框模板中找到,在该模板中有一个图片控件用来显示图标。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 静态控件的主要起说明和装饰作用。MFC的CStatic类封装了静态控件。CStatic类的成员函数Create负责创建静态控件,该函数的声明为</span></p>
<blockquote>
<blockquote>
<blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">BOOL Create( LPCTSTR lpszText, DWORD
dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );</span></p>
</blockquote>
</blockquote>
</blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 参数lpszText指定了控件显示的正文。dwStyle指定了静态控件的风格,表6.1显示了静态控件的各种风格,dwStyle可将这些风格组合起来。rect是一个对RECT或CRect结构的引用,用来说明控件的位置和尺寸。pParentWnd指向父窗口,该参数不能为NULL。nID则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE.</span><b></p>
<p ALIGN="CENTER"><span style="font-size: 9pt">表6.1 静态控件的风格</span></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
<tr>
<td WIDTH="31%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">控件风格</span></b></td>
<td WIDTH="69%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">含义</span></b></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_BLACKFRAME</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">指定一个具有与窗口边界同色的框(缺省为黑色)。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_BLACKRECT</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">指定一个具有与窗口边界同色的实矩形(缺省为黑色)。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_CENTER</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">使显示的正文居中对齐,正文可以回绕。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_GRAYFRAME</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">指定一个具有与屏幕背景同色的边框。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_GRAYRECT</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">指定一个具有与屏幕背景同色的实矩形。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_ICON</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">使控件显示一个在资源中定义的图标,图标的名字有Create函数的lpszText参数指定。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_LEFT</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">左对齐正文,正文能回绕。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_LEFTNOWORDWRAP</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">左对齐正文,正文不能回绕。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_NOPREFIX</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">使静态正文串中的&不是一个热键提示符。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_NOTIFY</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">使控件能向父窗口发送鼠标事件消息。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_RIGHT</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">右对齐正文,可以回绕。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_SIMPLE</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">使静态正文在运行时不能被改变并使正文显示在单行中。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_USERITEM</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">指定一个用户定义项。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_WHITEFRAME</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">指定一个具有与窗口背景同色的框(缺省为白色)。</span></td>
</tr>
<tr>
<td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SS_WHITERECT</span></td>
<td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">指定一个具有与窗口背景同色的实心矩形(缺省为白色)。</span></td>
</tr>
</table>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 除了上表中的风格外,一般还要为控件指定WS_CHILD和WS_VISIBLE窗口风格。一个典型的静态正文控件的风格为WS_CHILD|WS_VISIBLE|SS_LEFT。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 对于用对话框模板编辑器创建的静态控件,可以在控件的属性对话框中指定表6.1中列出的控件风格。例如,可以在静态正文控件的属性对话框中选择Simple,这相当于指定了SS_SIMPLE风格。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> Cstatic类主要的成员函数在表6.2中列出。可以利用CWnd类的成员函数GetWindowText,SetWindowText和GetWindowTextLength等函数来查询和设置静态控件中显示的正文.</span></p>
<b><p ALIGN="CENTER"><span style="font-size: 9pt">表6.2 CStatic类的主要成员函数</span></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
<tr>
<td WIDTH="50%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">函数声明</span></b></td>
<td WIDTH="50%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用途</span></b></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">HBITMAP SetBitmap( HBITMAP
hBitmap );</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">指定要显示的位图。</span></td>
</tr>
<tr>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -