




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
通信与信息工程学院2010/2011学年第2学期课程设计实验报告模块名称VC++软件设计专业网络工程学生班级B080218学生学号B08021804学生姓名张平平指导教师董恒等2011年5月27日目录TOC\o"1-5"\h\z\o"CurrentDocument"基础题 3\o"CurrentDocument"题目1 3\o"CurrentDocument"1、 实验目的 3\o"CurrentDocument"2、 实验内容 3\o"CurrentDocument"3、 实验过程 3\o"CurrentDocument"4、 实验结果及其分析 3\o"CurrentDocument"5、 关键代码 4\o"CurrentDocument"6、 实验中遇到的问题及改进的设想 5\o"CurrentDocument"题目2 5\o"CurrentDocument"1、 实验目的 5\o"CurrentDocument"2、 实验内容 6\o"CurrentDocument"3、 实验过程 6\o"CurrentDocument"4、 实验结果及其分析 7\o"CurrentDocument"5、 关键代码 7\o"CurrentDocument"6、 实验中遇到的问题及改进的设想 8\o"CurrentDocument"题目3 9\o"CurrentDocument"1、 实验目的 9\o"CurrentDocument"2、 实验内容 9\o"CurrentDocument"3、 实验过程 9\o"CurrentDocument"4、 实验结果及其分析 10\o"CurrentDocument"5、 关键代码 10\o"CurrentDocument"6、 实验中遇到的问题及改进的设想 13\o"CurrentDocument"题目4 13\o"CurrentDocument"1、 实验目的 13\o"CurrentDocument"2、 实验内容 13\o"CurrentDocument"3、 实验过程 13\o"CurrentDocument"4、 实验结果及其分析 14\o"CurrentDocument"5、 关键代码 14\o"CurrentDocument"6、 实验中遇到的问题及改进的设想 16\o"CurrentDocument"题目5 16\o"CurrentDocument"1、 实验目的 16\o"CurrentDocument"2、 实验内容 16\o"CurrentDocument"3、 实验过程 17\o"CurrentDocument"4、 实验结果及其分析 17\o"CurrentDocument"5、 关键代码 18\o"CurrentDocument"6、 实验中遇到的问题及改进的设想 20综合题 21\o"CurrentDocument"题目6 21\o"CurrentDocument"1、 实验目的 21\o"CurrentDocument"2、 实验内容 21\o"CurrentDocument"3、 实验过程 21\o"CurrentDocument"4、 实验结果及其分析 22\o"CurrentDocument"5、 关键代码 23\o"CurrentDocument"6、 实验中遇到的问题及改进的设想 32小节 32附录 32基础题题目1基本环境调试改错1、 实验目的在基本环境中调试程序,理解编译错误,运行错误等,掌握基本错误的修改方法,能够自己发现错误,并且改正错误,得出程序运行结果。2、 实验内容将例程1用VC++打开,修改错误使程序能够运行3、 实验过程首先,打开给定的例程1程序Fundl.dsw,编译链接以便检验存在的错误;然后,按照编译指出的错误依次修正程序,直至没有错误(主要是简单的符号错误);最后,运行程序,修改参数,检验结果4、实验结果及其分析测试1:计算100以内的素数并输出测试2:计算500以内的素数并输出运行程序,跳出如图对话框。观察得知,修改后的程序在输入范围参数后,点击Calculate按钮即可计算出范围内的素数个数,并依次显示。点击Quit按钮,对话框关闭。5、关键代码按钮Calculate的响应函数:voidCFund1Dlg::OnButton1()(UpdateData();intPrimes[65536];//存放素数的数组,定义一个尽可能大的数值防止显示不全结果intindex=0;boolflag=true;〃简单的求素数算法for(intm=2;m<=m_limit;m++)(for(inti=2;i<m;i++)(if(m%i==0)(flag=false;break;}elseflag=true;}if(flag==true)Primes[index++]=m;}CWnd*pWnd二GetDlgItem(IDC_STATICOUTPUT);CStringstr;str.Format("%d以内的素数有%d个:\n\n〃,m_limit,index);for(inti=0;i<index;i++)(charbuf[10];sprintf(buf,"%d",Primes[i]);str+=buf;}pWnd->SetWindowText(str);}按钮Quit的响应函数:voidCFund1Dlg::OnButton2()(OnOK();}6、实验中遇到的问题及改进的设想本项实验主要是在基本调试环境中根据给定程序调试程序修改错误,运行程序验证试验结果。实验程序主要涉及了基础基本符号输入错误和符号丢失的现象,如:相等判断使用连等号“二=”,多项嵌套注意“{}”成对出现,这些错误并不复杂,可通过前后语境环境观察修正。根据指示修改程序后,可运行检验。在此过程会发现,当参数范围较小时,不会发现明显错误;但是参数范围较大时,素数个数可判断,一次输出显示出现错误。主要原因是存放素数的数组Primes:]初值定义太小,无法存放个数较多的素数,此时,需把数组初值定义一个尽可能大的值,使其在以后修改参数范围时总能存放所有素数,不影响实验结果,如Primes[65536]。这样修改后,实验即可准确无误的运行。题目2数据库操作1、实验目的学习数据库相关概念、特点和基础知识,了解VC++数据库访问技术、VC++编写数据库应用程序的相关组件以及标准数据库应用程序接口。本次实验项目主要学习ODBC开放数据库互联访问技术。学习掌握ODBC相关类和函数,学会利用Access2003建立数据库,掌握ODBC数据源的创建方法,学会建立数据库关联文档应用程序,详细解析OBDC访问技术。2、实验内容通过ODBC数据源访问数据库(ACCESS),数据库中保存以下内容:学生姓名,性别,年龄,家庭住址,电话,电子邮件,爱好等;再以上基础上进行该记录的读出并可编辑浏览显示。3、实验过程ODBC体系结构个部件组成关系:数据源名将数据传递给应用函数ODBC管理器负责管理数据源名DSN、驱动程序管理器、驱动程序和数据源。驱动程序管理器负责管理ODBC驱动程序和数据源。第一步,建立数据库。利用MicrosoftOfficeAccess2003创建一个名为“STU”的数据库,在此数据库中建立一个名为“学生信息”的表,表项信息依次为学生姓名、性别、年龄、家庭住址、电话、电子邮件、爱好,其中各项属性依次为文本、文本、数字、文本、文本、文本、文本。为表格手动输入几项记录,完善表格内容。第二步,创建ODBC数据源。点击“开始”一“控制面板”一“管理工具”一“数据源(ODBC)”,弹出“ODBC数据源管理器”对话框。选择“添加”,双击“MicrosoftAccessDriver(*.mdb)”,弹出“ODBCMicrosoftAccess安装”对话框,输入数据源名“Student”,说明“学生信息”;单击“选择”,弹出“选择数据库”对话框,从目录中找到自己建立的数据库“STU”,依次点击“确定”。完成数据源“Student”的添加,可以在“ODBC数据源管理器”看到新添加的数据源。第三步,创建应用程序框架。打开VC++,新建一个基于DatabaseViewWithoutFileSupport的单文档程序STU,ODBC数据源选择为“Student”。第四步,为STU程序框架添加函数,完善功能,使程序实现顺序浏览、编辑记录、添加记录、删除记录,并可以保存每次操作。最后,编译程序,调试并修正错误,运行检验结果。4、实验结果及其分析,,,,点击工具栏中代表左右移动的四个三角键,即可浏览其他学生信息。点击“添加记录”按钮,各数据编辑框清空,依次手动输入各项信息,然后点击左右三角上下浏览,输入的信息即可保存在数据库中,存储位置即在之前浏览记录的下一个位置,可打开ACCESS数据库表格检验结果。随便修改对话框显示的某条信息,继续浏览学生信息,则可保存修改结果。点击“删除记录”按钮,当前浏览记录从数据库表格删除,显示下一项信息。兰学生信息学生姓名,1491~年龄•家庭住址,电话'电子邮件,爱好,悸永■一♦ 20江苏省南京市85S66110liyongOsina看书,打篮球孙俊20江苏省南通市B302535O打游戏田里18北京市82S277S0tiant©yahoo看电视王丽20河北省秦皇岛04036620wanglOsina.看书,逛街5、关键代码按钮“添加记录”的响应函数:voidCStuView::OnAdd()(m_pSet->AddNew();//新纪录m_IP=TRUE;//单击了按键CEdit*pCtrl=(CEdit*)GetDlgItem(IDC_NAME);intnResult二pCtrl->SetReadOnly(FALSE);//限制只读UpdateData(FALSE);//更新数据,修改变量值并显示在控件按钮“删除记录”的响应函数:voidCStuView::OnDelete()(try(m_pSet->Delete();//删除}catch(CDBException*e)//捕捉异常(AfxMessageBox(e->m_strError);e->Delete();}m_pSet->MoveNext();//对当前操作移位if(m_PSet->IsEOF())//指针到末尾,如果记录集合的指针在最后一个记录之后,就返回TRUEm_pSet->MoveLast();if(m_PSet->IsBOF())//指针到开头,如果记录集合的指针在第一个记录之前,就返回TRUEm_pSet->SetFieldNull(NULL);UpdateData(FALSE);}添加或编辑记录后的保存函数,左右移时存储数据:BOOLCStuView::OnMove(UINTnIDMoveCommand)(if(m_IP)//判断是否单击按钮(m_IP=FALSE;//未单击UpdateData(TRUE);//将记录从控件取到变量m_pSet中if(m_pSet->CanUpdate())//是否可更新(m_pSet->Update();}m_pSet->Requery();//从更新后的数据库中重新取出记录集UpdateData(FALSE);//将m_pSet中的记录取回到控件中CEdit*pCtrl=(CEdit*)GetDlgItem(IDC_NAME);//恢复姓名只读属性pCtrl->SetReadOnly(TRUE);returnTRUE;}returnCRecordView::OnMove(nIDMoveCommand);}6、实验中遇到的问题及改进的设想本次实验主要是基于数据库的编程。实验中建立了自己的ODBC数据源“Student”,我所建立的数据库表格在上面实验结果及分析截图显示。我所设计的界面添加了编辑框,按钮,静态文本框等控件,如上面实验结果及分析截图所显示。在编辑函数的过程中,我的程序也不是一步成功的,中间出现了多次错误。开始时无法逐项浏览信息,后来无法添加和编辑记录,后来在老师和同学的帮助下逐一解决了这些问题,正确完成实验。实验中有些需要注意的问题:1.注意ODBC数据源的添加途径是否前后一致;2.注意控件名称的设置;3.注意一些静态变量的设置;4.学会改进函数的编辑设计;5.学会查找较为复杂的错误。题目3图形编程1、实验目的学习图形图像的绘制,了解Windows提供的图形设备接口、图形库、图形影射模式、画笔和画刷的使用,掌握一些简单图形的绘制方法,学习主要绘图函数及其调用方法。2、 实验内容提供一个图形工具界面,让用户能够画出直线,椭圆,多边形等几何元素,结果可以保存并可读出。3、 实验过程第一步,建立一个单文本程序。设置均采用默认设置。创建或取得设备环境。第二步,设置绘图属性,包括映射模式等。第三步,创建绘图工具画笔、画刷等(否则用系统默认绘图工具)。第四步,将绘图工具选入设备环境,同时保存原绘图工具。第五步,绘制图形。第六步,恢复原绘图工具并释放获取的设备环境。第七步,检查其他功能的实现,仔细完善各个功能函数。最后,编译程序,调试改错,运行检验结果。4、实验结果及其分析空白新建界面。空白新建界面。点击工具栏中“文件”一“打开”,即可打开、修改保存的画图文本。点击“画笔”,随机选取“点”、“直线”、“椭圆”、“矩形”、“多边形”,在下面画图形,即可显示如图图形。点击“文件”一“保存”,可命名保存所画图形。5、关键代码如果对于view中的图像进行更改(包括打开图像或者对已经有的图片进行操作)时,重新绘画出这幅图像:voidCDrawView::OnDraw(CDC*pDC)(CDrawDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);intnCount;nCount二pDoc->m_obArray.GetSize();for(inti=0;i<nCount;i++)(((CDraw1*)pDoc->m_obArray.GetAt(i))->Draw(pDC);}}每次按下鼠标时,记录鼠标位置:voidCDrawView::OnLButtonDown(UINTnFlags,CPointpoint)(m_point二point;CView::OnLButtonDown(nFlags,point);}鼠标左键松开时的响应函数:voidCDrawView::OnLButtonUp(UINTnFlags,CPointpoint)(CClientDCdc(this);CPenpen(PS_SOLID,1,RGB(255,0,0));//添加一个画笔dc.SelectObject(&pen);CBrush*pBrush二CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//添加一个透明画刷dc.SelectObject(pBrush);switch(m_type)(case1:dc.SetPixel(point,RGB(255,0,0));//画一个点break;case2:dc.MoveTo(m_point);//画一条直线dc.LineTo(point);break;case3:dc.Ellipse(CRect(m_point,point));//画椭圆break;case4:dc.Rectangle(CRect(m_point,point));//画矩形break;case5:dc.Polygon(m_pt,7);//画一个多边形m_pt[0].x=0;m_pt[0].y=250;m_pt[1].x=50;m_pt[1].y=175;m_pt[2].x=100;m_pt[2].y=175;m_pt[3].x=150;m_pt[3].y=250;m_pt[4].x=200;m_pt[4].y=325;m_pt[5].x=250;m_pt[5].y=325;m_pt[6].x=300;m_pt[6].y=250;break;}CDraw1*pDraw1=newCDraw1(m_type,m_point,point);CDrawDoc*pDoc=GetDocument();pDoc->m_obArray.Add(pDraw1);CView—OnLButtonUpSFZgs,point);//得到松开鼠标时的坐标,并完成画从起点到此点}当选中“画笔”下“点”、“直线”、“椭圆”、“矩形”、“多边形”的响应函数:voidCDrawView::OnDian()(m_type=1;}voidCDrawView::OnZhixian()(m_type=2;}voidCDrawView::OnTuoyuan()(m_type=3;}voidCDrawView::OnJuxing()(m_type=4;}voidCDrawView::OnDuobx()(m_type=5;}删除文档的数据,确信一个文档在使用前为空:voidCDrawDoc::DeleteContents()(intnCount;nCount=m_obArray.GetSize();//获得大小数量while(nCount--)(deletem_obArray.GetAt(nCount);//从返回值中第nCount个字符开始删除m_obArray.RemoveAt(nCount);}CDocument::DeleteContents();}存储处理(在新增类中实现函数功能):voidCDraw1::Serialize(CArchive&ar)(if(ar.IsStoring())(ar<<m_type<<m_point<<point;}else(ar>>m_type>>m_point>>point;}}新增类中的绘图响应函数:voidCDraw1::Draw(CDC*pDC)(CPenpen(PS_SOLID,1,RGB(255,0,0));CPen*pOldPen=pDC->SelectObject(&pen);CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CBrush*pOldBrush=pDC->SelectObject(pBrush);switch(m_type)(case1:pDC->SetPixel(point,RGB(255,0,0));break;case2:pDC->MoveTo(m_point);pDC->LineTo(point);break;case3:pDC->Ellipse(CRect(m_point,point));break;case4:pDC->Rectangle(CRect(m_point,point));break;case5:pDC->Polygon(m_pt,7);m_pt[0].x=0;m_pt[0].y=250;m_pt[1].x=50;m_pt[1].y=175;m_pt[2].x=100;m_pt[2].y=175;m_pt[3].x=150;m_pt[3].y=250;m_pt[4].x=200;m_pt[4].y=325;m_pt[5].x=250;m_pt[5].y=325;m_pt[6].x=300;m_pt[6].y=250;break;}pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}6、实验中遇到的问题及改进的设想本项实验开始,在查询图书馆资料的基础上,很快实现了点、直线、椭圆、矩形、多边形的绘制,但是如何保存和打开已画文档始终无法实现,困惑了我很长时间。后来,我查询了其他包括网上的共享资料,终于通过新增了一个类添加功能函数的方法较为完善的完成了这个功能。但是,我的程序还存在一点不足,画的多边形只能固定一种结构,一个固定位置,没有实现随意绘制,保存格式固定,希望以后能得到改进。题目4字符串操作1、 实验目的掌握字符操作,学习字符串的统计方法,能够编程实现文本文档的打开和读入,巩固程序设计和函数编写的方法。2、 实验内容能够从磁盘上选择打开文本文档,读入所有内容并显示,统计所有的字符数目,单词数目,中文字符串的数目3、 实验过程第一步,建立单文档程序框架。第二步,添加响应函数,实现文档读入,字符统计,初始化和显示。通过新增一个对话框类,实现跳出对话框显示统计结果。第三步,编译程序,逐步调试,修正错误,直至达到所需功能。
4、实验结果及其分析58test.txt-zfc1■=■回 sg|文件旧煽事〔el 帮助[H]统计□月□|E昭sTf我是中国人.i'mastudent.字符串统计所有字符数I®运行程勤矗出text^xt-zfc运行程勤矗出text^xt-zfc操作框选择“文件”笑“打开”,即可以才选择“统计”一“开始统计”,即跳出如显示的是空白文档。即可以打开一个图文本文档。对话框,显示统计结果。“所有字符数”包括文档中所有字符、标点符号和空格;“中文字符数”包括汉字个数和中文标点符号;“英文单词数”为英文单词个数。5、关键代码设置滚动视图的逻辑尺寸和映射模式,第一次调用OnDraw前会调用:voidCZfcView::OnInitialUpdate()//初始化视图中控件(CScrollView::OnInitialUpdate();//初始化Scroll的相关属性值CSizesizeTotal(50,50);//水平滚动条滚动范围:50,垂直滚动条滚动范围:50SetScrollSizes(MM_TEXT,sizeTotal);//MFC库函数,设置滚动条属性}/*类CSize是对Windows结构SIZE的封装,凡是能用SIZE结构的地方都可以用CSize代替。结构SIZE表示一个矩形的长度和宽度*/显示函数:voidCZfcView::Display(CDC*pDC)(CZfcDoc*pDoc-GetDocUment();//定义一个指向doc类对象的指针指向本工程doc对象intnLines=pDoc->m_string.GetSize();//GetSize返回元素的数目if(nLines<1)return;CSizesizeLine=pDC->GetTextExtent(〃A〃);//获取字符串的宽度和高度intnTabChars=4*sizeLine.cx;//设置一个Tab符等于4个字符inty=0;//行位置CStringstr;intnWidthMax=0;for(inti=0;i<nLines;i++)(str=pDoc->m_string.GetAt(i);//得到i对应的元素值CSizesize=pDC->TabbedTextOut(0,y,str,1,&nTabChars,0);y=y+sizeLine.cy;//更新行位置if(nWidthMax<size.cx)nWidthMax=size.cx;//更新最大宽度}SetScrollSizes(MM_TEXT,CSize(nWidthMax,y));//设置滚动视图逻辑尺寸映射模式}统计字符串的总字符数,英文单词数,中文字符数:voidCZfcView::OnStatistic(){CZfcDoc*pDoc=GetDoCUment(),//定义一个指向doc类对象的指针指向本工程doc对象intnLines=pDoc->m_string.GetSize();//GetSize返回元素的数目if(nLines<1)return;CStringline;charch;boolm_IP=true;//true表示字符是单词首字符,longnT=0,nC=0,nE=0;for(inti=0;i<nLines;i++)(line=pDoc->m_string.GetAt(i);//得到i对应的元素值for(intj=0;j<line.GetLength();j++)//line.GetLength()获得字符串长度(nT=nT+1;ch=line.GetAt(j);if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//该字符为字母(if(m_IP)//表示字符是单词首字符(nE=nE+1;}m_IP=false;}else(m_IP=true;}if(ch<0) //字符为汉字(nC=nC+1;j++; }}}CDialog1pc;pc.m_total=nT;pc.m_chinese=nC;pc.m_english=nE;pc.DoModal();}新建对话框类,定义初始化函数:CDialog1::CDialog1(CWnd*pParent/*=NULL*/):CDialog(CDialog1::IDD,pParent)(m_english=0;m_chinese=0;m_total=0;}点击“打开”或“保存”的响应函数:voidCZfcDoc::Serialize(CArchive&ar)//读取该对象或写入该对象(if(ar.IsStoring())//读入( }else//输出( }CStringstr;while(ar.ReadString(str))//读出一行文本(m_string.Add(str);//Add在数组的末尾添加一个元素}//对象存入}6、实验中遇到的问题及改进的设想本程序在设计过程中,开始时较为容易的设计出了统计功能。然后同上一题一样在读取文档功能处略有被阻挡,好在已经有过一次经验,所以在认真读取资料之后,通过编写调试,慢慢成功实现了该功能。在统计功能的设计中,有一个较为特色的地方就是,通过弹出一个对话框显示字符的统计结果。这个功能主要是通过新增一个对话框类CDialog1,在统计响应函数OnStatistic()的末尾定义一个CDialog1的对象,将统计结果赋值给新对象,调用对话框类而实现的。本程序存在的一点问题就是,可以实现打开文档统计字符,在打开第二个文档时不是新建一个窗口打开,而是在原窗口上叠加,所以字符统计的结果也是两个文档相加的结果,有些缺憾。题目5控件编程1、 实验目的了解ActiveX的基本概念、开发方法、发展基础。了解ATL基础知识,常用类和库。学会用ATL开发普通ActiveX控件,掌握如何添加控件、添加属性、添加事件、添加连接点接口、添加属性页对象。掌握ATL控件的编写方法,测试方法和调用方法。2、 实验内容利用ATL编写一个控件,并写一个测试程序进行调用;控件执行绘制圆及在圆内添加多边形的操作,可以改变多边形的边数,填充色。
2、实验过程第一步,新建一个ATL工程。使用应用程序向导创建ATL框架,VC++的“File”一“New”,选择“ATLCOMAppWizard”,其他选项均为默认设置;对框架进行简单分析。第二步,向ATL项目添加ActiveX控件。“Insert”一"NewATLObject”,弹出“ATLObjectAppWizard”对话框。在“Category”选中“Controls”,选择“FullControl”,在“Name”填写控件名称,在“Attributes”选中“SupportISupportErrorInfo”和“SupportConnectionPoints”选项,在“StockProperties”添加“BackgoundColor”和“FillColor”。第三步,往ActiveX控件添加属性。在控件接口单击鼠标右键,选择“AddProperty”,添加边数属性“Slides”,添加函数实现属性。第四步,修改绘制代码。添加计算多边形顶点的函数,对填充色进行初始化,修改函数实现改变边数时更新控件。第五步,为控件添加事件。在形式为“I控件名Events”接口右击鼠标右键,选择“AddMethod”,添加“ClickIn”和“ClickOut”函数。添加连接点接口,添加激发事件的代码。第六步,给控件添加属性页。添加属性页对象,“Insert”一"NewATLObject”,弹出“ATLObjectAppWizard”对话框。在“Category”选中“Controls”,选择“PropertyPage”,在“Name”填写名称,在“Strings”输入控件标题,属性,其余空白。添加属性页映射,响应函数。第七步,测试程序。“Tools”一"ActiveXControlTestContainer”,测试事件、属性。4、实验结果及其分析在控件测试窗口,选择“File”一"Register”,选择自己生成的控件登记。然后选择“Edit”一"InsertNewControl”,选择自己的控件。可观察到空间显示如上左图。分别在多边形内和多边形外点击鼠标,分别响应“ClickIn”和“ClickOut”,显示记录如图上下面的记录。选择“Control”一"InvokeMethods”,可对圆的内接多边形边数进行设置。选择“Edit”一"Properties”,可对圆填充色进行设置,显示如第二幅图。5、关键代码STDMETHODIMPCPolyCtl::get_Slides(short*pVal)//获得属性值(*pVal=m_nSides;returnS_OK;}STDMETHODIMPCPolyCtl::put_Slides(shortnewVal)//设置属性值(if(newVal>=3&&newVal<=100)(m_nSides二newVal;FireViewChange();//改变边数后,刷新控件returnS_OK;}elsereturnError(_T("圆内接正多边形的边数必须在3~100之间!"));}voidCPolyCtl::CalcPoint(constRECT&rc)//计算顶点的函数(constdoublepi=3.14159265358979;POINTptCenter;doubledblRadiusx=(rc.right-rc.left)/2; 〃圆的两个轴doubledblRadiusy=(rc.bottom-rc.top)/2; //doubledblAngle=3*pi/2; 〃在顶部开始doubledblDiff=2*pi/m_nSides;//AngleeachsidewillmakeptCenter.x=(rc.left+rc.right)/2; //点到圆心的位置ptCenter.y=(rc.top+rc.bottom)/2; 〃每一边计算点for(inti=0;i<m_nSides;i++){m_arrPoint[i].x=(long)(dblRadiusx*cos(dblAngle)+ptCenter.x+0.5);m_arrPoint[i].y=(long)(dblRadiusy*sin(dblAngle)+ptCenter.y+0.5);dblAngle+=dblDiff;}}HRESULTCPolyCtl::OnDraw(ATL_DRAWINFO&di)//绘制函数(RECT&rc=*(RECT*)di.prcBounds;HDChdc=di.hdcDraw;COLORREFcolFore;HBRUSHhOldBrush,hBrush;HPENhOldPen,hPen;OleTranslateColor(m_clrFillColor,NULL,&colFore);hPen=(HPEN)GetStockObject(BLACK_PEN);//新画笔 准备画圆hOldPen=(HPEN)SelectObject(hdc,hPen);//保存旧画笔hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);//新画刷hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);//保存旧画刷Ellipse(hdc,rc.left,rc.top,rc.right,rc.bottom);//画MhBrush二CreateSolidBrush(colFore);//创建画刷 准备画多边形SelectObject(hdc,hBrush);//画刷选入设备CalcPoint(rc);//计算顶点Polygon(hdc,&m_arrPoint[0],m_nSides);//画多边形SelectObject(hdc,hOldPen);//恢复旧画笔SelectObject(hdc,hOldBrush);//恢复旧画刷DeleteObject(hBrush);//删除创建的画刷returnS_OK;}LRESULTOnLButtonDown(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled) 〃激发事件(HRGNhRgn;WORDxPos二LOWORD(lParam);//水平位置的光标WORDyPos二HIWORD(lParam);//垂直位置的光标CalcPoint(m_rcPos);//从我们的点名单创建一个地区hRgn二CreatePolygonRgn(&m_arrPoint[0],m_nSides,WINDING);//CreatePolygonRgn()创建一个由一系列点围成的区域//如果点击多边形点是在我们的多边形内,响应ClickIn事件,否则我们响应CilckOut事件if(PtInRegion(hRgn,xPos,yPos))Fire_ClickIn(xPos,yPos);elseFire_ClickOut(xPos,yPos);DeleteObject(hRgn);//删除该我们制造的地区return0;}VOIDFire_ClickIn(LONGx,LONGy) //响应在多边形内点击的函数(T*pT=static_cast<T*>(this);intnConnectionIndex;CComVariant*pvars=newCComVariant[2];intnConnections=m_vec.GetSize();for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex++)(pT->Lock();CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex);pT->Unlock();IDispatch*pDispatch=reinterpret_cast<IDispatch*>(sp.p);if(pDispatch!=NULL)(pvars[1].vt=VT_I4;pvars[1].lVal=x;pvars[0].vt=VT_I4;pvars[0].lVal=y;DISPPARAMSdisp=(pvars,NULL,2,0);pDispatch->Invoke(0x1,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&disp,NULL,NULL,NULL);}}delete口pvars;}VOIDFire_ClickOut(LONGx,LONGy)〃响应在多边形外点击的函数(T*pT=static_cast<T*>(this);intnConnectionIndex;CComVariant*pvars=newCComVariant[2];intnConnections=m_vec.GetSize();for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex++)(pT->Lock();CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex);pT->Unlock();IDispatch*pDispatch=reinterpret_cast<IDispatch*>(sp.p);if(pDispatch!=NULL)(pvars[1].vt=VT_I4;pvars[1].lVal=x;pvars[0].vt=VT_I4;pvars[0].lVal=y;DISPPARAMSdisp=(pvars,NULL,2,0};pDispatch->Invoke(0x2,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&disp,NULL,NULL,NULL);}}delete[]pvars;}6、实验中遇到的问题及改进的设想本次实验使用ATL开发了一个较为简单的ActiveX控件,学会了创建ATL项目,添加控件、属性、事件等等。在参考资料的帮助下,控件程序的编写较为顺利,逐项实现了各个内容的添加,响应函数的编写。但是遇到了比较复杂的问题就是程序编译成功无误,但是无法对生成的控件进行注册。最后的解决办法是,将编译链接控件的版本改为ReleaseUMinDependency而不是Debug,去掉宏_ATL_MIN_CRT(引入了不需要的CRun-Time库)。在多次尝试下,终于能用ActiveXControlTestContainer检测控件。综合题题目6文件编辑1、 实验目的学习有关文件与文档操作的方法,学习各种文件类及其派生类的各种操作,了解流类和CFile类的基础知识,掌握文件的打开、关闭和读写,掌握文件的搜索、查找、替换和定位。掌握编写复杂、规模较大的程序的能力,学会分析程序功能,逐步分层实现程序内容,将复杂的要求分解为各项小功能,最终实现整体要求。2、 实验内容创建一个多文档工程,实现对于磁盘文件的浏览,编辑等功能。能够以文本文件,二进制文件方式打开文件;支持剪贴板功能;支持搜索,查找,替换功能;支持文件定位。功能可参考:磁盘文件工具程序UltraEdit。3、 实验过程
首先,建立一个基于多文档处理的VC++MFC程序框架。然后,将实验要求逐个分解为单项简单功能,依次设计各项功能函数。第三,为每项功能设计实现方法、调用方法。第四,逐个实现功能,按部完成实验要求。最后,编译程序,调试错误,使程序准确无误的展示运行结果。4、实验结果及其分析测试一:以文本和二进制方式显示文件测试二:文件查找测试三:文件定位运行程序,可跳出如上测试一的运行框,初始定义一段文本,以文本方式和二进制方式显示出来。选择“文件”f“打开”,可在以上基础上打开一个新窗口,实现多文档处理的要求,打开的文件也以两种方式显示文件。选择“文件操作”一“文件查找”,弹出测试二的对话框,浏览查找目录,选择目的文件,即可进行文件查找。选择“文件操作”一“文件定位”,弹出测试三的对话框,点击“开始“,即可对文本文档"text.txt”进行定位。选择“文件操作”一“文件替换”,弹出测试四的对话框,输入原字符串、替换字符串,即可对文件进行字符串替换。除此之外,还可以使用剪贴板的复制粘贴功能。5、关键代码⑴文件查找的实现浏览查找目录的响应函数:voidCSearchDlg::OnAdd(){BROWSEINFObi;charbuffer[MAX_PATH];ZeroMemory(buffer,MAX_PATH);bi.hwndOwner=GetSafeHwnd();//获取窗口句柄bi.pidlRoot=NULL;bi.pszDisplayName=buffer;bi.lpszTitle="选择一个文件夹";bi.ulFlags=BIF_EDITBOX;bi.lpfn=NULL;bi.lParam=0;bi.iImage=0;LPITEMIDLISTpList=NULL;if((pList=SHBrowseForFolder(&bi))!=NULL)//显示浏览窗口{charpath[MAX_PATH];ZeroMemory(path,MAX_PATH);SHGetPathFromIDList(pList,path);GetDlgItem(IDC_EDADD)->SetWindowText(path);}}文件查找的响应函数:voidCSearchDlg::OnFind(){CStringstrpath;GetDlgItem(IDC_EDFILENAME)->GetWindowText(strFilename);GetDlgItem(IDC_EDADD)->GetWindowText(strpath);OnSearch(strpath);bstop=FALSE;文件查找时的调用函数,实现具体查找:voidCSearchDlg::OnSearch(CStringstrPath){CStringstrtemp,m_filelist;if(strPath.Right(1)!="\\")strtemp.Format("%s\\*.*",strPath);elsestrtemp.Format("%s*.*",strPath);CFileFindfindfile;BOOLbfind=findfile.FindFile(strtemp);//查找文件while(bfind){ bfind=findfile.FindNextFile();//查找下一个文件if(strFilename==findfile.GetFileName()){m_filelist=findfile.GetFilePath();}if(findfile.IsDirectory()&&!findfile.IsDots()){OnSearch(findfile.GetFilePath());}if(bstop)return;}SetDlgItemText(IDC_EDIT3,strtemp);}视图类中对文件查找对话框类的调用:voidCFileView::OnSearch(){CSearchDlgdlg;intnResult=dlg.DoModal();}⑵文件定位的实现进行文件定位:voidCSampleDlg::OnSample(){charstring0[10];charstring1[10];charstring2[10];//三个数组用于存放取样数据CFilefile;if(!file.Open("D:\\学习课件\\大三下\\软件设计\\综合4File\\text.TXT",CFile::modeRead,NULL)) 〃打开文件{ MessageBox("打开文件操作失败","信息提示",MB_OK);}else{memset(string0,0,10);memset(string1,0,10);memset(string2,0,10);//将数列清零file.Seek(12,CFile::current);//定位到数据中部file.Read(string1,2);file.SeekToBegin();file.Read(string0,2);//定位到数据头部file.SeekToEnd();file.Seek(-4,CFile::end);file.Read(string2,2);//定位到尾部SetDlgItemText(IDC_EDTOP,string0);SetDlgItemText(IDC_EDMID,string1);SetDlgItemText(IDC_EDTAIL,string2);file.Close();}}视图类中对文件定位对话框类的调用:voidCFileView::OnSample(){CSampleDlgdlg1;intnResult1=dlg1.DoModal();}⑶文件替换的实现文件字符串开始替换的响应函数:voidCReplaceDlg::OnREstart(){CStringstName="D:\\学习课件\\大三下\\软件设计\\FileWtext1.TXT";CFileRfile;CStringstrY,strX;if(!Rfile.Open(stName,CFile::modeCreate|CFile::modeReadWrite,NULL)){ MessageBox("打开文件操作失败","信息提示",MB_OK);}else{GetDlgItem(IDC_EDY)->GetWindowText(strY);GetDlgItem(IDC_EDX)->GetWindowText(strX);CStringStrResult;StrResult.Format("—共完成%d次替换操作”,ReplaceText(stName,strYstrX));SetDlgItemText(IDC_EDR,StrResult);Rfile.Close();}CReplaceDlg::OnREstart();}文件替换中调用的具体函数:intCReplaceDlg::ReplaceText(CStringstName,CStringstrY,CStringstrX){CStdioFileTempFile,sFile;intCCount=0;if(!sFile.Open(stName,CFile::modeRead),NULL)//打开文件{ MessageBox("打开文件操作失败","信息提示",MB_OK);}CStringStrTempFileName=sFile.GetFileTitle()+".tmp”;if(!TempFile.Open(StrTempFileName,CFile::modeCreate|CFile::modeReadWrite),NULL)//打开文件{ MessageBox("打开文件操作失败","信息提示",MB_OK);}CStringss;while(sFile.ReadString(ss)){CCount+=ss.Replace(strY,strX);TempFile.WriteString(ss+"\n");}sFile.Close();TempFile.Close();CFile::Remove(stName);CFile::Rename(StrTempFileName,stName);returnCCount;}视图类中对文件替换对话框类的调用:voidCFileView::OnReplace(){//TODO:AddyourcommandhandlercodehereCReplaceDlgdlg2;intnResult2=dlg2.DoModal();}⑷以文本方式、二进制方式打开文件的实现:定义初始文档内容:BOOLCFileDoc::OnNewDocument(){ if(!CDocument::OnNewDocument())returnFALSE;sprintf(m_pBuf,"我是南京邮电大学的学生。你好!aaaaaaaaaaa ");((CFileView*)m_viewList.GetHead())->SetText(m_pBuf,strlen(m_pBuf));returnTRUE;}显示内容:voidCFileView::OnDraw(CDC*pDC){CRectrc;GetClientRect(rc);if(m_text==NULL){pDC->FillRect(rc,&CBrush(RGB(255,255,255)));return;}CDCdc;dc.CreateCompatibleDC(pDC);CBitmapbm;bm.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());dc.SelectObject(bm);dc.SetBoundsRect(&rc,DCB_DISABLE);CFontfont;font.CreateFont(m_LineHeight,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITYFIXED_PITCH|FF_MODERN,0);CFont*oldFont=dc.SelectObject(&font);CBrushbkBrush(RGB(255,255,255));dc.FillRect(rc,&bkBrush);UINTlineCY,lineCX;UINTdwPos;charcurrentchar[20];UCHARtext[17];intlineBeginPos;m_HexStart=m_CharWidth*(14-m_LeftChar);〃计算二进制显示开始位置m_TextStart=m_HexStart+m_CharWidth*50;//计算ASCII码显示开始位置for(UINTi=0;i<m_PageRows;i++) 〃按行显示数据{ lineBeginPos=(m_TopLine+i-1)*16;〃计算当前行开始字符相对于总缓冲区的位置lineCY=i*m_LineHeight; 〃当前行的Y坐标sprintf(currentchar,"%08Xh:",lineBeginPos);dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));dc.SetBkColor(RGB(255,255,255));dc.TextOut(m_CharWidth*(2-m_LeftChar),lineCYcurrentchar);//显示地址基值memcpy(text,&m_text[lineBeginPos],16);〃取当前行数据text[16]='\0';for(intl=0;l<16;l++){if(text[l]<32)text[l]=46;//不可见ASCII字符用.表示}if(lineBeginPos+16>m_CharCount){text[m_CharCount%16]='\0';//最后的数据不满一行时}dc.TextOut(m_TextStart,lineCYtext);//显示右面的ASCII字符〃被选中时反色显示右面的ASCII字符intselStart=(m_SelStart-lineBeginPos)<0?0:(m_SelStart-lineBeginPos);intselEnd=(m_SelEnd-lineBeginPos)>15?15:(m_SelEnd-lineBeginPos);if(selStart<=15&&selEnd>=0){dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));text[selEnd+1]='\0';dc.TextOut(m_TextStart+selStart*m_CharWidth,lineCY&text[selStart]);}else{dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));dc.SetBkColor(RGB(255,255,255));}for(UINTj=0;j<16;j++){dwPos=j+lineBeginPos;if(dwPos>(m_CharCount-1))gotobitblt; 〃显示完最后一行退出if(dwPos>=m_SelStart&&dwPos<=m_SelEnd){dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));}else{ dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));dc.SetBkColor(RGB(255,255,255));} 一lineCX=m_HexStart+j*m_CharWidth*3;//计算当前要显示的二进制字符的位置sprintf(currentchar,"%02X",((UCHAR*)m_text)[dwPos]);dc.TextOut(lineCX,lineCY,currentchar);〃显示二进制字符if(dwPos==m_SelEnd)〃选中单个字符的显示{ dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));dc.SetBkColor(RGB(255,0,0));UCHARcHex=m_text[dwPos];if(m_bFirst)//二进制字符的高四位选中{cHex=cHex&0xf0;cHex=cHex>>4;sprintf(currentchar,"%X",cHex);dc.TextOut(lineCX,lineCY,currentchar);}else{lineCX=m_HexStart+j*m_CharWidth*3+m_CharWidth;cHex=cHex&0x0f;sprintf(currentchar,"%X",cHex);dc.TextOut(lineCX,lineCY,currentchar);}}}}bitblt:pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dc,0,0,SRCCOPY);dc.DeleteDC();}文本处理:voidCFileView::SetText(char*input,intlen){m_text=input;m_CharCount=len;m_Rows=m_CharCount/16;m_TopLine=1;m_LeftChar=0;m_SelStart=0;m_SelEnd=0;m_StartDrag=FALSE;m_bFirst=TRUE;CFontfont;m_LineHeight=16;font.CreateFont(m_LineHeight,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITYFIXED_PITCHIFF_MODERN,0);CFont*oldFont=GetDC()->SelectObject(&font);CSizesize=GetDC()->GetTextExtent("A");m_LineHeight=size.cy;m_CharWidth=size.cx;GetPageRowCols();SetVertScrollBar();SetHorzScrollBar();}键盘的上下左右键处理:BOOLCFileView::PreTranslateMessage(MSG*pMsg){if(pMsg->message==WM_KEYDOWN){switch(LOWORD(pMsg->wParam)){caseVK_LEFT:OnCharLeft();break;caseVK_RIGHT:OnCharRight();break;caseVK_UP:OnLineUp();break;caseVK_DOWN:OnLineDown();break;default:break;}}returnCView::PreTranslateMessage(pMsg);}处理滚动条消息:voidCFileView::OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar){CView::OnHScroll(nSBCode,nPos,pScrollBar);SCROLLINFOsi;si.cbSize=sizeof(si);si.fMask=SIF_ALL;VERIFY(GetScrollInfo(SB_HORZ,&si));switch(nSBCode){caseSB_LEFT:m_LeftChar=0;break;caseSB_BOTTOM:m_LeftChar=80-m_PageCols+1;break;caseSB_LINEUP:m_LeftChar=m_LeftChar-1;break;caseSB_LINEDOWN:m_LeftChar=m_LeftChar+1;break;caseSB_PAGEUP:m_LeftChar=m_LeftChar-si.nPage+1;break;caseSB_PAGEDOWN:m_LeftChar=m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药物分析考试模拟题及答案
- 医疗核心制度练习题(附答案)
- 广告制作及发布代理合同
- 战略合作协议策划及合同书
- 工业废气治理工程合同
- 乐至县乾润招商服务有限公司招聘岗位工作人员(8人)笔试参考题库附带答案详解
- 2025辽宁沈阳市城市建设投资集团有限公司所属企业沈阳新基发展有限公司招聘16人笔试参考题库附带答案详解
- 2025广东湛江经济技术开发区建设投资发展集团有限公司招聘1人笔试参考题库附带答案详解
- 2025宁夏银川威力传动技术股份有限公司招聘811人笔试参考题库附带答案详解
- 2025中国电气装备集团数字科技有限公司招聘28人笔试参考题库附带答案详解
- 过程控制实验指导书讲解
- 安徽钢结构人行天桥施工方案
- 玻璃马蹄焰池窑课程设计说明书
- 形势与政策(吉林大学)智慧树知到答案章节测试2023年
- 黎民公共管理学考研笔记
- 《人工智能导论:模型与算法》习题答案及期末试题
- GB/T 29497-2017高沸点芳烃溶剂
- GB/T 223.14-2000钢铁及合金化学分析方法钽试剂萃取光度法测定钒含量
- 水池(水箱)清洗记录
- GA 898-2010大型焰火燃放作业人员资格条件及管理
- 理综答题“秘诀”课件
评论
0/150
提交评论