第一篇:socket编程实验心得体会
实验心得体会
在本次实验中,我通过对网络课上所学知识的应用,学到了很多实践中的知识。并且加深了我对课本知识的理解和认识,在实验过程中,更容易记忆和深入理解各种协议的工作以及在网络编程中应该注意的一系列问题。
我们的第一个实验是对ARP、ICMP、FTP和HTTP协议的分析和验证。在利用软件Etherpeek抓取在主机通信中的报文,得到了很多的关于这些协议的具体参数。在课程学习过程中,书本和老师给我的感觉就是太枯燥,通过课本的学习根本没有办法理解各种协议的工作细节。有很多的细微之处是想不通的。但是,在本次实验中,我就通过各种报文的分析,看到了网络中不同层次协议之间的协做过程。对应不同层之间就是通过协议来使用,我对整个网路的大体架构有了一个统筹的了解,虽然对很多的更深入的知识不是很了解,但是比我在课上学的东西要更有趣,而且容易学习,更能够我学习的兴趣。
第二个实验是Socket编程实验。在编写网络程序之前,我对网路通信可以说一无所知,根本不知道那些网路上的程序是怎么通过网路进行通信的。在本次实验中,终于揭开了他们神秘的面纱。当然在实验中出现了很多的插曲,我是在Linux环境下编写的程序,很多技术方面的问题都无法解决。查阅书籍和网上咨询才弄懂了他们的来龙去脉,最终是将我的程序编写完了。开始接触网路编程时,那是一头雾水,根本不知从何下手。在看了辅导教员给我们程序之后才有了很多的起色,才能够自己编写程序。在网络编程中,我最深的体会就是对具体的内部细节不熟悉,导致在调试的过程中感觉到很无力。在很多函数的作用下,经常就是一团乱麻。之后,我每次编写之前就是将用到的函数的用法温习一下,最后还是能够解决很多的问题的。
本次试验是我们学习网路的第一次。以前的课程从来没有接触到网路方面的知识。这次的新知识对我们的挑战还算不是太大,通过我们的努力,所有的困难时被克服掉了。其实,实验应该是我们的重点,在以后的工作中要的就是我们的实际的动手能力,如果我们在学习期间就是只学了书本上的知识,那样对理论的了解是不够深刻的,只有通过实验才能激发我们的学习兴趣。总之,我觉得实验才是检验理论的唯一标准。
第二篇:计算机网络实验报告(路由算法、Socket编程)
计算机网络实验报告
班级: 姓名: 学号:
实验一
一. 实验目的及要求
编写程序,模拟距离矢量路由算法的路由表交换过程,演示交换后的路由表的变化。
二. 实验原理
距离矢量路由算法是这样工作的:每个路由器维护一张路由表(即一个矢量),它以网络中的每个路由器为索引,表中列出了当前已知的路由器到每个目标路由器的最佳距离,以及所使用的线路。通过在邻居之间相互交换信息,路由器不断地更新他们的内部路由表。
举例来说,假定使用延迟作为“距离”的度量标准,并且该路由器发送一个列表,其中包含了他到每一个目标路由器的延时估计值;同时,他也从每个邻居路由器接收到一个类似的列表。假设一个路由器接收到来自邻居x的一个列表,其中x(i)表示x估计的到达路由器i所需要的时间。如果该路由器知道他到x的延时为m毫秒,那么他也知道在x(i)+m毫秒之间内经过x可以到达路由器i。一个路由器针对每个邻居都执行这样的计算,就可以发现最佳的估计值,然后在新的路由器表中使用这个最佳的估计值以及对应的输出路线。
三.源程序:
#include “stdio.h” #include “stdlib.h” #include “malloc.h” #include “graphics.h” #include “dos.h” #define VERNUM 7
typedef struct {
int dis;
int flag;
int flag2;}RoutNode;
char tmp[10];RoutNode data[VERNUM][VERNUM];
void welcome();
void InitRoutData(FILE* pfile);
void PrintRoutData();
void SendInf(int recv, int send);
void Exchange();
int main(){
int start, end, i, j, m, n;
FILE *pfile;
welcome();
pfile = fopen(“1.txt”, “r”);
if(pfile == NULL)
{
printf(“the file wrong,press any key to come back.n”);
getch();
return;
}
else
InitRoutData(pfile);
fclose(pfile);
printf(“nthe original route table:n”);
for(i = 0;i { printf(“%c||”, i + 65); for(j = 0;j < VERNUM;j++) if(data[i][j].dis > 0) printf(“<%c %d> ”, j + 65, data[i][j].dis); printf(“n”); } PrintRoutData(); getch(); for(i = 0;i < VERNUM;i++) { for(m = 0;m < VERNUM;m++) for(n = 0;n < VERNUM;n++) data[m][n].flag = 0; Exchange(); PrintRoutData(); getch(); } printf(“nexchange the route table:n”); return 0;} void welcome(){ int gdriver=DETECT,gmode; registerbgidriver(EGAVGA_driver); initgraph(&gdriver, &gmode,“C:Win-TC”); cleardevice(); setbkcolor(CYAN); setviewport(0,0,639,479,1); clearviewport(); setbkcolor(BLUE); setcolor(14); rectangle(200,200,440,280); setfillstyle(1,5); floodfill(300,240,14); settextstyle(0,0,2); outtextxy(50,30,“Distance Vector Routing Algorithm”); setcolor(15); settextstyle(1,0,4); outtextxy(260,214,“Welcome to use!”); line(0,80,640,80); getch(); delay(300); cleardevice();} void InitRoutData(FILE* pfile){ char num[10]; int i = 0; char c; int m, n; fseek(pfile, 0, 0); for(m = 0;!feof(pfile)&& m < 7;m++) { for(n = 0;!feof(pfile)&& n < 7;n++) { while(!feof(pfile)) { c = fgetc(pfile); if(c == ',') { num[i] = ' '; data[m][n].dis = atoi(num); data[m][n].flag = 0; data[m][n].flag = 0; i = 0; break; } /*end of if*/ else if((c >= '0' && c <= '9')|| c == '-') { num[i++] = c; } /*end of else if*/ } /*end of while*/ } /*end of for(n = 0*/ } /*end of for(m = 0*/ } void PrintRoutData(){ int i, j; for(i = 0;i < VERNUM;i++) { settextstyle(1,0,3); sprintf(tmp,“ %c”,i + 65); outtextxy(i*80+50,130,tmp); outtextxy(10,160+i*40,tmp); } for(j = 0;j< VERNUM;j++) { for(i = 0;i < VERNUM;i++) { if(data[i][j].dis <= 0&&i!=j) { if(data[i][j].flag2 ==1) { setfillstyle(SOLID_FILL,5); bar(80*i+50,40*j+155,80*i+120,40*j+185); delay(50000); data[i][j].flag2 =0; } setfillstyle(SOLID_FILL,3); bar(80*i+50,40*j+155,80*i+120,40*j+185); settextstyle(1,0,2); sprintf(tmp,“-”); outtextxy(80*i+65,40*j+165,tmp); } else if(data[i][j].dis >=0) { if(data[i][j].flag2 ==1) { setfillstyle(SOLID_FILL,5); bar(80*i+50,40*j+155,80*i+120,40*j+185); delay(50000); data[i][j].flag2 =0; } setfillstyle(SOLID_FILL,3); bar(80*i+50,40*j+155,80*i+120,40*j+185); settextstyle(1,0,2); sprintf(tmp,“%d”,data[i][j].dis); outtextxy(80*i+65,40*j+165,tmp); } } /*end of for(j = 0*/ } /*end of for(i = 0*/ } void SendInf(int recv, int send){ int i; for(i = 0;i < VERNUM;i++) { if(data[send][i].dis > 0&& data[send][i].flag!=1) { if(data[recv][i].dis <= 0&&recv!=i) { data[recv][i].dis = data[send][i].dis + data[recv][send].dis; data[recv][i].flag =1; data[recv][i].flag2 =1; } else if(data[recv][i].dis > data[send][i].dis + data[recv][send].dis) { data[recv][i].dis = data[send][i].dis + data[recv][send].dis; data[recv][i].flag =1; data[recv][i].flag2 =1; } } /*end of if*/ } /*end of for*/ } void Exchange(){ int i, j; for(i = 0;i < VERNUM;i++) { for(j = 0;j < VERNUM;j++) { if(data[i][j].dis > 0&& data[i][j].flag!=1) { SendInf(i, j); } /*end of if*/ } /*end of for(j = 0*/ } /*end of for(i = 0*/ } 四、实验心得体会 通过本次实验训练,我了解了距离矢量路由算法的基本原理,复习了C语言编程的内容,通过对路由算法的实现,加深了对路由表交换的理解。 实验二 一、实验目的及要求 编写程序,联系Socket编程和TCP/IP协议的应用,要求实现Server端和Client端的信息通信。 二、实验原理 在TCP/IP编程中,为客户端和服务器端提供相同的端口号和IP地址号,实现Server端和Client端互联,运用Java文件流的知识,实现两端的信息传递。 三、源程序 /********************ChatClient*********************/ import java.awt.*;import java.awt.event.*;import java.io.*;import java.io.IOException;import java.net.*; public class ChatClient extends Frame{ Socket s = null;DataOutputStream dos = null;TextField tf = new TextField();TextArea ta = new TextArea(); public static void main(String[] args){ new ChatClient().launchFrame();} public void launchFrame(){ setLocation(400,300);this.setSize(300,300);add(tf,BorderLayout.SOUTH);add(ta,BorderLayout.NORTH);pack();tf.addActionListener(new tfListener());this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ disconn(); System.exit(0); } });setVisible(true);conn();} public void conn(){ try { s = new Socket(“127.0.0.1”,5555); dos = new DataOutputStream(s.getOutputStream()); System.out.println(“客户端连接成功!”);} catch(UnknownHostException e){ e.printStackTrace();} catch(IOException e){ e.printStackTrace();} } public void disconn(){ try { dos.close(); s.close();} catch(IOException e){ e.printStackTrace();} } private class tfListener implements ActionListener { public void actionPerformed(ActionEvent e){ String str = tf.getText().trim(); ta.setText(str); tf.setText(“"); try { dos.writeUTF(str); dos.flush(); } catch(IOException e1){ e1.printStackTrace(); } } } } /********************ChatServer******************/ import java.io.IOException;import java.net.*;import java.io.*; public class ChatServer { public static void main(String[] args){ boolean started = false; try { ServerSocket ss = new ServerSocket(5555); started = true; while(started){ boolean bConn = false; Socket s = ss.accept(); bConn = true; System.out.println(”一个客户端已连接"); DataInputStream dis = new DataInputStream(s.getInputStream()); while(bConn){ String str = dis.readUTF(); System.out.println(str); } } } dis.close();} } catch(IOException e){ e.printStackTrace();} 四、实验心得体会 通过本次实验的练习,熟悉了TCP/IP协议,对套接字等概念有了深入的了解,对用Java语言实现Socket编程并实现客户端和服务器端的信息交互有了一定的了解。 实验三GUI编程 一、实验目的: 1、了解Java系统图形用户界面的基本工作原理和界面设计的步骤 2、了解图形用户界面的事件响应机制.3、掌握图形用户界面各种常用的基本组件的使用方法及其事件响应.4、掌握图形用户界面各种布局策略的设计与使用.二、实验时间: 三、实验地点: 四、实验内容与步骤: (1)创建一用户登录界面,接受用户输入的帐号和密码,给三次输入机会。 (2)编写成人身高和体重检查程序。 要求:身高和体重在两个不同的文本框中输入,性别在单选钮中选择。 按确定后显示标准体重和身材比例评价。附: 国际上常用的人的体重计算公式,以及身材比例计算(比较适合东方人)标准体重=(身高cm-100)x0.9(kg) 标准体重(女)=(身高cm-100)x0.9(kg)-2.5(kg) 正常体重:标准体重+-(多少)10%. 超重:大于标准体重10%小于标准体重20%. 轻度肥胖:大于标准体重20%小于标准体重30%. 中度肥胖:大于标准体重30%小于标准体重50%. 重度肥胖:大于标准体重50%以上 (3)实现一个模拟手机的图形用户界面,包括一个显示区和一个键盘区,显示区用来显示数字和信息,键盘区包括0~9,10个数字键和“发送”、“清零”、“关机”三个命令键。当用户按数字键时,相应的数字回显在显示区上;当用户按“清零”键时,显示区的数字清空;当用户按“发送”键时,显示区中出现当前的号码和“拨号中......”的信息;当用户按关机键时“正在关机......”。 第(1)用Application编程,(2)(3)用Applet编程。 五、实验结果分析: MFC编程实验总结报告 知识总结+个人心得 2011年暑期MFC编程实验报告 / 6 MFC编程实验个人总结报告 一、MFC类、函数等知识小结: 1、SetTimer(1, m_intLevel, NULL);在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了于是SetTimer函数的原型变为: UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)) 当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认认的是onTime函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。 例: SetTimer(1,1000,NULL); 1:计时器的名称; 1000:时间间隔,单位是毫秒; NULL:使用onTime函数。 当不需要计时器的时候调用KillTimer(nIDEvent); 例如:KillTimer(1); KillTimer(1); 2、typedef struct{};(1)struct{ int x;int y;}test1;好,定义了 结构 test1,test1.x 和 test1.y 可以在语句里用了。 (2)struct test {int x;int y;}test1;定义了结构 test1,test1.x 和 test1.y 可以在语句里用了。与(1)比,省写 了 test (3)typedef struct test / 6 {int x;int y;}text1,text2; 此处时说了这种结构体(类型)别名 叫 text1 或叫 text2,而不是定义了结构体变量.真正在语句里用,还要写: text1 test1;//定义结构体变量 然后好用 test1.x test1.y 或写 text2 test1;//定义结构体变量 然后好用 test1.x test1.y 3、Invalidate();//让客户区无效,即时重新绘制客户区 void Invalidate(BOOL bErase = TRUE); 该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。 4、CDC::Rectangle(左上x,左上y,右下x,右下y);使用该函数画一个矩形,可以用当前的画笔画矩形轮廓,用当前画刷进行填充。 函数原型:BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); hdc:设备环境句柄。 nLeftRect:指定矩形左上角的逻辑X坐标。 nTopRect:指定矩形左上角的逻辑Y坐标。 nRightRect:指定矩形右下角的逻辑X坐标。 nBottomRect:指定矩形右下角的逻辑Y坐标。 5、CBrush:: CBrush//画刷类 eg:CBrush brushStick(RGB(127, 127, 127));四种构造函数: CBrush(); CBrush(COLORREF crColor); CBrush(int nIndex, COLORREF crColor); CBrush(CBitmap* pBitmap); / 6 参数说明: crColor指定画刷的前景色(RGB方式)。如果画刷是阴影线型的,则指定阴影线的颜色。 nIndex指定画刷阴影线采用的风格,取值如下: HS_BDIAGONAL45度的向下影线(从左到右) HS_CROSS水平和垂直方向以网格线作出阴影 HS_DIAGCROSS 45度的网格线阴影 HS_FDIAGONAL 45度的向上阴影线(从左到右) HS_HORIZONTAL 水平的阴影线 HS_VERTICAL 垂直的阴影线 pBitmap指向CBitmap对象的指针,该对象指定了画刷要绘制的位图。 构造函数说明: 类CBrush一共有四个覆盖的构造函数。不带参数的那个构造函数构造一个未初始化的CBrush对象,在使用该对象之前需要另外初始化。如果使用了不带参数的那个构造函数,则必须用CreateSolidBrush、CreateHatchBrush、CreateBrushIndirect、CreatePatternBrush或CreateDIBPatternBrush来初始化返回的CBrush对象。如果使用了带参数的构造函数,则不再需要初始化CBrush对象。带参数的构造函数在出错时会产生一个异常,而不带参数的构造函数总是成功返回。只带有一个参数COLORREF的构造函数用指定的颜色构造一个实线型的画刷。颜色是一个RGB值,可以用WINDOWS.H中的宏RGB构造出来。带两个参数的构造函数构造一个阴影线型的画刷,参数nIndex指定了阴影线模式的指数(index)。参数crColor指定了画刷的颜色。带有一个CBitmap型参数的构造函数构造一个模式化的画刷。参数指定一个位图。该位图应该是已经用CBitmap::CreateBitmap、CBitmap::CreateBitmapIndirect、CBitmap::LoadBitmap或CBitmap::CreateCompatiableBitmap建立或加载的位图。填充模式下的位图的最小尺寸为8像素×8像素。 6、MessageBox(“Game Over!”);MessageBox(NULL,“text”,“title”,BUTTON);参数title:string类型,指定消息对话框的标题。text:指定消息对话框中显示的消息,该参数可以是数值数据类型、字符串或boolean值。icon:Icon枚举类型,可选项,指定要在该对话框左侧显示的图标。button:Button枚举类型,可选项,指定显示在该对话框底部的按钮。default:数值型,可选项,指定作为缺省按钮的按钮编号,按钮编号自左向右依次计数,缺省值为1,如果该参数指定的编号超过了显示的按钮个数,那么MessageBox()函数将使用缺省值返回值Integer。函数执行成功时返回用户选择的按钮编号(例如1、2、3等),发生错误时返回-1。如果任何参数的值为NULL,4 / 6 MessageBox()函数返回NULL。 函数原型:MessageBox.Show(Text,Title,MessageBoxButtons,MessageBoxIcon ,MessageBoxDefaultButtons) 参数说明: (1)Text:必选项,消息框的正文。(2)Title:可选项,消息框的标题。 (3)MessageBoxButtons:可选项,消息框的按钮设置,默认只显示【确定】按钮。 OK――确定 OKCancel――确定和取消 AbortRetryIgnore――终止、重试和忽略 YesNoCancel――是、否和取消 YesNo――是和否 RetryCancel――重试和取消 (4)MessageBoxIcon:对话框中显示的图标样式,默认不显示任何图标。 Question――问号 Information、Asterisk――i号 Error、Stop、Hand――错误号 Warning、Exclamation――!号 None――不显示任何图标 (5)MessageBoxDefaultButtons:可选项,对话框中默认选中的按钮设置。 DefaultButton1――第1个button是默认按钮 DefaultButton2――第2个button是默认按钮 DefaultButton3――第3个button是默认按钮 7、Memcpy(拷贝目的地,拷贝对象,拷贝长度);包含在头文件#include 函数原型: extern void *memcpy(void *destin, void *source, unsigned n);功能: 由source指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。eg: int a=5,b=9;memcpy(a,b,sizeof(a));//将b按位拷给a;说明: 1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。 2.与strcpy相比,memcpy并不是遇到' '就结束,而是一定会拷贝完n个字节。 / 6 3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。 //注意,source和destin都不一定是数组,任意的可读写的空间均可。 二、MFC个人学习心得: 1、问题的解决:: 绘制窗口时会出现严重的刷屏问题,问了解决这一问题,通过改变背景位图来替代过多的部分的重绘达到更好效果。 一个满载的二维、三维数组都可以用一个足够长的一维数组来装下。 2、MFC基础细节学习: 学习了位图的使用,CBrush类,CDC类,CDialog类的基本使用,对于菜单的设置初步了解了。 3、mfc编程的初步理解: 通过自学了解到mfc编程的实现是通过建立消息映射表来实现各个函数的调用。(1)通过DECLARE_MESSAGE_MAP声明消息映射;(2)通过BEGIN_MESSAGE_MAP和宏END_MESSAGE_MAP来包含消息映射宏,创建消息映射列表;(3)为消息处理函数添加代码,实现需要的响应。通过以上三大步实现消息映射。 每种对话框的操作要通过先建立相应的CDialog类来具体进行。 MFC编程只是一种工具,而编程的核心还是代码的实现。我们在使用MFC编程时要想学得更好就要不断练习,更具体的了解其中的各种类、函数,各种工具,MFC是一个巨大的工具箱,但是如果不知道工具箱里面的工具怎么用,那在好的工具也无用武之地。所以,我认为此次编程小实习主要是让我初步接触了MFC如何实现可视化编程。未来要想真正掌握MFC编程还要不断的深入了解各种MFC工具,真正的与代码结合起来实现高效实用的编程效果。 4、这次编程实习过程中,另一点感受最深的就是团队合作,一支团队要想有好的工作效率和质量就必须有足够的队伍成员间的默契。如果仅仅靠个别人去完成,其实是很不科学的,不仅费时而且可能会白白做很多无用功,因此,在以后的小组中一定要加强团队合作意识。另一点就是一个队伍的成员可以不是特别出色,但是队伍的领导者一定要负责,领导者可以不是特别杰出的技术骨干人员,但必须懂得怎样协调、安排工作,这也是实现高效团队的关键因素。 通过这次暑期编程实验,不仅充实了暑期生活,也让我学到了一些新的知识,让我更加深刻的理解了团队合作的重要性。在以后的学习生活要积极参加类似的活动,加强知识学习,能力提高,为未来的职业生涯逐渐打下一个坚实的基础。谢谢! / 6 Windows编程/附件资料2 实验2MFC 框架程序的分析认知与编程实践(4学时) 一、实验目的: 熟悉在Visual C++ 6.0 IDE中编辑、编译、调试和运行一个MFC应用程序的基本思路;理解并掌握利用MFC开发应用程序的一般步骤和过程;加深对MFC框架程序的特性认识,掌握其应用方法。了解构件式的软件开发思想;提高实际动手编制WinApp的能力和分析问题、解决问题的能力。 二、实验内容: 1、分析理解题:利用MFC AppWizard分别创建最基本的基于对话框的应用程序,单文档应用程序和多文档应用程序;并从类/文件/资源等视图角度分析比较它们各自所自动拥有的类(基类)/文件(主要是.cpp文件)/资源的异同,回答其后(即四所列)思考题;要求在实验报告中反应分析比较情况及你的认知理解点滴。(必做) 2、程序设计题:以MFC编程方式,编写并实现一个简易计算器功能的应用程序。其界面架构形式和具体内容自我设计,原则:架构美观、布局合理,内容实用,具有可计算特性。 3、以MFC编程方式,编写并实现一个SDI界面的“奥运五环”绘图应用程序。(提高)提示:编写在窗口客户区上“绘制一张笑脸”的WinApp。 1)若用SDK API方式编程,则其WM_PAINT消息的响应代码为: case WM_PAINT: hdc=BeginPaint(hwnd,&ps); hPen=CreatePen(PS_SOLID,5,RGB(255,0,0)); SelectObject(hdc,hPen); Ellipse(hdc,275,170,425,320); Arc(hdc,360,215,410,240,410,225,360,225); Arc(hdc,290,215,340,240,340,225,290,225); Arc(hdc,320,240,380,300,320,270,380,270); EndPaint(hwnd,&ps); return 0; 2)若以MFC方式编程,则可利用MFC AppWizard建立一个SDI界面的应用程序框架,然后在其视类的OnDraw()中加入如下代码也可。 CPen pen,*oldpen; pen.CreatePen(PS_SOLID,2,RGB(255,0,0)); 计算机科学系XYP编制2011-5-18第1 页 oldpen=pDC->SelectObject(&pen); pDC->Ellipse(275,170,425,320); pDC->Arc(360,215,410,240,410,225,360,225); pDC->Arc(290,215,340,240,340,225,290,225); pDC->Arc(320,240,380,300,320,270,380,270); pDC->SelectObject(oldpen); 三、实验要求: 通过本次实验,要求同学们能对利用MFC AppWizard、ClassWizard等实用工具编写WinApp的方法、步骤有一个较为全面的了解,并注意理解由MFC AppWizard所生成的WinApp框架的组织架构和作用;深刻理解在此基础上开发WinApp的主要工作是“填充框架和添加必要的实现代码”的含义,切实做到用理论指导实践,以实践促进理论,提高实际动手能力和再学习的能力。具体要求如下: 1、实验前认真准备、仔细计划,查找相关资料,写出预做报告,促进理性思维能力; 2、实验中以理性实践的态度,积极思考,认真领悟实验过程出现的各种实验现象,注意总结积累经验,完成实验要求,达到实验目标,提高应对问题、解决问题的能力; 3、实验后按要求及时、认真地完成实验报告,按时提交。 特别强调,注意实验报告内容的完整性、真实性和个异特点,使我们的两个能力:动手和持续学习能力真正得到提高。 四、思考题: 1.在MFC应用程序中,至少必须包含几个类?它们分别是什么类? 2.由MFC AppWizard生成的应用程序,都有哪些主要文件?包含哪些类及相关类的对应功能和它们之间的关系怎样? 3.控件使用中应特别注意哪些问题? 4.在使用编辑框时,应注意哪几点? 5.ClassWizard使用中,应关注的主要问题是什么?注意哪些问题? 温馨小贴示: 1.MFC应用程序必须包含的两个基本类是CWinApp类和CFrameWnd类。CWinApp类替代了API应用程序中的主函数WinMain()功能,封装了与应用程序相关的程序初始化InitApplication()和InitInstance()、消息循环Run()和程序结束ExitInstance()等功能;CFrameWnd类替代了窗口函数WndProc()的功能,封装了消息处理和窗口销毁等功能。 2.MFC应用程序消息处理的路径为:应用程序从CWinApp派生对象,其成员函数Run()调用 CWinThread::Run(),通过GetMessage(),TranslateMessage()和DispatchMessage()进行消息循环。每个窗口对象都使用相同的称为AfxWndProc()的全局函数,AfxWndProc()调用OnWndMsg()处理消息。OnWndMsg()负责将收到的消息分为三大类:窗口消息、命令消息和控件消息,再分发给不同的消息处理函数去处理。 3.MFC应用程序的启动顺序:①建立、初始化CWinApp对象,该对象是全局的且只能有一个,名为theApp;②在InitInstance()函数中,创建文档模板,执行MFC框架默认的命令行参数,根椐分解的命令行信息,启动不同类型的任务,动态建立文档、视图、框架,并对文档、视图、框架进行初始化;③显示与更新窗口;④启动消息循环。 五、参考书籍: 1.《Visual C++ 应用教程》·郑阿奇,丁有和 编著·人民邮电出版社2008.10 2.《Visual C++ 实用教程》·周进等 编著·人民邮电出版社2008.5 3.《Windows 程序设计教程》·杨祥金等 编著·清华大学出版社·2007.4 4.《Windows可视化程序设计》·刘振安主编·机械工业出版社·2007.1 5.《Visual C++ 程序设计—基础与实例分析》·朱晴婷等 编著·清华大学出版社2004.3 6.《Visual C++ 6.0实用教程》·扬永国 主编·清华大学出版社·2004.1 7.《C++及Windows可视化程序设计》·刘振安编著·清华大学出版社·2003.7 8.《Windows C程序设计入门与提高》·柳永新等 编著·清华大学出版社·1999.7 肖云萍编写第三篇:实验三GUI编程
第四篇:MFC编程实验个人总结报告
第五篇:Windows编程_实验2指导