C++实践指导教程_第1页
C++实践指导教程_第2页
C++实践指导教程_第3页
C++实践指导教程_第4页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《VisualC++实践指导教程》

习题答案目录TOC\o"1-5"\h\z第1章 3\o"CurrentDocument"33第2章 55679第3章 11\o"CurrentDocument"1 113 125 1316171819第5章 212122252627第6章 301 30333537第フ章 393941434547第8章 512 51535558第9章 601 603 671.(1)实践结果(2)控件属性表无(3)程序源代码voidCMdHelloView::OnDraw(CDC*pDC)(CMdHelloDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedataherepDC->TextOut(50,50,"HelloWorld!");2.(i)实践结果(2)控件属性表控件类型控件名ID类型成员LabelLabel1IDC_STATIC(3)程序源代码BOOLCDlgHelloDlg::OnInitDialog()//TODO:Addextrainitializationherethis・>SetDlgItemText(IDC_STATIC」这是ー个对话框程序”);returnTRUE;//returnTRUEunlessyousetthefocustoacontrol)(4)说明在此程序中使用了一个常用函数BOOLSetDlgItemText(intnID.LPCTSTRIpszString),该函数实现了通过控件的ID号(nID)设置控件的显示文本(IpszString).与此对应的还有UINTGetDlgItemText(intnID,LPTSTRIpStr,intnMaxCounl)constBOOLGetDlgItemText(intnID,BSTR&bstrText)const详见MSDN1.(11.(1)实践结果(2)控件属性表略(3)程序源代码略(4)说明参见实践1(创建菜单)中创建菜单的方法,为程序菜单添加“格式”菜单项,并在其下添加子菜单项,分别为“自动换行”和“字体”,ID号分别为“IDC一AUTOLINE”和“IDC一FONT”。控件类型控件名ID类型成员LabelLabel1IDC_STATIC2.(1)实践结果(2)控件属性表略的方法添加在“文件”菜单项下添加“显示”子菜单项。(3)程序源代码1)参照练习的方法添加在“文件”菜单项下添加“显示”子菜单项。2)为“显示”子菜单项添加事件处理函数OnShowO。3)添加源代码voidCMainFrame::OnShow(){//TODO:AddyourcommandhandlercodehereCDC*pDC=this->GetDC();pDC->TextOut(50,50,"学习菜单处理程序");)(4)说明绘图时,必须先获得设备环境,即CDC,在此程序中使用函数GetDCO获得设备环境指针。3.(1)实践结果文件任)—辑広)查看豊)帮助鱼)r 1秋建(B) Ctrl+N打开@)... Ctrl+0保存0) Ctrl+S另存为。)...打印位)... Ctrl+P打印预览W)打EP设置(B)... _最近文件 退出賞)显示(J)Ctrl+D(2)控件属性表略(3)程序源代码参照教材实践3(增加快捷键和加速键)1)将子菜单项“显示”的标题按钮修改为“显示(&D)”;2)打开加速键编辑器,将对应菜单项的KEY修改为Do(4)说明略(1)实践结果(2)控件属性表略(3)程序源代码voidCMenuCreateView::OnAddItem(){CWnd*pParent=GetParent();CMenu*pMenu=jParent->GetMenu();CMenu*subMenu=pMenu->GetSubMenu(1);subMenu->AppendMenu(MF_STRINGIMF_ENABLED,3000,”新菜单项)1(4)说明添加新菜单项与为该菜单项添加事件响应函数的方法见上例。动态添加菜单项的步骤:首先定位待添加的菜单项,GetParent()函数用于获得当前窗体,pParent->GetMenu()与pMenu->GetSubMenu⑴用于获得当前窗体的菜单及待添加菜单项,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_VIRTUAL3)定义ー个字符串,并在构造函数中初始化定义:classCMenuCreateView:publicCView(private:CStringstr;初始化:CMenuCrealeView::CMenuCreateView()(//TODO:addconstructioncodeherestr二"”;)4)实现响应函数voidClnsertltemView::OnMyMenuItem()(str="你选中了新添加的菜单项";InvalidateO;}5)绘图voidCMenuCreateView::OnDraw(CDC*pDC)(CMenuCreateDoc*pDoc=GetDocument();ASSERT.VALID(pDoc);//TODO:adddrawcodefornativedataherepDC->TextOut(20,20,str);)(4)说明动态添加菜单项处理时,须定义菜单项消息与响应函数之间的映射关系。此处通过ON_COMMAND(3000,OnMyMenuItem)来实现〇6.(1)实践结果(2)控件属性表略(3)程序源代码在MainFrm.cpp的新函数OnCreateO中加入如下代码:if(!m„wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WSVISIBLE|CBRS_TOPICBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndToolBar.LoadToolBar(1DR_MAINFRAME))(TRACE。("Failedtocreatetoolbar\n");return-1; //failtocreate)mwndToolBar.Enab1eDocking(CBRSALIGNANY);Enab1eDocking(CBRS_ALIGN_ANY);DockControlBar(&mwndToolBar);(4)说明关于此源代码中各函数的功能详见教材实践五"程序分析与注意事项”。7.(1)实践结果(1)实践结果(2)控件属性表(2)略(3)程序源代码(3)1)新建工程CustomToolbar»按教材实践7步骤ー初始化,修改字串表中的AFX」DS」DLEMESSAGE的标题为“XXX公司:版权所有”。2)在MailFrame中定义状态栏classCMainFrame:publicCFrameWnd{private:CStatusBarm_wndStatusBar;3)定义状态栏数组staticUINTindicators[]={ID_SEPARATOR, //latusInehdicator1DJNDICATOR.CAPS,ID」NDICATOR_NUM,IDJND1CATOR_SCRL,};4)添加自动创建状态栏代码intCMainFrame::OnCreate(LPCREATESTRUCTIpCreateStruct)if(!m_wndStatusBar.Create(this)II!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))(TRACEO("Failedtocreatestatusbar\nH);return-1; //fiilt)create}return0;)(4)说明staticUINTindicators]]定义ー个由标准命令ID组成的数组。1D_SEPARATOR:指示在状态栏中生成一个空格。ID_INDICATOR_CAPS:大写键锁定指示。ID_INDICATOR_NUM:数字键锁定指示。ID」NDICATOR-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…”,并修改新插入的对话框属性,令其[D为IDD一DLG-FIND,标题为“査找”。再在对话框其上添加控件并布局。(4)说明略(1)实践结果:略(2)控件属性表略(3)程序源代码在对话框资源上单击右键,选中“建立类向导”项,弹出“Addingaclass”对话框,选择“Createanewclass”单选框,确定后将弹出“NewClass”对话框。在其中输入新类信息,Name中输入“CFingDlg”,确定退出。(4)说明也可按快捷键Ctrl+W,要求弹出“类向导对话框”,在“类向导对话框”之前会出现**Addingaclass"对话框,其后的设置与上例完全ー一样。(2)控件属性表略(3)程序源代码1)为“査找”菜单项定义事件函数,voidCDialogTestView::OnEditFind()<.2)在其中以模式对话框的方式调用“査找”对话框,代码如下:voidCDialogTestView::OnEditFind()(/・添加非模式对话框・/CFindDlgfinddig;finddlg.DoModal();)(4)说明关于模式对话框,可参考教材第3章实践5。6.(1)实践结果(2)控件属性表略(3)程序源代码1)为“査找”菜单项定义事件函数,为voidCDialogTestView::OnEditFind()。2)在其中以模式对话框的方式调用“查找”对话框,代码如下:voidCDialogTestView::OnEditFind()(〃添加模式对话框〃CFindDlg*dlg=newCFindDlgO;dlg->Create(IDD_DLG_HND);dlg->ShowWindow(SW_SHOW);)(4)说明关于非模式对话框,可参考教材第3章实践501.(1)实践结果(2)控件属性表控件类型ID标题说明LabelIDC_STATIC您选择的体形:LabelIDC_STATIC_RESULT选择结果RadioboxIDC_RADIO_NORMAL正常RadioboxIDC_RADIO_THIN偏瘦RadioboxIDC_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函数主要起到控制控件标题显示的作用。当调用UpdaiaData(TRUE)的时候,程序会対控件対应的变量值进行刷新,也就是说会把控件中的输入值赋给对应的变量。而调用UpdataData(FALSE)的时候,程序则会把相应变量的值显示在对应的控件上面。(1)实践结果(2)控件属性表控件类型ID标题类型成员LabelIDC_STATIC请选择特长:LabelIDC_STATIC_RESULT显示结果:CStringm_strResultCheckboxIDC_CHECK_ENGLISH英语boolm_bEnglishCheckboxIDC_CHECK_SPORTS体育boolm_bSportsCheckboxIDC_CHECK_ART文艺boolm_bArtCheckboxIDC_CHECK_COMPUTER计算机boolm_bComputerbuttonIDOK确定(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+H体育”;)m_strResult=str;UpdateData(false);)(4)说明在此处关键为Checkbox定义控件类型与成员,与上例RadioBox的用法不尽相同,注意区别。3.(2)控件属性表控件类型ID标题类型成员RadioboxIDC_RADIO1请选择特长:intm_nTermRadioboxIDC_RADI02显示结果:CheckboxIDC_CHECK1心理学boolm_bck1CheckboxIDC_CHECK2外国文学boolm_bck2CheckboxIDC.CHECK3管理学boolm_bck3CheckboxIDC_CHECK4经济史boolm_bck4CheckboxIDC_CHECK5近代史boolm_bck5CheckboxIDC_CHECK6社会学boolm_bck6buttonIDOK确定(3)程序源代码在“确定“按钮上添加单击事件:voidCGroupTestDlg::OnOK()〃可在其中添加代码执行相应功能)(4)说明注意区别Checkbox与Radiobox在使用时的不同之外,前者可多选,而后者要求在同一

组内的控件只可单选。因此,在使用后者时必须对Radiobox指定分组。(1)实践结果(2)控件属性表控件类型ID标题类型成员ListIDC_LISTcontrolm」isttextIDC_EDITcontrolm_editbuttonID_BUTTON_EDIT修改buttonID_BUTTON_DELETE删除buttonID_BUTTON_EXIT退出(3)程序源代码初始化列表框代码:BOOLCListTestDlg::OnInitDialog()m」ist.AddString("语文");m」ist.AddString("数学");m」ist.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)说明若想直接在列表框上单击便能选中某项,可在列表框上定义单击事件,读者可自行尝试完成。(1)实践结果(2)控件属性表控件类型ID标题类型成员comboIDC.COMBOcontrolm_comboCstringm_strComboradiobox1DC_RADIO_NOT_VILLIAGE非农户口controlm_radioradioboxIDC.RADIO_VILLIAGE农业户ロcheckboxIDC_CHECK_JIXIE机械工程boolm_bckjjixiecheckboxIDC_CHECK_JINGJI经济管理boolm_bckjigjicheckboxIDC_CHECK_JSJ计算机技术boolm_bckjsjcheckboxIDC_CHECK_DIANZI电子技术boolm_bckdianziButtonID_BUTTON_SUBMIT提交buttonID_BUTTON_EXIT退出(3)程序源代码为提交按钮添加事件处理函数:voidCComboTestDlg::OnButtonSubmit()(CStringm_strProvince;CStringm_strResidence;UpdateData(true);m_strProvince=m_strCombo;if(m_radio.GetCheck()==1)m_strResidence="非农业户ロ”;elsem_strResidence="农业户ロ”;CStringm_strCource=M";if(this->m_bckdianzi==TRUE)m_strCource+二”电子技术”;if(this->m_bckjsj==TRUE)m_strCource+二”计算机技术”;if(this->m_bckjixie==TRUE)m_strCource十二”机械工程二if(this->m_bckjingjiニニTRUE)m_strCource+二”经济管理”;AfxMessageBox(”省份是:“+m_strProvince+“\n”+“户ロ是:“+m_strResidence+ゝ”‘所选课程有:"+m_strCource);)(4)说明此例为combo,checkbox,radiobox多控件的综合应用,该类3种控件在程序设计时非常常用,在使用时应注意区别各自的使用方法。(1)实践结果(2)控件属性表控件类型ID标题类型成员TextIDC.EDITbuttonIDC-BUTTON显示非数字字符(3)程序源代码为按钮添加事件处理函数:voidCFileTestDlg::OnButton()CFilemFile;CStringm_Str=mFile.Open("c:\\InetFile.txt",CFile::modeRead);DWORDfileLength=mFile.GetLength();intdwCount=0;while(dwCount<fileLength)(charsRead;intdw=mFile.Read(&sRead,1);if(sReadv'O'IIsRead>9)m_Str+=sRead;dwCount+=dw;}mFile.Close();SetDlgItemText(IDC_EDIT,m_Str);)(4)说明在该程序示例中,待打开的文本文件的地址是为硬编码方式,因此,在程序运行之前应先检查该文本文件是否存在,且地址是否正确。在读写文件时,普遍遵循文件读写的一般步骤,即打开文件、设置读写模式、循环读写、关闭文件。当然,读写文件有很多方法,此处只示例ー种方式,读者可自行尝试其他方法。(1)实践结果(2)控件属性表控件类型ID标题类型成员buttonIDC_BUTTON写入10个随机数(3)程序源代码为按钮添加事件处理函数:voidCFileWriteTestDlg::OnButton()CFilemFile;mFile.Open(,,c:\\test.txt,,,CFile::modeWritelCFile::modeCreate);intcount=0;srand((unsigned)time(NULL));while(count<1)(intm_nRandom=rand();CStringm_strRandom(m_nRandom);mFile.SeekToEnd();mFile.Write(m_strRandom,strlen(m_strRandom));count++;}mFile.Close();)(4)说明此例中的唯一难点是产生!0个随机数,函数srand((unsigned)time(NULL));用于将随机数产生器设置为系统时间,如此的话,每次产生的随机数都将不相同,具有最好的随机效果。3.(1)实践结果(2)控件属性表控件类型ID标题类型成员buttonIDC_BUTTON_EXCHANGE交换文件内容TextIDC_EDIT_FILE1textIDC_EDIT_FILE2(3)程序源代码定义变量:classCExchangeFileTestDlg:publicCDialog(private:CStringm_strFilel,m_strFile2: 〃用于存储两个文件内容的字符串CFilem_filel,m_file2: 〃两个文件变量VoidReadFileO;〃私有函数,用于读取文件内容至字符串中并显示)ReadFile函数的实现代码:voidCExchangeFileTestDlg::ReadFile()(CStringm_Str;m_file1.Open(uc:\\testl.txtn,CFile::modeRead);DWORDfileLength=m_file1.GetLength();intdwCount=0;while(dwCount<fileLength){charsRead[5];memset(sRead,0,6);intdw=m_filel.Read(sRead,5);m_Str+=sRead;dwCount+=dw;m_filel.Close();m_strFilel=m_Str;SetDlgItemText(IDC_EDIT_FILE1,m_strFile1);m_Str=,M,;m_file2.Open(,,c:\\test2.txt,\CFile::modeRead);fileLength=m_file2.GetLength();dwCount=0;while(dwCount<fileLength)(charsRead[5];memset(sRead,0,6);intdw=m_file2.Read(sRead,5);m_Str+=sRead;dwCount+=dw;)m_file2.Close();m_strFile2=m_Str;SetDlgItemText(IDC_EDIT_FILE2,m_strFile2);)交换字符串内容代码:voidCExchangeFileTestDlg::OnButtonExchange()(CStringm_strExchange;m-strExchange=m__strFilel;m_strFilel=m_strFile2;m_strFile2=m_strExchange;m_filel.Open(uc:\\testl.txt",CFile::modeWrite);m_file1.Write(m_strFilel,strlen(m_strFile1));m_filel.Close();m_file2.Open(,,c:\\test2.txt",CFile::modeWrite);m_file2.Write(m_strFile2,strlen(m_strFile2));m_file2.Close();ReadFile();)(4)说明ReadFile。函数用于完成读取文本中的内容至字符串中,并将其显示到文本框中。程序核心功能是在函数OnButtonExchange。中完成的,将代表两个文件内容的字符串内容交换,然后再对应写回至原文件中,就完成了文件的交换功能。(1)实践结果(2)控件属性表控件类型ID标题类型成员TextIDC_EDITbuttonIDC_BUTTON打开文件对话框(3)程序源代码为按钮添加事件处理函数:voidCFileTestDlg::OnButton()CFilemFile;CStringm_Str=n";CStringlpFileName=_T(,,H);CStringlpszFilter=_T(MtxtFiles(*.txt)l*.txtlAllFiles(*.*)ICFileDialog fdlg(TRUE,NULL,NULL,OFN_HIDEREADONLYIOFN_OVERWRITEPROMPT,lpszFilter,NULL);if(fdlg.DoModal()==IDOK){CStringlpszFileName=fdlg.GetPathName();CStringlpszExt=fdlg.GetFileExt();if(lpszExt.IsEmpty()){IpFileName.Format ("%s.txピ」pszFileName);)else{lpFileName=lpszFileName;}mFile.Open(lpszFileName,CFile::modeRead);DWORDfileLength=mFile.GetLength();intdwCount=0;while(dwCount<fileLength){charsRead[5];memset(sRead,0,6);intdw=mFile.Read(sRead,5);m__Str=m_Str+sRead;dwCount+=dw;)SetDlgItemText(IDC_EDIT,m_Str);mFile.Close();))(4)说明关于CfileDialog类及其使用方法请参考教材实践四的“程序分析与注意事项”或者参考MSDN。5.(1)实践结果(2)控件属性表控件类型ID标题类型成员buttonIDC_BUTTON设置文件属性(3)程序源代码为按钮添加事件处理函数:voidCSetupFileDlg::OnButton()(CFilemFile;CStringm_Str;DWORDstat=O;CStringlpFileName=_T(,H,);CStringlpszFilter=_T(MtxtFiles(*.txt)l*.txtlAllFiles(*.*)I*.*11");CFileDialog fdlg(TRUE,NULL,NULL,OFN.HIDEREADONLYIOFN^OVERWRITEPROMPT,[)szFiIter,NULL);if(fdlg.DoModal()==IDOK){CStringlpszFileName=fdlg.GetPathName();CStringlpszExt=fdlg.GetFileExt();if(lpszExt.IsEmpty()){IpFileName.Format("%s.txtn,lpszFileName);}else{lpFileName=lpszFileName;stat=GetFileAttributes(lpFileName);statl=FILE-ATTRIBUTE一HIDDEN;statl=FILE_ATTRIBUTE_READONLY;if(!SetFileAttributes(lpFileName,stat)){AfxMessageBox("设置文件属性出错ド);|))(4)说明1)使用CFileDialog类是一个打开文件对话框,选择要修改属性的文件。2)使用函数GetFileAttributes(lpFileName)来获取指定文件的属性,参数IpFileName用来指示文件的全路径名。这个函数返回文件的属性。3)文件属性是一个双字,常用的属性有:FILE_ATTRIBUTE_HIDDEN:文件隐藏属性;FILE_ATTRIBUTE_READONLY:文件只读属性;FILE_ATTRIBUTE_ARCHIVE:文件归档属性:FILE_ATTRIBUTE_SYSTEM:文件系统属性。6.(1)实践结果(2)控件属性表控件类型ID标题类型成员buttonIDC.BUTTON.SAVE保存对象buttonIDC_BUTTON_READ读取对象(3)程序源代码此题较为复杂,关键是构造ー个可序列化的新类Cstudent。代码如下;CStudent.hclassCStudent:publicCObject{public:CStudent();CStudent(int,CString);virtual-CStudent();public:voidSerialize(CArchive&ar);public:intm_nID;CStringm_strName;DECLARE_SERIAL(CStudent)1;CStudent.cppIMPLEMENT_SERIAL(CStudent,CObject,1)CStudent::CStudent(){m_nID=0;m_strName="”;}CStudent::CStudent(intid,CStringname)(m_nID=id;m_strName=name;)CStudent::〜CStudent。(}voidCStudent::Serialize(CArchive&ar)(if(ar.IsStoring。)(ar«m_nID;ar«m_strName;}elsear»m_nID;ar»m_strName;)为两个按钮添加事件处理函数:voidCArchiveDemoDlg::OnButtonSave(){CFilefile(ntest.txt'\CFile::modeCreateICFile::modeWrite);CArchivear(&file,CArchive::store);CStudent*pStudent=newCStudent(10/'lixiaojiang");ar«pStudent;deletepStudent;)voidCArchiveDemoDlg::OnButtonRead()(CFilefile("test.txt",CFile::modeRead);CArchivear(&file,CArchive:Hoad);CStudent*pStudent;ar»pStudent;CStringstrResult;strResult.Format(HstudentID=%d\nname=%s\nu,pStudent->m_nID,pStudent->m_strName);AfxMessageBox(strResult);)(4)说明1)此题较实现时具有一定难度,在为类实现序列化时,就同时使其实现:①继承自Cobject类。②添加宏 DECLARE一SERIAL(CStuden。和宏IMPLEMENT一SERIAL(CStudent,CObject,1),(3)重载函数void:Serialize(CArchive&ar),并按如下形式实现:voidCPerson::Serialize(CArchive&ar){CObject::Serialize(ar);if(ar.IsStoringO){//TODO:addstoringcodehere)else(//TODO:addloadingcodehere})2)CArchive常与CFile类一同使用,如本题,在OnButtonSave()函数中将対象序列化至文件中,然后在OnButtonReadO函数中将对象读至新建对象,实现了对象的状态保存。1.(1)实践结果(2)控件属性表控件类型ID标题类型成员RadioboxIDC_RADIO_RED红色intm」ineColorRadioboxIDC_RADIO_GREEN绿色RadioboxIDC_RADIO_BLUE蓝色(3)程序源代码定义类变量:classCLineTestDlg:publicCDialogprivate:CPointm_startPoint,m_endPoint;enum{red=0,green=l,blue=2};intcount;)为按钮添加事件处理函数:voidCLineTestDlg::OnLButtonDown(UINTnFlags,CPointpoint)(if(count==0)m_startPoint=point;count++;}elsem_endPoint=point;CPen*oldPen,*curPen;COLORREFcolor;if(m_lineColor==red)color=RGB(250,0,0);if(m_lineColor==green)color=RGB(0,250,0);if(m」ineColor=blue)color=RGB(0,0,250);curPen=newCPen(PS_SOLID,1,color);CDC*pDC=GetDCO;oldPen=pDC->SelectObject(curPen);pDC->MoveTo(m_startPoint);pDC->LineTo(m_endPoint);pDC->SelectObject(oldPen);deletecurPen;)CDialog::OnLButtonDown(nFlags,point);}(4)说明变量count用于检测鼠标单击次数,在第1次单击时,将单击位置保存,第2次单击时,绘制直线。绘制直线时,应遵循ー些必须注意的规则,如获得设备环境、导入直线对象并保存原直线对象,绘制完成后还原直线对象。绘制直线函数为LineTo,此函数与MoveTo函数配合使用共同完成绘制直线的工作。前者用于设置直线坐标起始点,后者用于确定直线终点,并完成绘制。特别注意,在程序中申请分配的堆空间(使用。peratornew申请的变量空间)必须在使用完成后显示删除(delete语句)。

2.(1)实践结果(2)控件属性表控件类型ID标题类型成员RadioboxIDC_RADIO_RED红色intm」ineColorRadioboxIDC_RADIO_GREEN绿色RadioboxIDC_RADIO_BLUE蓝色(3)程序源代码定义类变量:classCLineTestDlg:publicCDialogprivate:CPointm_startPoint,m_endPoint;enum{red=0,green=l,blue=2};intcount;)为按钮添加事件处理函数:voidCLineTestDlg::OnLButtonDown(UINTnFlags,CPointpoint)(if(count==0){m_startPoint=point;count++;)else{m_endPoint=point;CBrush*oldBrush,*curBrush;COLORREFcolor;UpdateData();if(m_lineColor==red)color=RGB(250,0,0);if(m_lineColor==green)color=RGB(0,250,0);if(m」ineColor==blue)color=RGB(0,0,250);curBrush=newCBrush(color);CDC*pDC=GetDC();oldBrush=pDC->SelectObject(curBrush);pDC->Ellipse(m_startPoint.x,m_startPoint.y,m_endPoint.x,m_endPoint.y);pDC->SelectObject(oldBrush);deletecurBrush;count=0;)CDialog::OnLButtonDown(nFlags,point);)(4)说明读者可能注意到,此题与上例基本相同,都是使用count计算单击次数,且同样遵循绘图过程。唯一不同的是在使用设备环境(CDC)绘图时使用的是Ellipse(…)函数,而不是LineTo(…)函数。Ellipse(intxl,intyljntx2,inly3)函数用于完成圆形的绘制,其中参数分别表示为:intxl,intyl:圆形对应矩形的左上角坐标;intx2,inty3:圆形对应矩形的右上角坐标。3.(2)控件属性表(3)程序源代码定义类变量及私有函数:classCMouseEllipseView:publicCView(public:CPointmPointOrign,mPointOld;intpb;private:voidSaveAsBmp(CStringfilename);voidDrawCurve(CDC*pDC,CRectrcClient);)为按钮添加事件处理函数:voidCMouseEllipseView::OnRButtonDown(UINTnFlags,CPointpoint)(CFileDialogdlg(false,NULL,NULL,OFN_HIDEREADONLYIOFN_OVERWRITEPROMPT,”位图文件(*.bmp)l*.bmpl”,NULL);if(dlg.DoModal()!=IDOK)return;CStringfilename=dlg.GetFileName。+".bmp";SaveAsBmp(filename);CView::OnRButtonDown(nFlags,point);)voidCMouseEllipseView::DrawCurve(CDC*pDC,CRectrcClient)voidCMouseEllipseView::SaveAsBmp(CStringfilename){)(4)说明该程序主要是要将图形保存为bmp的位图文件,用户可以使用Windows系统自带的绘图工具打开这个文件,可以看到这个图形与程序中的图形一致。用户也可以将图形保存为其他格式的图形文件。因篇幅有限,此处去的代码,详见源代码(路径:SourceCode、第6章、2)(1)实践结果(2)控件属性表(3)程序源代码定义Cgraph类:classCGraph{public:CGraph(CPoinlm_pOrigin,CPointm_pEnd);CPointm_pOrigin,m_pEnd;CGraph();virtual~CGraph(););CGraph::CGraph(){)CGraph::-CGraph(){)CGraph::CGraph(CPointm_pOrigin,CPointm_pEnd){this->m_pOrigin=m_pOrigin;this->m_pEnd=m_pEnd;)在CMouseEllipseView::OnLButtonDown()事件中新增イ弋码:voidCMouseEllipseView::OnLButtonDown(UINTnFlags,CPointpoint)if(pb==O)}else(CGraph*pGraph;pGraph=newCGraph(mPointOrign,point);m_ptrArray.Add(pGraph);)为了保证图像不丢失,因此将画图代码写在OnDrawO函数中,窗口每次重绘都会调用该函数重新绘制图像。在OnDrawO函数中添加代码:voidCMouseEllipseView::OnDraw(CDC*pDC)(CMouse臼lipseDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereCPointm_Pointl,m_Point2;doubler;CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL));pDC->SelectObject(pBrush);for(inti=O;i<m_ptrArray.GetSize();i++)(CGraph*tmpGraph=(CGraph*)m_ptrArray.GetAt(i);r=sqrt(pow((tmpGraph->m_pOrigin.x-tmpGraph->m_pEnd.x),2)+pow((tmpGraph->m_pOrigin.y-tmpGraph->m_pEnd.y),2));m_Pointl.x=tmpGraph->m_pOrigin.x-r;m_Pointl.y=tmpGraph->m_pOrigin.y-r;m_Point2.x=tmpGraph->m_pOrigin.x+r;))(4)说明在创建CGraph类对象时,必须首先在OnLButtonUp函数中创建的CGraph对象指针,然后用new方法为它在堆中分配内存。这样除非显式地调用Delete方法去释放它,否则其生命周期直到程序结束时オ结束。为了保证图像不丢失,因此将画图代码写在OnDrawO函数中,m_ptrArray用于面板中已有的图形,窗口每次重绘都会调用该函数,并从m_ptrArray中读取函形重新绘制。

(1)实践结果2.控件属性表控件类型ID标题类型成员TextIDC_EDIT_FRAME框架最大高度Cstringm_nFrameHeightMaxTextIDC_EDIT_CURVE曲线最大高度CStringm_nCurveHeightMaxbuttonID_BUTTON_TEST测试(3)程序源代码在实践6的基础上修改如下:将鼠标事件更改为:voidCSineTestDlg::OnButtonTest()(this->Invalidate(true);this->SendMessage(WM_PAINT);)将原鼠标事件中代码移至OnPaint函数中,并做适当修改:voidCSineTestDlg::OnPaint()UpdateData();intframeHeightMax,curveHeightMax;frameHeightMax=atoi(this->m_nFrameHeightMax);curveHeightMax=atoi(this->m_nCurveHeightMax);CSineCurvecur;CDC*pDC=newCClientDC(this);cur.Init(10,70,400,frameHeightMax,curveHeightMax,pDC);cur.DrawSine();)修改CSineCurve类中的Init函数:voidCSineCurve::Init(intx,inty,intwid,inthei,intcurHeight,CDC*pDC){left=x;top=y;width=wid;height=hei;this->pDC=pDC;if(curHeight*2>hei)curHeight=hei/2;curveHeight=curHeight;halfCurveHeight=curHeight/2;)(4)说明此次修改主要使曲线绘制过程中所需参数能由用户直接从界面文本框中输入,并对输入的参数进行比较(设置一个丫轴方向的最大值,超过最大值部分按照最大值计算),以避リ题目要求。该程序中一个较大的改动是将原鼠标事件中代码移至OnPaint函数中,并做适当修改。这是因为,将绘图代码置于鼠标事件中时,一旦界面被遮盖,图形不能自动刷新,而OnPaint函数与Invalidate(true)函数的搭配使用则能很方便地实现这ー点。目.OnPaint函数的调用是通过发送WM_PAINT消息(this->SendMessage(WM一PAINT))来实现的。1.(1)实验结果三无标题-T B@E文件9編辑盘)记录®壹看9帮助出)口ペR 昌卜>>1豎学号丨姓名 班嫉 丨英语丨数学孕生成绩管理排序记录 全部记录就绪(2)控件属性表控件类型控件名标题属性StaticBoxIDC_STATIC学生成绩管理默认ButtonIDD_SORT排序记录默认ButtonIDD_ALL全部记录默认ListControlIDC_LIST1—Style:Report(3) 程序源代码intCMy7View::Show()(inti=0;m_pSet・>MoveFirst();〃移动到第•条记录上do〃显示每行记录(CStrings;〃显示第i行第1列的记录s.Format(,,%d'\m_pSet->m_column1);m_ListCtrLInsertItem(i,s,O);〃显示第i行第2列的记录m_ListCtrLSetItemText(i,l,m_pSet->m_column2);〃显示第i行第3列的记录m_ListCtrl.SetItemText(i,2,m_pSet->m_column3);〃显示第i行第4列的记录s.Format(',%d'\m_pSet->m_column4);m_ListCtrl.SetItemText(i,3,s);〃显示第i行第5列的记录s.Format(',%d'\m_pSet->m_column5);m_ListCtrl.SetItemText(i,4,s);〃显示第i行第6列的记录s.Format(”%d”,m_pSel・>m_column6);m_ListCtrl.SetItemText(i,5,s);i++;m_pSet->MoveNext();)while(!m_pSet->IsEOF());m_pSet->MoveFirst();returni;}voidCMy7View::OnSort()(//TODO:Addyourcontrolnotificationhandlercodehere〃以学号为参考,排序记录m_ListCtrLDeleteAHItems();m_pSet->m_strSortゴ[学号]”;m_pSet->Requery();this->Show();}voidCMy7View::0nAll()(//TODO:Addyourcontrolnotificationhandlercodehere〃显示所有记录m_ListCtrl.DeleteAHItems();this->Show();(1)实验结果受.无标题-7 臼回园文件a)编辑但)记录よ)查看也)帮助国)ロ4P 昌►►! ?學生成绩管理学号姓名班级英语丨数学添加记录124365〇0000添加记录124365〇0000〇赵线李林吴周1机机机筑算语语算算建计英英计计054288735197< 一ー而ー-…一一……-,-—而 ,挿序记录 全部记录(2)控件属性表控件类型控件名标题属性StaticBoxIDC_STATIC学生成绩管理默认ButtonIDD_SORT排序记录默认ButtonIDD_ALL全部记录默认ListControlIDC.LIST1一Style:ReportButtonIDC_FIND查询记录Verticalscroll\Horizontalscroll(3) 程序源代码voidCMy7View::OnAdd()(CAddDialogdig;//TODO:Addyourcontrolnotificationhandlercodehereif(dlg.DoModal()==IDOK)〃选择确定按钮(if(dlg.m_Xuehao=0)〃如果学号为空(AfxMessageBox("学号不可为零!う,弹出消息框1else(m_pSetつAddNew();〃添カロ新记录〃将所有输入的值赋给相应的列m_pSet->m_column1=dlg.m_Xuehao;m_pSet->m_column2=dlg.m_strName;m_pSet->m_column3=dlg.m_Maths;m_pSet->m_column4=dlg.m_English;m_pSet->m_column5=dlg.m_Math;m_pSet->m_column6=dlg.m_CPT;m_pSet->Update();〃更新m_pSet->Requery();m_pSet・>MoveLast();〃指向最后一・条记录CStrings;〃在所有记录的前面s.Format("%d",dlg.m_Xuehao);m_ListCtrl.InsertItem(O,s,〇);〃在第!列添加记录〃在第2列中添加记录m_ListCtrl.SetItemText(0,1,dlg.m_strName);〃在第3列中添加记录m_ListCtrl.SetItemText(0,2,dlgm_Maths);s.Format(u%dn,dlg.m_English);m_ListCtrl.SetItemText(0,3,s);〃在第4列中添加记录s.Format("%d",dlg.m_Math);m_ListCtrl.SetItemText(0,4,s);〃在第5列中添加记录s.Format("%d”,dlg.m_CPT);m_ListCtrl.SetItemText(0,5,s);〃在第6列中添加记录m_pSet->MoveFirst();13回区)13回区)ん无标题-7文件セ)编辑⑥记录®查看⑦帮助国)ロヰ。 昌M►M?学生成绩管理Sv4〇〇〇〇7Sv11Qz7•机机机筑算Sv4〇〇〇〇7Sv11Qz7•机机机筑算语语算算建计英英计计名姓赵钱李#吴周124365OOOOOOH1.11I11H添・加记录測險记录排序记录 全部记录«0 I-I厂/(2)控件属性表控件类型控件名标题属性StaticBoxIDC.STATIC学生成绩管理默认ButtonIDD_SORT排序记录默认ButtonIDD_ALL全部记录默认ListControlIDC_L1ST1一Style:ReportButtonIDC_FIND查询记录Verticalscroll\HorizontalscrollButtonIDC.DELET删除记录默认(3)程序源代码voidCMy7View::OnDelet()//TODO:AddyourcontrolnotificationhandlercodehereCDeleteDialogdig;if(dlg.DoModal()==lDOK)〃单击确定按钮(if(dlg.m_Password!=1234)〃密码不是1234AfxMessageBox(“你没有权限删除记录!请重输入密码!0);else{BOOLb=FALSE;m_pSet->MoveFirst();〃指到第!条do{〃查询记录中的学号和所输入的学号是否相同if(dlg.m_Xuehao!=m_pSet->m_column1)m_pSet->MoveNext();else(m_ListCtrl.DeleteAHItems();〃删除该条记录b=TRUE;m_pSet->Delete();m_pSet->Requery();this->Show();m_pSet->MoveFirst();break;))while(!m-pSet->IsEOF());〃如果没有相同的记录if(b==FALSE)AfxMessageBox("没有此记录つ;//弹隕消息框(I)实验结果文件9编辑电)记录®查文件9编辑电)记录®查看9帮助国)口田口ゆ(昌枕►H?學生成绩管理学号 「姓名 |初又 ]英语|数学添加记录! :;;104103106删除记录105赵钱李#吴周筑算语语算斛

建计英英计计054288735197修改记录就绪全部记录就绪全部记录(2)控件属性表控件类型控件名标题属性StaticBoxIDC_STATIC学生成绩管理默认ButtonIDD_SORT排序记录默认ButtonIDD_ALL全部记录默认ListControlIDC_LIST1—Style:ReportButtonIDC_FIND查询记录Verticalscroll\HorizontalscrollButtonIDC_DELET删除记录默认ButtonIDC.EDIT修改记录默认(3)程序源代码voidCMy7View::OnEdit()//TODO:AddyourcontrolnotificationhandlercodehereCEditDialogdig;if(dlg.DoModal()==IDOK)if(dlg.m_Password!=1234)〃检测密码AfxMessageBox(“你没有权限修改记录!请币:新输入密码:");elseBOOLb=FALSE;m_pSet->MoveFirst();〃从第1条开始do{〃査找学号if(dlg.m_Xuehao!=m_pSet->m_column1)m_pSet->MoveNext();else{〃找到相同的学号m_ListCtrl.DeleteAllltems();m_pSet->Edit();b=TRUE;〃将修改后的记录重新显示m_pSet->m_column1=dlg.m_Xuehao;m_pSet->m_column2=dlg.m_strName;m_pSet->m_column3=dlg.m_Maths;m_pSet->m_column4=dlg.m_English;m_pSet->m_column5=dlg.m_Math;m_pSet->m_column6=dlg.m_CPT;m_pSet->Update();m_pSet->Requery();this->Show();m_pSet->MoveFirst();break;while(!m_pSet->IsEOF());if(b==FALSE)AfxMessageBox("没有此记录)(1)实验结果(2)控件属性表控件类型控件名标题属性StaticBoxIDC_STATIC1省市信息默认StaticBoxIDC_STATIC2代码默认StaticBoxIDC.STATIC3面积默认StaticBoxIDC_STATIC4简介默认StaticBoxIDC_STATIC5所有数据纯属虚构设认EditBoxIDC_NAME—默认EditBoxIDC_REPLACENAME—默认EditBoxIDC_AREA—默认EditBoxIDC_DEMO—默认(3)程序源代码BOOLCMy75View::OnMove(UINTnIDMoveCommand)if(m_bAddModelm_bEditMode)(if(!UpdateData())returnFALSE;trym_pSet->Update();trym_pSet->Requery();}UpdateData(FALSE);m_bAddMode=FALSE;m_bEditMode=FALSE;returnTRUE;)else(returnCDaoRecord::(nIDMoveCommand);)}voidCMy75View::OnRecordDelete()(//TODO:Addyourcommandhandlercodeheretry(m_pSet->Delete();m_pSet->MoveNext();if(m_pSet->IsBOF())m_pSet->SetFieldNull(NULL);UpdateData(FALSE);}catch(CDaoExeption*e)(AfxMessageBox(e->m_pErrorInfo->m_strDescription);e->Delete();voidCMy75View::OnRecordEdit()(//TODO:Addyourcommandhandlercodehereif(m_bAddMode)(MessageBox("先退出增添记录状态!り;return;}else(m_pSet->Edit();m_bEditMode;TRUE;UpdateData(FALSE);voidCMy75View::OnRecordRefresh()(//TODO:Addyourcommandhandlercodehereif(m_bAddModelm_bEditMode)(try{m_pSet->CancelUpdate();}m_pSet->Move();m_bAddMode=FALSE;m_bEdilMode二FALSE;}UpdateData(FALSE);}voidCMy75View::OnRecordAddnew()(//TODO:Addyourcommandhandlercodehereif(m_bEditMode)(MessageBox("先退出编辑模式!");return;}elsem_pSet->AddNew();m_bAddMode二TRUE;UpdateData(FALSE);(1)实验结果(2)控件属性表控件类型控件名标题属性AdodcDataControlIDC_ADODC1记录导航默认DataGridControlIDD_DATAGRID1客户信息默认(3)程序源代码此程序只要在属性里面设置一定的属性,就可以实现这个程序的功能,不需要程序代码。(1)实验结果(2)控件属性表控件类型控件名标题属性ButtonIDC_Sound响铃默认ButtonIDCANCEL取消默认(3) 程序源代码voidCMy81Dlg::OnSound()//TODO:AddyourcontrolnotificationhandlercodehereMessageBeep(MB_OK);}(1) 实验结果(2)控件属性表控件类型控件名标题属性ButtonIDC_OK播放声音默认ButtonIDCANCEL取消默认(3)程序源代码voidCMy82Dlg::OnOK()|//TODO:AddextravalidationhereCDialog::OnOK();sndPlaySound(HE:/midi.wavM,SND_LOOP);3.(i) 实验结果(2)控件属性表控件类型控件名标题属性StaticBoxIDC_STATIC在下面输入wav文件名默认ButtonIDC_PlaySound播放默认ButtonIDCANCEL取消默认EditIDC_EDIT1—默认(3) 程序源代码voidCMy83Dlg::OnPlaySound()//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);intsuccess=PlaySound(m_commandString,NULL,SND_SYNC);if(success)MessageBox(uVeryGood!!**);elseMessageBox(nSorry!Fail!n);

(1)实验结果(2)控件属性表控件类型控件名标题属性图象IDC.FRAME—默认复选框IDDJNNEWWND在ー个新窗口中打开默认按纽IDD_STOP停止默认按纽IDC_BROWSE浏览默认按纽IDOK确定默认(3)程序源代码voidCMy84Dlg::OnBrowse()//TODO:AddyourcontrolnotificationhandlercodehereCFileDialogfd(TRUE,NULL,NULL,OFN.HIDEREADONLYIOFN.OVERWRITEPROMPT/MPEG文件(*.mpg)l*.mpglAV!文件(*.avi)l*.avil所有文件(*.*)ド.・『[NULL);if(m_Playing)MCIWndStop(hMCIWnd);MCIWndDestroy(hMCIWnd);hMCIWnd=O;if(fd.DoModal()==IDOK){m_FileName=fd.GetPathName();if(m_InNewWnd.GetCheck()){hMCIWnd=MCIWndCreate(NULL,AfxGetInstanceHandle(),WS_DLGFRAMEIWS_POPUPIWS_VISIBLEIWS_CAPTIONIMCIWNDF_SHOWNAMEIMCIWNDF_SHOWPOSIMCIWNDF_NOERRORDLGIMCIWNDF

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论