📄 08.2.3 向导的创建8.3 本章小结.txt
字号:
// TODO : add construction code here
m_ iOccupation=-1 ;
m_ strWorkAddr= "";
memset(m_ bLike , O, sizeof(m_bLike)) ;
m_strSalary= " " ;
例8-19所示代码中使用C语言的memset函数对m bLike数组进行快速初始化,该函数的声明原型如下所示:
void *memset( void *dest , int c , size_t count );
该函数的功能是把dest参数指定的内存中前count个字节设置为字符:c。它有三个参数,其含义分别如下所述:
. dest
指向将被赋值的目标内存。
. c
设置的字符值。
. count
设置的字节数。
在 C/C++语言中,非 O值即为真 (TRUE ) , 0值即为假 ( FALSE)。并且对数组来说,数组名就是它的首地址,数组大小可以利用 sizeof函数来获取。因此,可以用 O值设置数组 m bLike指向的内存缓存,从而将它的元素都设置为 FALSE o
接下来,就要在视类窗口把用户在向导中的选择输出到窗口中。但有一点需要注意 :只有用户单击【完成】按钮关闭向导后,才输入用户的选择:如果用户单击的是【取消】按钮,即放弃当前所作的选择,程序就不应该输出用户的选择。一般情况下, CProper句Sheet类的 DoModal函数的返回值是 IDOK或 IDCANCEL。但是如果属性表单已经被创建为向导了,那么该函数的返回值将是 ID_WIZFINISH或 IDCANCEL。因此,在程序中应该对属性表单对象的 DoModal函数的返回值进行判断,如果返回的是完成按钮的ID : ID WIZFINISH,那么才进行输出处理。
这里,有一点需要注意,当 DoModal函数返回后,属性表单窗口就被销毁了,但 propSheet这个属性表单对象的生命周期井没有结束。因此,仍然可以利用这个对象去访问它的内部成员。这里又一次提到窗口和对象的关系,希望读者一定要记住它们并不是同一个事物。接收用户在向导中所作选择的程序代码如例 8-20所示。
例 8-20
void CPropView : : OnPropertysheet()
11 TODO : Add your command handler code here
CPropSheet propSheet( "属性表单 " ) ;
propSheet . SetWi zardMode () ;
if(ID_WIZFINISH==propSheet . DoModal ())
{
m_iOccupation=propSheet . m_prop1 . m_occupation ;
m_strWorkAddr=propSheet . m-prop1 . m_workAddr;
m_bLike [0] =propSheet.m-prop2 .m_football;
m_bLike[1]=propSheet .m-prop2 . m_basketball;
m_bLike[2]=propSheet.m-pr op2 .m_volleyball ;
m_bLike [3] =propSheet .m-prop2 . m_swim;
m_strSalary=propSheet .m-prop3.m_strSalary ;
Invalidate();
}
当获取到用户所做的选择后,就可以在视类窗口中显示它们。因此,在上述代码的最后,调用了一条 Invalidate函数,让视类窗口无效,从而引起重绘操作。然后,就可以在视类的 OnDraw函数中完成这些信息的输出,具体的程序代码如例 8 -21所示。
例 8-2 1
void CPropView : : ünDraw(CDC * pDC)
{
CPropDoc* pDoc = GetDocument() ;
ASSERT_VALID(pDoc) ;
11 TODO : add draw code for native data here
CFont font ;
font.CreatePointFont (300 , "华文行楷" ) ;
CFont *pOldFont;
pOldFont=pDC->SelectObject(&font) ;
CString strTemp;
strTemp="你的职业z";
switch(m_iOccupation)
case 0:
strTemp+="程序员";
break;
case 1:
strTemp+="系统工程师";
break;
case 2:
strtemp+="项目经理";
break;
default:
break;
}
pDC->TextOut(0 , 0, strTemp);
strTemp="你的工作地点 是";
strTemp+=m_;
TEXTMETRIC tm; pDC->GetTextMetrics(&tm) ; pDC->TextOut(O , tm.tmHeight , strTemp);
strTemp="你的兴趣爱好:";
if(m_bLike [0] )
strTemp+="足球";
}
if (m_bLike [1] )
strTemp+="篮球";
if(m_bLike [2] )
strTemp+="排球";
}
if(m_bLike [3] )
strTemp+="游泳";
" I 305
第8
对话框(二)
}
pDC->TextOut(Q , trn . t mHeight*2 , strTernp) ;
s t r 'I'ernp= "你的薪资水平 :
strTernp+=rn_strSalary ;
pDC-> Text Ou t(Q, trn . tmHe工 ght*3, strTemp) ;
pDC->SelectObject(pOldFont) ;
在上述例 8-21所示代码中,先构造了一种字体 (构造方法可参见前面第五章的相关内容),井调用 SelectObject函数将其选入当前设备描述表中。接着,利用 switch/case语句判断用户选择的职业类型,并在视类窗口的 ( 0,0)位置处显示相应的职业字符串。
接下来,在窗口中输出用户选择的工作地点。当然这时不能在 ( 0,0 )处显示了,应该在上一行文旱的下一行输出,因此调用 GetTextMetrics函数得到当前文本的高度,然后以此高度作为输出开始点的 y坐标,显示工作地点字符串。
接着,程序判断用户选择了哪些爱好。由于爱好是可以多选的,为了在提示信息中清晰地看到各种爱好,所以在各爱好文本之间用空格加以分隔。并且应在上述两行文字的下一行输出爱好字符串,即输出函数 TextOut的 y坐标应是 tm.tn旧eight吃。
最后,在窗口中输出用户选择的薪资水平,并且应在上述三行文字的下一行输出,所以输出函数 TextOut的 y坐标应是 tm.tmHeight*3 o代码的最后,再次调用 SelectObject函数恢复设备描述表中先前的字体。
注意:虽然在上述代码中, sw灿am吾句块最后的灿ult子句什么也没
有做,但应该养成良好的编程习惯,添加上这条子句。
Build并运行Prop程序,初始界面如图 8川所示。
图 8 .7 1显示用户所作选择的初始程序界面
单击【属性表单】菜单项,将显示向导的第一个页面,用户需要选择职业和工作地点,例如分别选择"系统工程师"和"上海",如图 8.72所示。
图 8.73向导的第二页
单击如图8.73所示属性页上的【下一步】按钮,进入向导的最后一页,用户需要选择薪资水平,例如选择 "3000元以上"选项,如图8.74所示。
图 8.74向导的第三页
单击如图8.74所示属性页上的【完成】按钮,该向导将被关闭,并在视类窗口中显示出刚才我们在向导窗口中所做的选择,如图8.75所示。
图 8.75在视窗口中显示用户在向导中所作的选择
小结
本章在上一章的基础上,进一步讲解了对话框用户界面程序的编写,主要包括:"逃跑"按钮的巧妙实现,以及属性表单和向导的创建。其中,融合讲解了组合框 (如何调整组合框的大小)、列表框、单选按钮、复选框等常用对话框控件的使用方法,以及在视类中获取属性页上用户所选择的数据并显示的方法,另外,还介绍了只有在满足设定的条件下才能进入向导的下一个属性页的实现方法。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -