友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第39部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
2。 从中单击Import按钮,从位图文件Clickhere。bmp中输入
资源。注意在文件类型中选择 “All files (*。*)”。
Developer Studio将弹出如图6。24所示的警告对话框。该对
话框表明位图资源已被正确添加。但由于使用了多于256色的
颜 色数,因此该资源不可以在资源编辑器中打开。
图6。 24 试图添加使用了多于256色的位图资源时的警告消息框
3。 按正常的方法将所添加的位图资源的ID修改为
IDB_CLICKHERE。必要时重新编辑资源文件或工程。
6。3。2 位图按钮
位图按钮是由MFC提供的几种附加控件之一。在前一节的过程中,我
们可以使用一个位图来代替文本作为下压按钮的标签。而在位图按钮
中,我们可以使用多达四个位图来分别代表按钮处于四种不同的状态
(凸起、按下、获得焦点或被禁止)下的显示。而且,使用位图按钮还
可以去除掉令人讨厌的按钮黑边。而使用位图按钮并不复杂,但是相
比起标准的按钮控件 (它由Windows 自身所提供)而言有一些特殊。下
面的过程描述了位图按钮的使用,它们在MFC中使用类CBitmapButton
封装。
1。 使用AppWizard创建新的基于对话框的MFC工程BitmapButton。
2。 使用资源编辑器绘制一个标准按钮,将其ID设为IDC_CLICKHERE,
标题文本设为CLICKHERE,然后在Styles选项卡中将Owner draw属性
…………………………………………………………Page 326……………………………………………………………
设置为真。
3。 向工程中添加四个位图资源。
〃CLICKHEREU〃 〃CLICKHERED〃 〃CLICKHEREF〃 〃CLICKHEREX〃
图6。 25 位图按钮IDC_CLICKHERE所使用的四个位图资源
所添加的四个位图资源的ID的设置取决于在第一步中的标题文本的设
置:按钮未按下去时使用的位图添加了后缀〃U〃;按钮按下去时使用
的位图添加了后缀〃D〃;按钮拥有焦点时使用的位图添加了后缀〃F〃;
按钮被禁止时使用的位图添加了后缀〃X〃。需要注意的是,由于这些
位图资源的ID为字符串,因此在使用属性对话框设置其ID时一定要加
了双引号,否则资源编辑器会将该ID值看作代表一个整型量的符号。
4。 在对话框类CBitmapButtonDlg(这里我们沿用上一节中的示例程
序)中添加类型为CBitmapButton的新的成员变量m_bnClickhere。
5。 在OnInitDialog成员函数中的return语句前添加下面的代码:
m_bnClickhere。AutoLoad(IDC_CLICKHERE; this);
CRect rect1;rect2;
CButton *pClickhere=(CButton*)GetDlgItem(IDC_CLICKHERE);
GetClientRect(&rect1);
pClickhere…》GetWindowRect(&rect2);
ScreenToClient(&rect2);
pClickhere…》MoveWindow(rect2。left;(rect1。Height()…rect2。Height())/2;
rect2。Width();rect2。Height());
其中第一个参数IDC_CLICKHERE是位图按钮的资源ID,第二个参数为
指向该位图按钮的父窗口的CWnd对象的指针,这里即类
CBitmapButtonDlg的this指针。类CBitmapButton的成员函数
AutoLoad完成以下几步工作:
(1) 将按钮与CBitmapButton对象相关联;
…………………………………………………………Page 327……………………………………………………………
(2) 自动加载按钮所使用的位图,条件是这些位图资源满足步骤2中
的命名约定;
(3) 自动改变控件的大小以适合所加载的位图资源。
接下来的几行代码将位图按钮在对话框中进行垂直居中。首先类CWnd
的成员函数GetClientRect返回了对话框的客户区矩形,接着,类
CWnd的成员函数GetWindowRect返回了控件IDC_CLICKHERE的窗口矩
形,然后使用类CWnd的成员函数ScreenToClient将rect2由屏幕坐标
转换为对话框的客户坐标,这是因为类CWnd的成员函数MoveWindow在
移动子窗口时将使用父窗口的客户区坐标,而不是使用屏幕坐标。
6。 按图6。26添加下面的下压按钮IDC_DISABLE,将其标题设置为 “禁
止使用 (&X)”。
图6。 26 位图按钮示例程序对话框的设计
7。 将所有下压按钮的Tab stop属性 (位于General选项卡中)设置为
真。并按图6。26调整各控件的大小位置。其中按钮CLICKHERE的大小
的无关紧要的,我们只需要保证对话框左边是否有足够的空间来显示
按钮所使用的位图即可。
8。 为按钮IDC_DISABLE的BN_CLICKED命令编写下面的命令处理函数:
void CBitmapButtonDlg::OnDisable()
{
CButton *pClickhere=(CButton*)GetDlgItem(IDC_CLICKHERE);
static int bIsEnabled=pClickhere…》IsWindowEnabled();
if (bIsEnabled)
{
pClickhere…》EnableWindow(FALSE);
SetDlgItemText(IDC_DISABLE;〃允许使用 (&E)〃);
}
…………………………………………………………Page 328……………………………………………………………
else
{
pClickhere…》EnableWindow(TRUE);
SetDlgItemText(IDC_DISABLE;〃禁止使用 (&X)〃);
}
bIsEnabled=!bIsEnabled;
}
上面的代码实现两个功能,即当位图按钮的状态为允许时,单击按钮
IDC_DISABLE将其状态设置为不允许;在相反的状态下,单击按钮
IDC_DISABLE将其状态设置为允许。由于实现该过程的代码比较简
单,因此我们在这里不作详细的讲述。
编译并运行上面的示例程序,其结果如图6。27所示。
反复单击位图按钮和禁止使用按钮,以观察位图按钮在不同状态下的
外观的改变。还可以使用TAB键改变按钮的输入焦点,以观察位图按
钮获得输入焦点和失去输入焦点时的不同外观。
图6。 27 位图按钮示例程序
6。3。3 组框
组框也是一种按钮控件。它常常用来在视觉上将控件 (典型情况下是
一系列的单选钮和复选框)进行分组,从而使对话框中的各个控件看
起来比较有条理。
图6。 28 组框 (Group box)控件
相对于其它控件来说,组框的使用非常之简单。这里我们需要强调的
…………………………………………………………Page 329……………………………………………………………
是,组框仅仅是在视觉上将控件进行分组,事实上控件在编程上的分
组依赖于其Group属性的设置。
组框也可以发送BN_CLICKED和BN_DOUBLECLICKED命令消息。但是在般
情况下我们都不对这些命令作响应。此外,组框也可以设置Icon或
Bitmap属性 (注意它们之间的互斥的),即我们可以使用图标或位图来
代替默认情况下的文本。但是在绝大多数情况下,我们仅使用纯文本
来作为组框的标题。
与前面讲述的下压按钮类似,我们同样可以使用SetDlgItemText成员
函数来设置组框控件的标题文本。此外,我们还可以使用GetDlgItem
来获得与组框控件相关联的CWnd对象的指针,然后通过该指针调用成
员函数SetWindowText来实现同样的功能。由于在程序中常常不需要
频繁的操纵组框控件,因此大多数情况下我们不需要为组框控件进行
成员变量的映射,但这种方法是完全可以的。
对于如何将控件进行分组的方法在讲述单选钮和复选框时再作介绍。
6。3。4 单选钮
图6。 29 单选钮示例程序
单选钮用来表示一系列的互斥选项,这些互斥选项常常被分成若干个
组。下面的示例程序说明了单选钮的使用。
1。 创建新的基于对话框的MFC应用程序,将工程名设置为
RadioButton。
2。 按图6。29绘制应用程序的主对话框。其中在Control工具箱中单选
钮对应的图标是 ,组框控件对应的图标是 。
3。 单击Layout菜单下的Tab Order命令,按图6。30的顺序单击各控件
以设置控件的TAB键顺序 (Tab Order)。
4。 确信所有控件的Group属性都被设置为假。分别单击组框 “性别”
和组框 “年龄”,将其Group属性设置为真。
…………………………………………………………Page 330……………………………………………………………
图6。 30 设置控件的Tab Order
以Tab Order为序,从Group属性为真的控件开始 (包括该控件),到下
一个Group属性的真的控件结束 (不包括该控件),所有的这些控件将
组成一个组。对于单选钮,同一组内同时只能有(也应该有)一个处于
被选中的状态。当其中一个控件被置于选中状态时,同组的其它单选
钮应该清除其选中状态。对于由资源编辑器生成的单选钮控件,在默
认情况由Windows 自动处理同组控件之间的互斥关系。
下面我们简述一下特定于单选钮的一些属性及其含义,这些属性被列
于Styles选项卡内:
Auto: 在具有Auto属性的情况下,当用户单击了同
一组的某个单选钮时,其余单选钮的选中属
性被自动清除。当在一组单选钮中使用
Dialog Data Exchange时,该属性必须被设
置为True。类型:布尔值 默认值:真
Left 将单选钮的标题文本显示于圆形标记的左
text: 边。类型:布尔值 默认值:假
Push 使一个复选框、三态复选框或单选项具有类
like: 似于下压按钮的外观和行为。该按钮在选中
时显示为凸起,在不被选中时显示为凹下(参
见图。类型:布尔值 默认值:假
Notify: 决定在默认情况下当单选钮被单击或双击时
向父窗口发送通知消息。类型:布尔值 默认
值:真
图6。 31 具有Pusk…like样式的单选钮
…………………………………………………………Page 331……………………………………………………………
5。 将性别框内的两个控件的ID按从上到下的顺序设置为IDC_SEX1和
IDC_SEX2;将年龄框内的两个控件的ID按从上到下的顺序设置为
IDC_AGE1、IDC_AGE2、IDC_AGE3、IDC_AGE4和IDC_AGE5。
在程序运行时可以调用CButton的成员函数SetCheck设置单选钮的选
中状态。该成员函数带有一个类型为整型的参数,该参数为0表示清
除选中按钮的选中状态,参数为1表示设置选中按钮的选中状态。
l 注意:
l 如果我们在程序中调用SetCheck设置同一组中某一单选钮的为选
中状态,并不意味着同时清除同一组中其它单选钮的选中状态。
以前面创建的工程来举例,请看下面的两行代码 :
l ((CButton*)GetDlgItem(IDC_AGE1))…》SetCheck(1);
l ((CButton*)GetDlgItem(IDC_AGE5))…》SetCheck(1);
上面的代码将导致年龄组中的第一个按钮和第五个按钮在对
话框第一次显示时同时处于选中状态。这是应该避免的。因
此,如果我们通过代码改变了单选钮的选中状态,一定要记
得同时清除同组的其它单选钮的选中状态。
对于单个的单选钮,我们可以调用类CButton的成员函数GetCheck,
该函数的返回值为0、1或2,分别代表按钮处理未选中状态、选中状
态或中间状态 (对三态复选框而言)。但是,对于对话框中的单选锯而
言,我们更感兴趣于同一组单选钮中哪一个被选中,因此,调用类
CWnd的成员函数GetCheckedRadioButton要更为方便。该成员函数原
型如下:
int GetCheckedRadioButton( int nIDFirstButton; int nIDLastButton );
第一个参数nIDFirstButton是同一组中的第一个单选钮控件的ID,
nIDLastButton是同一组中最后一个单选钮控件的ID。成员函数
GetCheckedRadioButton返回指定组中第一个所选中的单选钮 (在正常
情况下仅应当有一个单钮被选中)的ID,如果没有按钮被选中,则返
回0。
这里需要注意的是,成员函数GetCheckedRadioButton被没有要求两
个参数nIDFirstButton和nIDLastButton所指定的控件一定位于同一
组中。
…………………………………………………………Page 332……………………………………………………………
l 注意:
l 若干个单选钮是否属于同一组是以其Tab顺序来排定的,而
GetCheckedRadioButton函数是以ID顺序来检查按钮的选定状态
的。因此,如果传递给函数GetCheckedRadioButton的第一个参数
的值大于第二个参数的值时,其返回值总是为0,而事实上,由这
两个参数指定的单选钮的TAB顺序可能恰恰相反。因此,一般情况
下我们应该尽量保证同一组单选钮的资源ID是连续递增的。通常
这些资源ID是在头文件Resource。h中定义的。如果你同一组的单
选钮不是一次创建的,那么它们的资源ID可能不是连续递增的,
甚至可能是相反的。这时我们可以手动的修改资源头文件中的宏
定义,以保证如GetCheckedRadioButton之类的成员函数得到正确
的结果。
同时,这也说明一点,即使用GetCheck一个一个控件的检查
各单选钮的选中状态要安全得多。
下面我们来完成应用程序RadioButton 。
首先,使用ClassWizard重载类CDialog的OnOK成员函数,方法是重载
ID为IDOK的按钮的BN_CLICKED命令处理函数。由ClassWizard生成的
默认重载形式如
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!