VisualC++实践指导教程习题.docx
isual C+实践指导教程习题答案目录第1章31 32 3第2章53 54 65 76 77 98 9第3章112 113 124 135 136 14第4章152 163 174 185 20第5章221 222 233 244 26628第6章321 322 343 354 375 39第7章411 412 433 454 475 496 53第8章541 542 543 554 565 586 61第9章641 642 683 711.(1)实践结果(2)控件属性表无(3)程序源代码void CMdHelloView:OnDraw(CDC* pDC)CMdHelloDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC->TextOut(50,50,"Hello World!");2.(1 )实践结果(2)控件属性表控件类型控 件 名ID类型成员LabelLabel 1IDC_STATIC(3)程序源代码BOOLCDlgHclloDlg:OnInitDialog()/ TODO: Add extra initialization herethis->SetDlgItemText(IDC_STATIC,"这是个对话框程序");return TRUE; / return TRUE unless you set the focus to a control)(4)说明在此程序中使用 了一个常用函数 BOOL SetDlgItemText( int nID, LPCTSTR IpszString ), 该函数实现了通过控件的ID号(nlD)设置控件的显示文本(IpszString)与此对应的还有UINT GetDlgItemText( int nlD, LPTSTR IpStr, int nMaxCount) constBOOL GetDlgItemText( int nlD, BSTR& bstrText) const详见MSDN(1)实践结果(2)控件属性表略(3)程序源代码略(4)说明参见实践1 (创建菜单)中创建菜单的方法,为程序菜单添加“格式”菜单项,并在其 下添加子菜单项,分别为“自动换行”和“字体”,ID号分别为“IDC一AUTOLINE”和 “IDC_FONT”。控件类型控 件 名ID哭吧成员LabelLabel 1IDC_STATIC(2)控件属性表 略(3)程序源代码1)参照练习1的方法添加在“文件”菜单项下添加显示"子菜单项。2)为“显示”子菜单项添加事件处理函数OnShow()。3)添加源代码void CMainFrame: :OnShow()/ TODO: Add your command handler code hereCDC *pDC = this->GetDC();pDC->TextOut(50,50,”学习菜单处理程序");)(4)说明绘图时,必须先获得设备环境,即CDC.在此程序中使用函数GetDC()获得设备环境 指针。3.(1)实践结果文件电)编辑9 查-9 帮助国)初建退)Ctrl+N打开 ).Ctrl+0保存)Ctrl+S另存为打EP也)Ctrl+P打EP预览也)打印设置).最近文件退出复)显示(J) Ctrl+D(2)控件属性表略(3)程序源代码参照教材实践3(增加快捷键和加速键)1)将子菜单项“显示”的标题按钮修改为“显示(&D)”;2)打开加速键编辑器,将对应菜单项的KEY修改为D。(4)说明略(1)实践结果(2)控件属性表略(3)程序源代码void CMenuCreateView:OnAddItem()CWnd* pParent = GetParent();CMenu* pMcnu = pParent->GetMenu();CMenu* subMenu = pMenu->GetSubMenu( 1);subMenu->AppendMenu(MF_STRING | MF_ENABLED, 3000,”新菜单项)(4)说明添加新菜单项与为该菜单项添加事件响应函数的方法见上例。动态添加菜单项的步骤:首先定位待添加的菜单项,GetParent。函数用于获得当前窗体, pParent->GetMenu()与pMenu->GetSubMenu(l)用于获得当前窗体的菜单及待添加菜单项, AppcndMenu (,)用于执行自动添加菜单项的动作。(1)实践结果(2)控件属性表略(3)程序源代码1)添加消息映射,在视类中的消息映射宏中添加消息映射,添加代码显示如下: BEGIN_MESSAGE_MAP(CMcnuCreateView,CView)ON_COMMAND(3000, OnMyMcnuItcm)END_MESSAGE_MAP()2)添加响应函数/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMenuCreateView)public:protected:afk msg void OnMyMenuItem(); /AFX_VIRTUAL3)定义个字符串,并在构造函数中初始化定义:class CMenuCreateView : public CViewprivate:CString str;初始化:CMenuCreateView: :CMcnuCreatcView()/TODO: add construction code here4)实现响应函数void CInsertItemView:0nMyMenuItem。str ="你选中了新添加的菜单项”;Invalidate();5)绘图void CMenuCreateView:OnDraw(CDC* pDC)CMenuCreateDoc* pDoc = GetDocument();ASSERT VALID(pDoc);/ TODO: add draw code for native data here pDC->TextOut(20,20, str);)(4)说明动态添加菜单项处理时,须定义菜单项消息与响应函数之间的映射关系。此处通过 ON_COMMAND(3000, OnMyMenuItem)来实现。(1)实践结果(2)控件属性表略(3)程序源代码在MainFrm. cpp的新函数OnCreateO中加入如下代码:if (!m_wndToolBar. CreateEx (this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOPI CBRS一GRIPPER | CBRS TOOLTIPS | CBRS_FLYBY | CBRS_SIZE.DYNAMIC) | !m_wndToolBar. LoadToolBar(1DR_MAINFRAME)TRACE。("Failed to create toolbarn"):return _1;/ fail to create)m_wndToolBar. EnableDocking(CBRS_ALIGN_ANY);Enab1eDock i ng(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);(4)说明关于此源代码中各函数的功能详见教材实践五"程序分析与注意事项”。7.(1)实践结果(2)控件属性表 略(3)程序源代码1 )新建工程CustomToolbar,按教材实践7步骤初始化,修改字串表中的AFXDSDLEMESSAGE的标题为“XXX公司:版权所有”。2)在MailFrame中定义状态栏class CMainFrame : public CFrameWndprivate:CStatusBar mwndStatusBar;3)定义状态栏数组 static UINT indicators= (ID SEPARATOR,/ status line indicatorID_INDICATOR_CAPS, IDJNDICATORNUM, ID_INDICATOR_SCRL, ); 4)添加自动创建状态栏代码 int CMainFrame:OnCreate(LPCREATESTRUCT IpCreateStruct)if (!m_wndStatusBar.Create(this) |! m_wndStatusBar.Set!ndicators(indicators, sizeof(indicators)/sizeofi(UINT) (TRACEO(nFailed to create status barnM);return -1;/ fail to create)return 0;)(4)说明1) static UINT indicators口定义个由标准命令1D组成的数组。 ID SEPARATOR:指示在状态栏中生成一个空格。 ID INDICATOR CAPS:大写键锁定指示。 ID INDICATOR NUM:数字键锁定指示。 ID_INDICATOR_SCRL:滚动键锁定指示。2)状态把类的Create歯数创建一个状态栏对象,函数Setindicators设置状态栏的显示 内容。(1)实践结果(2)控件属性表略(3)程序源代码打开资源编辑器,选中对话框IDD_ABOUTBOX,右击对话框上的两个静态文本框 (IDC_STATIC),分别修改其标题属性为“简单的记事本程序”和“华北科技学院 nE mail:wangyangting 王养廷(4)说明修改控件标题的方式既可如上所示,直接可视化修改,也可编写代码实现,即函数 SetDlgItemText(nID,pzstring) (1)实践结果(2)控件属性表略(3)程序源代码打开资源编辑器,选中菜单IDR一MAINFRAME,在“编辑”下首先添加分隔条子菜单 项,然后再添加“查找”子菜单项。(4)说明回顾第2章,在添加“查找”子菜单项时,其标题应为“查找(&F)”,即定义快捷键。3.(1)实践结果(2)控件属性表控件类 型ID标题说明LabelIDC_STATIC查找目标TextIDC_EDIT_CONTEXTCheckboxIDC_CHECK_UORL区分大小写RadioboxIDC_RADIO_UP向上(&U)RadioboxIDC_RADIO_DOWN向下(&D)ButtonIDOK查找下个ButtonIDCANCEL取消CDialogIDD_DLG_FIND查找对话框整体(3)程序源代码打开资源编辑器,选中文件夹Dialog.单击右键,弹出右犍菜单后选中“插入Dialog”, 并修改新插入的对话框属性,令其ID为IDD.DLG-FIND,标题为“查找再在对话框其 上添加控件并布局。(4)说明略(1)实践结果:略(2)控件属性表略(3)程序源代码在对话框资源上单击右键,选中“建立类向导”项,弹出“Adding a class”对话框,选 择“Create a new class”单选框,确定后将弹出“New Class”对话框。在其中输入新类信息, Name中输入“ CFingDlg”,确定退出。(4)说明也可按快捷键Ctrl+W,要求弹出“类向导对话框”,在“类向导对话框”之前会出现 “Adding a class”对话框,其后的设置与上例完全样。(1)实践结果(2)控件属性表略(3)程序源代码1)为“查找”菜单项定义事件函数,为void CDialogTestView:OnEditFind()。2)在其中以模式对话框的方式调用“查找”对话框,代码如下:void CDialogTestView:OnEditFind()/添力口非模式対话框/CFindDlg finddig;finddlg.DoModal();(4)说明关于模式对话框,可参考教材第3章实践5。6.(1)实践结果(2)控件属性表略(3)程序源代码1)为"查找”菜单项定义事件函数,为void CDialogTestView:OnEditFind()。2)在其中以模式对话框的方式调用“査找”对话框,代码如下:void CDialogTestView:OnEditFind()(添加模式对话框CFindDlg *dlg = new CFindDlgO;dlg->Create(IDD_DLG_FIND);dlg->ShowWindow(SW_SHOW);)(4)说明关于非模式对话框,可参考教材第3章实践5。(1 )实践结果(2)控件属性表控件类型ID标题说明LabelIDC_STATIC您选择的体形:LabelIDC_STATIC_RESULT选择结果RadioboxIDC_RADIO_NORMAL正常RadioboxIDC_RADIO_THIN偏瘦RadioboxIDC_RADIO_FAT偏胖(3)程序源代码在3个Radiobox控件上添加单击事件,分别为如下3个函数,并添加代码: void CRadioTestDlg:OnRadioFat()UpdateData();m_strResu仁“您的体形是:较胖”;UpdateData( false);void CRadioTestDlg:OnRadioNonnal()UpdateData();m_strResult="您的体形是:正常”;UpdateData( false);void CRadioTestDlg:OnRadioThin()UpdateData();m_strResult="您的体形是:较瘦”;UpdateData( false);(4)说明关于UpdateData函数这里解释一下。UpdateData函数主要起到控制控件标题显示的作用。 当调用UpdataData(TRUE)的时候,程序会对控件对应的变量值进行刷新,也就是说会把控 件中的输入值赋给对应的变量。而调用UpdataData(FALSE)的时候,程序则会把相应变量的 值显示在对应的控件上面。2.(1)实践结果(2)控件属性表控件类型ID标题类型成员LabelIDC_STATIC请选择特长:LabelIDC_STATIC_RESULT显示结果:CStringmstrResultCheckboxIDC_CHECK_ENGLISH奨语boolmbEnglishCheckboxIDC_CHECK_SPORTS体育boolmbSportsCheckboxIDC_CHECK_ART文艺boolmbArtCheckboxIDC_CHECK_COMPUTER计算机boolmbComputerbuttonIDOK确定(3)程序源代码在“确定“按钮上添加单击事件,添加代码如下: void CCheckTestDlg:OnOK()UpdateData();CString str;str ="您的特长为:二 if (m_bEnglish=true)str = str+"英语"if (m_bArt=true)str = stH-"文艺";if (m_bComputer=true)(str = stri-"计算机";)if (m_bSports=true)str = str+"体育";)m_strResult=str;UpdateData( false);)(4)说明在此处关键为Checkbox定义控件类型与成员,与上例RadioBox的用法不尽相同,注 意区别。3.(1)实践结果(2)控件属性表控件类型ID标题类型成员RadioboxIDC_RADIO1请选择特长:intmnTermRadioboxIDC_RADIO2显示结果:CheckboxIDC_CHECK1心理学boolmbcklCheckboxIDC_CHECK2外国文学boolm_bck2CheckboxIDC_CHECK3管理学boolm_bck3CheckboxIDC_CHECK4经济史boolm_bck4CheckboxIDC_CHECK5近代史boolm_bck5CheckboxIDC_CHECK6社会学boolm_bck6buttonIDOK确定(3)程序源代码在“确定“按钮上添加单击事件: void CGroupTestDlg:OnOK()可在其中添加代码执行相应功能)(4)说明注意区别Checkbox与Radiobox在使用时的不同之外,前者可多选,而后者要求在同一 组内的控件只可单选。因此,在使用后者时必须对Radiobox指定分组。4.(1)实践结果(2)控件属性表控件类型ID标题类型成员ListIDC_LISTcontrolmlisttextIDC_EDITcontrolm_ editbuttonID_BUTTON_EDIT修改buttonIDBUTTONDELETE删除buttonID_BUTTON_EXIT退Hi(3)程序源代码初始化列表框代码:BOOL CListTestDlg:OnlnitDialog()mlist.AddString(”语文”); mlist. AddString(“数学"); m list.AddString(”英语”);为3个按钮添加事件为:void CListTcstDlg:OnButtonEdit()CString str;medit.GetWindowText(str);m_list.AddString(str);m_edit.SetWindowText(,H);m_edit.SetFocus();)void CListTestDlg:OnButtonDelete()int st;st=m_list.GctCurSel();mlist.DeleteString(st);)void CListTestDlg:OnButtonExit()(OnCancel();(4)说明若想直接在列表框上单击便能选中某项,可在列表框上定义単击事件,读者可自行尝试 完成。(1)实践结果CnmhnTact灾叮所在省份:1河北省户类型:"非农户 农业户盛、提交厂凯建霽厂经济管理计苴机技术17电子技术(2)控件属性表控件类型ID标题类型成员comboIDC_COMBOcontrolmcomboCstringm_ strComboradioboxIDC_RADIO_NOT_VILLIAGE非农户口controlm_radioradioboxIDC_RADIO VILLIAGE农业户checkboxIDC_CHECK_JIXIE机械工程boolm_ bckjjixiecheckboxIDC_CHECK_JINGJI经济管理boolmbckjigjicheckboxIDC_CHECK_JSJ计算机技术boolmbckjsjcheckboxIDC_CHECK_DIANZI电子技术boolm_ bckdianziButtonID_BUTTON_SUBMIT提交buttonID_BUTTON_EXIT退出(3)程序源代码为提交按钮添加事件处理函数:void CComboTestDlg:OnButtonSubmit()CString m strProvince;CString m strResidence;UpdateData(true);mstrPro vince = mstrCombo;if(m_radio.GetCheck() = 1)m strResidence ="非农业户 LT; elsem strResidence ="农业户 CString mstrCource = if(this->m_bckdianzi = TRUE) m_strCource+= "电子技术”; ifl(this->m_bckjsj = TRUE) m_strCource += ”计算机技术”; if(this->m_bckjixie = TRUE)m strCource += ”机械工程 T,;if(this->m_bckjingji = TRUE) m_strCource+="经济管理”;AfkMessageBox("省份是:“+m_strProvince+”n”+肥 口 是:"十 !_或乐6§1加M6+“1"+”所选课程有:“+m_strCource);(4)说明此例为combo,checkbox,radiobox多控件的综合应用,该类3种控件在程序设计时非常 常用,在使用时应注意区别各自的使用方法。(1 )实践结果(2)控件属性表控件类型ID标题类型成员TextIDC_EDITbuttonIDC_BUTTON显示非数字字符(3)程序源代码为按钮添加事件处理函数:void CFileTestDlg:OnButton()CFile mFile;CStringm_Str = ""mFile.OpenfcrWInetFile.txfCFilemodeRead);DWORD fileLength = mFilc.GetLcngth();int dwCount=0;whilc(dwCount < fileLength)char sRcad;int dw = mFile.Read(&sRead, 1);iRsRcad <*0* | sRcad > 9) m_Str +=sRead;dwCount+=dw;mFile.Close();SetDlgItemText(IDC_EDIT,m_Str);(4)说明在该程序示例中,待打开的文本文件的地址是为硬编码方式,因此,在程序运行之前应 先检查该文本文件是否存在,且地址是否正确。在读写文件时,普遍遵循文件读写的一般步骤,即打开文件、设置读写模式、循环读写、 关闭文件。当然,读写文件有很多方法,此处只示例种方式,读者可自行尝试其他方法。2.(1)实践结果(2)控件属性表控件类型ID标题类型成员button1DC_BUTTON写入10个随机数(3)程序源代码为按钮添加事件处理函数:void CFileWriteTestDlg: :OnButton()CFile mFile;mFile.Open("c:test.txt",CFile:modeWrite|CFile:modeCreate);int count = 0;srand( (unsigned)time( NULL);while(count < 1) int m nRandom = rand();CString m_strRandom(m_nRandom);mFile.SeekToEnd();mFilc.Write(m_strRandom,strlen(m_strRandom); count-H-;mFile.CloseQ;(4)说明此例中的唯一难点是产生!0个随机数,函数srand( (unsigned)time( NULL);用于将随机数产生器设置为系统时间,如此的话,每次产生的随机数都将不相同,具有最好 的随机效果。3.(1)实践结果(2)控件属性表控件类型ID标题类型成员buttonIDC_BUTTON_EXCHANGE交换文件内容TextIDC_EDIT_FILE1textIDC_EDIT_FILE2(3)程序源代码 定义变量:class CExchangeFileTestDlg : public CDialog |private:CString mstr F i le 1 ,m_strF i le2;用于存储两个文件内容的字符串CFile m_filel,m_file2;两个文件变量Void ReadFile();私有函数,用于读取文件内容至字符串中并显示)ReadFile函数的实现代码:void CExchangeFileTestDlg:ReadFile()(CString m_Str;m_filel.Opcn(nc:testl.txtn,CFile: :modcRcad);DWORD fileLength = m file 1 .GetLength();int dwCount=0;while(dwCount < fileLength) char sRcad5;memset(sRead,0,6);int dw = m filcl .Read(sRcad,5);m_Str += sRead;dwCount+=dw;m_filel.Close();mstrFilel = m_Str;SetDlgltemText(IDC_EDIT_FILE l,m_strFile 1);m_Str =吗m_file2.Open(nc:test2.txtn,CFile:modeRead);fileLength = m_file2.GetLength();dwCount=0;while(dwCount < fileLength)char sRead5;memset(sRead,0,6);int dw = m_file2.Read(sRead,5);m_Str += sRead;dwCount+=dw;m_file2.Close();m_strFile2 = m_Str;SetDlgItemText(IDC_EDIT_FILE2,m_strFile2);交换字符串内容代码:void CExchangeFileTestDlg:OnButtonExchange() (CString m_strExchange;mstrExchange = m_ strFile 1;mstrFilel = m_strFile2;m_ strFile2 = m_ strExchange;mfilel .Open(Mc:testl .txtH,CFile:mode Write);mfile 1 .Write(m_strFile l,strlen(m_strFile 1);m_filel.Close();m_file2.Open(',c:test2.txtH,CFile:mode Write);m_file2.Write(m_strFile2,strlen(m_strFile2);m_fiIe2.Close();ReadFile();)(4)说明ReadFile。函数用于完成读取文本中的内容至字符串中,并将其显示到文本框中。程序核心功能是在函数OnButtonExchange()中完成的,将代表两个文件内容的字符串内 容交换,然后再对应写回至原文件中,就完成了文件的交换功能。4.(1)实践结果(2)控件属性表控件类型ID标题类型成员TextIDC_EDITbuttonIDC_BUTTON打开文件对话框(3)程序源代码为按钮添加事件处理函数:void CFileTestDlg:OnButton()CFile mFile;CStringm_Str = "M;CString lpFileName=_T(,n,);CString lpszFilter=_T(Mtxt Files(*.txt)|*.txt|All Files(*.*) | *.*|H);CFileDialogfUlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, lpszFilter,NULL);if(fdlg.DoModal()=IDOK) CString IpszFileName=fdlg.GetPathNameO;C StringlpszExt=fdlg.GetFileExt();if(lpszExt.IsEmpty() IpFileName. Format(”s.txt",lpszFileName);elselpFilcName=lpszFilcNamc;mFile.Open(lpszFileName, CFile:modeRead);DWORD fileLength = mFile.GetLength();int dwCount=0;while(dwCount < fileLength)char sRead5;memset(sRead,0,6);int dw = mFile.Read(sRead,5);m_Str= m_Str + sRead;dwCount+=dw;SetDlgItemText(IDC_EDIT,m_Str);mFile.Close();(4)说明关于CfileDialog类及其使用方法请参考教材实践四的“程序分析与注意事项”或者参 考 MSDNo5.(1)实践结果(2)控件属性表控件类型ID标题类型成员buttonIDC_BUTTON设置文件属性(3)程序源代码为按钮添加事件处理函数:void CSetupFileDlg:OnButton()(CFile mFile;CString m_Str;DWORD stat=O;CString lpFileName=_T(n");CString lpszFiIter=_T(Mtxt Files (*.txt)| *.txt|All Files (*.*) | *.*|M);CFileDialogfUlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, lpszFilter,NULL);if(fiilg.DoModalO=IDOK) CString lpszFileName=fUlg.GetPathName();CString lpszExt=fiilg.GetFileExt();if(lpszExt.IsEmpty() IpFileName.Format ("%s.txtM,lpszFileName);else(lpFileName=lpszFileName;stat=GetFileAttributes(lpFileName);stat|=FILE_ATTRIBUTE_HIDDEN;stat|=FILE_ATTRIBUTE_READONLY;if(!SetFileAttributes(lpFileName,stat)AfkMessageBox("设置文件属性出错);(4)说明1)使用CFileDialog类是个打开文件对话框,选择要修改属性的文件。2)使用函数GetFileAttributes(lpFileName)来获取指定文件的属性,参数IpFileName用 来指示文件的全路径名。这个函数返回文件的属性。3)文件属性是一个双字,常用的属性有: FILE_ATTRIBUTE_H1DDEN:文件隐藏属性; FILE_ATTRIBUTE_READONLY:文件只读属性; FILE_ATTRIBUTE_ARCHIVE:文件归档属性; EILE_ATTRIBUTE_SYSTEM:文件系统属性。6.(1)实践结果(2)控件属性表控件类型ID标胆类型成员buttonIDC_BUTTON_SAVE保存对象buttonIDC_BUTTON_READ读取对象(3)程序源代码此题较为复杂,关键是构造个可序列化的新类Cstudent。代码如下:CStudent.hclass