Visual C++实践指导教程习题答案.docx
《Visual C++实践指导教程习题答案.docx》由会员分享,可在线阅读,更多相关《Visual C++实践指导教程习题答案.docx(101页珍藏版)》请在冰点文库上搜索。
VisualC++实践指导教程习题答案
《VisualC++实践指导教程》
习题答案
目录
第1章3
1.3
2.3
第2章5
1.5
2.5
3.6
4.7
5.7
6.9
7.9
第3章11
1.11
2.11
3.12
4.12
5.13
6.14
第4章15
1.15
2.16
3.17
4.18
5.19
第5章21
1.21
2.22
3.23
4.25
5.26
6.27
第6章30
1.30
2.32
3.33
4.35
5.36
第7章39
1.39
2.41
3.43
4.45
5.47
6.50
第8章51
1.51
2.51
3.52
4.53
5.55
6.58
第9章60
1.60
2.64
3.67
第1章
1.
(1)实践结果
(2)控件属性表
无
(3)程序源代码
voidCMdHelloView:
:
OnDraw(CDC*pDC)
{
CMdHelloDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
pDC->TextOut(50,50,"HelloWorld!
");
}
2.
(1)实践结果
(2)控件属性表
控件类型
控件名
ID
类型
成员
Label
Label1
IDC_STATIC
(3)程序源代码
BOOLCDlgHelloDlg:
:
OnInitDialog()
{
……
//TODO:
Addextrainitializationhere
this->SetDlgItemText(IDC_STATIC,"这是一个对话框程序");
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
(4)说明
在此程序中使用了一个常用函数BOOLSetDlgItemText(intnID,LPCTSTRlpszString),该函数实现了通过控件的ID号(nID)设置控件的显示文本(lpszString)。
与此对应的还有
UINTGetDlgItemText(intnID,LPTSTRlpStr,intnMaxCount)const
BOOLGetDlgItemText(intnID,BSTR&bstrText)const
详见MSDN
第2章
1.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
略
(4)说明
参见实践1(创建菜单)中创建菜单的方法,为程序菜单添加“格式”菜单项,并在其下添加子菜单项,分别为“自动换行”和“字体”,ID号分别为“IDC_AUTOLINE”和“IDC_FONT”。
控件类型
控件名
ID
类型
成员
Label
Label1
IDC_STATIC
2.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
1)参照练习1的方法添加在“文件”菜单项下添加“显示”子菜单项。
2)为“显示”子菜单项添加事件处理函数OnShow()。
3)添加源代码
voidCMainFrame:
:
OnShow()
{
//TODO:
Addyourcommandhandlercodehere
CDC*pDC=this->GetDC();
pDC->TextOut(50,50,"学习菜单处理程序");
}
(4)说明
绘图时,必须先获得设备环境,即CDC。
在此程序中使用函数GetDC()获得设备环境指针。
3.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
参照教材实践3(增加快捷键和加速键)
1)将子菜单项“显示”的标题按钮修改为“显示(&D)”;
2)打开加速键编辑器,将对应菜单项的KEY修改为D。
(4)说明
略
4.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
voidCMenuCreateView:
:
OnAddItem()
{
CWnd*pParent=GetParent();
CMenu*pMenu=pParent->GetMenu();
CMenu*subMenu=pMenu->GetSubMenu
(1);
subMenu->AppendMenu(MF_STRING|MF_ENABLED,3000,"新菜单项");
}
(4)说明
添加新菜单项与为该菜单项添加事件响应函数的方法见上例。
动态添加菜单项的步骤:
首先定位待添加的菜单项,GetParent()函数用于获得当前窗体,pParent->GetMenu()与pMenu->GetSubMenu
(1)用于获得当前窗体的菜单及待添加菜单项,AppendMenu(…)用于执行自动添加菜单项的动作。
5.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
1)添加消息映射,在视类中的消息映射宏中添加消息映射,添加代码显示如下:
BEGIN_MESSAGE_MAP(CMenuCreateView,CView)
……
ON_COMMAND(3000,OnMyMenuItem)
END_MESSAGE_MAP()
2)添加响应函数
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CMenuCreateView)
public:
……
protected:
……
afx_msgvoidOnMyMenuItem();
//}}AFX_VIRTUAL
3)定义一个字符串,并在构造函数中初始化
定义:
classCMenuCreateView:
publicCView
{
private:
CStringstr;
……
初始化:
CMenuCreateView:
:
CMenuCreateView()
{
//TODO:
addconstructioncodehere
str="";
}
4)实现响应函数
voidCInsertItemView:
:
OnMyMenuItem()
{
str="你选中了新添加的菜单项";
Invalidate();
}
5)绘图
voidCMenuCreateView:
:
OnDraw(CDC*pDC)
{
CMenuCreateDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
pDC->TextOut(20,20,str);
}
(4)说明
动态添加菜单项处理时,须定义菜单项消息与响应函数之间的映射关系。
此处通过ON_COMMAND(3000,OnMyMenuItem)来实现。
6.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
在MainFrm.cpp的新函数OnCreate()中加入如下代码:
if(!
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate
}
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
(4)说明
关于此源代码中各函数的功能详见教材实践五“程序分析与注意事项”。
7.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
1)新建工程CustomToolbar,按教材实践7步骤一初始化,修改字串表中的AFX_IDS_IDLEMESSAGE的标题为“XXX公司:
版权所有”。
2)在MailFrame中定义状态栏
classCMainFrame:
publicCFrameWnd
{
private:
CStatusBarm_wndStatusBar;
……
}
3)定义状态栏数组
staticUINTindicators[]=
{
ID_SEPARATOR,//statuslineindicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
4)添加自动创建状态栏代码
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
……
if(!
m_wndStatusBar.Create(this)||
!
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failedtocreatestatusbar\n");
return-1;//failtocreate
}
return0;
}
(4)说明
1)staticUINTindicators[]定义一个由标准命令ID组成的数组。
•ID_SEPARATOR:
指示在状态栏中生成一个空格。
•ID_INDICATOR_CAPS:
大写键锁定指示。
•ID_INDICATOR_NUM:
数字键锁定指示。
•ID_INDICATOR_SCRL:
滚动键锁定指示。
2)状态栏类的Create函数创建一个状态栏对象,函数SetIndicators设置状态栏的显示内容。
第3章
1.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
打开资源编辑器,选中对话框IDD_ABOUTBOX,右击对话框上的两个静态文本框(IDC_STATIC),分别修改其标题属性为“简单的记事本程序”和“华北科技学院\nE_mail:
wangyangting@王养廷”。
(4)说明
修改控件标题的方式既可如上所示,直接可视化修改,也可编写代码实现,即函数SetDlgItemText(nID,pzstring)。
2.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
打开资源编辑器,选中菜单IDR_MAINFRAME,在“编辑”下首先添加分隔条子菜单项,然后再添加“查找”子菜单项。
(4)说明
回顾第2章,在添加“查找”子菜单项时,其标题应为“查找(&F)”,即定义快捷键。
3.
(1)实践结果
(2)控件属性表
控件类型
ID
标题
说明
Label
IDC_STATIC
查找目标
Text
IDC_EDIT_CONTEXT
Checkbox
IDC_CHECK_UORL
区分大小写
Radiobox
IDC_RADIO_UP
向上(&U)
Radiobox
IDC_RADIO_DOWN
向下(&D)
Button
IDOK
查找下一个
Button
IDCANCEL
取消
CDialog
IDD_DLG_FIND
查找
对话框整体
(3)程序源代码
打开资源编辑器,选中文件夹Dialog,单击右键,弹出右键菜单后选中“插入Dialog…”,并修改新插入的对话框属性,令其ID为IDD_DLG_FIND,标题为“查找”。
再在对话框其上添加控件并布局。
(4)说明
略
4.
(1)实践结果:
略
(2)控件属性表
略
(3)程序源代码
在对话框资源上单击右键,选中“建立类向导”项,弹出“Addingaclass”对话框,选择“Createanewclass”单选框,确定后将弹出“NewClass”对话框。
在其中输入新类信息,Name中输入“CFingDlg”,确定退出。
(4)说明
也可按快捷键Ctrl+W,要求弹出“类向导对话框”,在“类向导对话框”之前会出现“Addingaclass”对话框,其后的设置与上例完全一样。
5.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
1)为“查找”菜单项定义事件函数,为voidCDialogTestView:
:
OnEditFind()。
2)在其中以模式对话框的方式调用“查找”对话框,代码如下:
voidCDialogTestView:
:
OnEditFind()
{
/*添加非模式对话框*/
CFindDlgfinddlg;
finddlg.DoModal();
}
(4)说明
关于模式对话框,可参考教材第3章实践5。
6.
(1)实践结果
(2)控件属性表
略
(3)程序源代码
1)为“查找”菜单项定义事件函数,为voidCDialogTestView:
:
OnEditFind()。
2)在其中以模式对话框的方式调用“查找”对话框,代码如下:
voidCDialogTestView:
:
OnEditFind()
{
//添加模式对话框//
CFindDlg*dlg=newCFindDlg();
dlg->Create(IDD_DLG_FIND);
dlg->ShowWindow(SW_SHOW);
}
(4)说明
关于非模式对话框,可参考教材第3章实践5。
第4章
1.
(1)实践结果
(2)控件属性表
控件类型
ID
标题
说明
Label
IDC_STATIC
您选择的体形:
Label
IDC_STATIC_RESULT
选择结果
Radiobox
IDC_RADIO_NORMAL
正常
Radiobox
IDC_RADIO_THIN
偏瘦
Radiobox
IDC_RADIO_FAT
偏胖
(3)程序源代码
在3个Radiobox控件上添加单击事件,分别为如下3个函数,并添加代码:
voidCRadioTestDlg:
:
OnRadioFat()
{
UpdateData();
m_strResult="您的体形是:
较胖";
UpdateData(false);
}
voidCRadioTestDlg:
:
OnRadioNormal()
{
UpdateData();
m_strResult="您的体形是:
正常";
UpdateData(false);
}
voidCRadioTestDlg:
:
OnRadioThin()
{
UpdateData();
m_strResult="您的体形是:
较瘦";
UpdateData(false);
}
(4)说明
关于UpdateData函数这里解释一下。
UpdateData函数主要起到控制控件标题显示的作用。
当调用UpdataData(TRUE)的时候,程序会对控件对应的变量值进行刷新,也就是说会把控件中的输入值赋给对应的变量。
而调用UpdataData(FALSE)的时候,程序则会把相应变量的值显示在对应的控件上面。
2.
(1)实践结果
(2)控件属性表
控件类型
ID
标题
类型
成员
Label
IDC_STATIC
请选择特长:
Label
IDC_STATIC_RESULT
显示结果:
CString
m_strResult
Checkbox
IDC_CHECK_ENGLISH
英语
bool
m_bEnglish
Checkbox
IDC_CHECK_SPORTS
体育
bool
m_bSports
Checkbox
IDC_CHECK_ART
文艺
bool
m_bArt
Checkbox
IDC_CHECK_COMPUTER
计算机
bool
m_bComputer
button
IDOK
确定
(3)程序源代码
在“确定“按钮上添加单击事件,添加代码如下:
voidCCheckTestDlg:
:
OnOK()
{
UpdateData();
CStringstr;
str="您的特长为:
";
if(m_bEnglish==true)
{
str=str+"英语";
}
if(m_bArt==true)
{
str=str+"文艺";
}
if(m_bComputer==true)
{
str=str+"计算机";
}
if(m_bSports==true)
{
str=str+"体育";
}
m_strResult=str;
UpdateData(false);
}
(4)说明
在此处关键为Checkbox定义控件类型与成员,与上例RadioBox的用法不尽相同,注意区别。
3.
(1)实践结果
(2)控件属性表
控件类型
ID
标题
类型
成员
Radiobox
IDC_RADIO1
请选择特长:
int
m_nTerm
Radiobox
IDC_RADIO2
显示结果:
Checkbox
IDC_CHECK1
心理学
bool
m_bck1
Checkbox
IDC_CHECK2
外国文学
bool
m_bck2
Checkbox
IDC_CHECK3
管理学
bool
m_bck3
Checkbox
IDC_CHECK4
经济史
bool
m_bck4
Checkbox
IDC_CHECK5
近代史
bool
m_bck5
Checkbox
IDC_CHECK6
社会学
bool
m_bck6
button
IDOK
确定
(3)程序源代码
在“确定“按钮上添加单击事件:
voidCGroupTestDlg:
:
OnOK()
{
//可在其中添加代码执行相应功能
}
(4)说明
注意区别Checkbox与Radiobox在使用时的不同之外,前者可多选,而后者要求在同一组内的控件只可单选。
因此,在使用后者时必须对Radiobox指定分组。
4.
(1)实践结果
(2)控件属性表
控件类型
ID
标题
类型
成员
List
IDC_LIST
control
m_list
text
IDC_EDIT
control
m_edit
button
ID_BUTTON_EDIT
修改
button
ID_BUTTON_DELETE
删除
button
ID_BUTTON_EXIT
退出
(3)程序源代码
初始化列表框代码:
BOOLCListTestDlg:
:
OnInitDialog()
{
……
m_list.AddString("语文");
m_list.AddString("数学");
m_list.AddString("英语");
…….
}
为3个按钮添加事件为:
voidCListTestDlg:
:
OnButtonEdit()
{
CStringstr;
m_edit.GetWindowText(str);
m_list.AddString(str);
m_edit.SetWindowText("");
m_edit.SetFocus();
}
voidCListTestDlg:
:
OnButtonDelete()
{
intst;
st=m_list.GetCurSel();
m_list.DeleteString(st);
}
voidCListTestDlg:
:
OnButtonExit()
{
OnCancel();
}
(4)说明
若想直接在列表框上单击便能选中某项,可在列表框上定义单击事件,读者可自行尝试完成。
5.
(1)实践结果
(2)控件属性表
控件类型
ID
标题
类型
成员
combo
IDC_COMBO
control
m_combo
Cstring
m_strCombo
radiobox
IDC_RADIO_NOT_VILLIAGE
非农户口
control
m_radio
radiobox
IDC_RADIO_VILLIAGE
农业户口
checkbox
IDC_CHECK_JIXIE
机械工程
bool
m_bckjjixie
checkbox
IDC_CHECK_JINGJI
经济管理
bool
m_bckjigji
checkbox
IDC_CHECK_JSJ
计算机技术
bool
m_bckjsj
checkbox
IDC_CHECK_DIANZI
电子技术
bool
m_bckdianzi
Button
ID_BUTTON_SUBMIT
提交
button
ID_BUTTON_EXIT
退出
(3)程序源代码
为提交按钮添加事件处理函数:
voidCComboTestDlg:
:
OnButtonSubmit()
{
CStringm_strProvince;
CStringm_strResidence;
UpdateData(true);
m_strProvince=m_strCombo;
if(m_radio.GetCheck()==1)
m_strResidence="非农业户口";
else
m_strResidence="农业户口";
CStringm_strCource="";
if(this->m_bckdianzi==TRUE)
m_strC