《Windows程序设计》实验教学大纲_第1页
《Windows程序设计》实验教学大纲_第2页
《Windows程序设计》实验教学大纲_第3页
《Windows程序设计》实验教学大纲_第4页
《Windows程序设计》实验教学大纲_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

...wd......wd......wd...?Windows程序设计?实验教学大纲实验学时:32学时实验个数:11实验学分:1课程性质:〔必做〕适用专业:计算机科学与技术、软件工程、网络工程教材及参考书:?VisualC++面向对象与可视化程序设计教程?〔第三版〕大纲执笔人:大纲审定人:郭涛实验课的性质与任务本课程实验大纲是面向计算机相关专业学生开设的?Windows程序设计?〔以VC++为开发环境〕实验课方案指导大纲,是依据?Windows程序设计?课程教学方案指导大纲编制。本课程主要讲述了利用WindowsAPI函数和MFC进展简单的Windows程序开发的基本流程,结合该课程教学方案大纲的相应内容,设计了10个单项实验和综合实验,力求提高学生的动手能力,做到理论和实践相结合。使学生在实验过程中掌握Windows程序设计的思想、原理,能使用SDK和MFC实现基于窗口的程序设计。实验课程目的与要求1.实验目的:Windows程序设计实验课的开设,是为了使学生更好地理解和掌握运用VC开发环境开发Windows程序设计的基本理论、基本方法和基本技术,强化程序设计能力。2.实验要求:在实验中,要求学生个人独立思考,设计算法流程,编写出程序,完成上机调试,最后给出实验报告。本课程的学习过程是复杂程序设计的训练过程,要求学生编写的程序构造清楚、正确易读,符合软件工程的标准;3)在实验中更好地理解和掌握VC程序设计这门课程中所学的基本理论和方法,强化程序设计能力。实验工程及内容提要?Windows程序设计?实验课程〔1106844037〕序号实验工程编号实验名称学时必做选做学分数实验类型内容提要基本操作验证综合设计11VisualC++6.0开发环境实验2√√熟悉VisualC++6.0开发环境22Windows应用程序基本框架实验2√√Windows框架程序设计33Windows绘图试验4√√GDI绘图44文本的输出方法与字体设置实验2√√GDI文字输出55键盘消息的响应实验2√√基本键盘消息响应66鼠标消息的响应实验2√√基本鼠标消息响应77资源在Windows编程中的应用实验4√√资源编程88控件API编程4√√控件编程99在MFC中创立应用程序资源2√√利用MFC创立资源1010单文档与多文档2√√文档编程1111综合性实验6√√√数据库编程实验内容安排:实验一VisualC++6.0开发环境实验〔验证性实验2学时〕1、目的要求:了解VisualC++6.0的特点,熟悉VisualC++6.0的开发环境。2、实验内容:了解和熟悉开发环境,对各种菜单功能,工程文件管理和MSDN帮助功能有完整的了解。3、主要仪器设备及药品Windows2000+VC6.0+MSDN实验二Windows应用程序基本框架实验〔验证性实验2学时〕1、目的要求:编写第一个Windows程序,理解入口函数Winmain和窗口函数WinProc,掌握消息驱动机制。2、实验内容:使用Win32Application模板建设一个Win32工程,编写一个包含WinMain,WinProc的基本Windows程序,并编译、运行,观察结果。3、主要仪器设备及药品Windows2000+VC6.0+MSDN实验三Windows绘图试验〔验证性实验4学时〕1、目的要求:理解DC概念,掌握坐标映射的设置方法,熟悉Windows绘图的基本方法和函数。2、实验内容:运用Windows提供的GDI函数,完成窗口图形输出功能。1〕将窗口划分为5个区域,并用白色到黑色线性变化的颜色填充这5个区域,画一条斜线穿过这5个区域;源代码:#include<windows.h>#include<stdlib.h>#include<string.h>longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam);BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);//主函数intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){MSGMessage;if(!InitWindowsClass(hInstance)) returnFALSE;if(!InitWindows(hInstance,nCmdShow)) returnFALSE;while(GetMessage(&Message,0,0,0)) //消息循环 { TranslateMessage(&Message);DispatchMessage(&Message); }returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam){HDChDC; //定义设备环境句柄HBRUSHhBrush; //定义画刷的句柄HPENhPen; //定义画笔的句柄PAINTSTRUCTPtStr; //定义指向包含绘图信息的构造体变量switch(iMessage) //处理消息 {caseWM_PAINT: //处理绘图消息 MoveWindow(hWnd,0,0,500,400,NULL);//初始化窗口大小 hDC=BeginPaint(hWnd,&PtStr); hPen=(HPEN)GetStockObject(NULL_PEN);//获取系统定义的空画笔 SelectObject(hDC,hPen); //选择画笔 hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取系统定义的画刷 hPen=CreatePen(PS_SOLID,2,RGB(255,0,0));//创立画笔 SelectObject(hDC,hPen); //选择画笔//MoveToEx(hDC,0,150,NULL); LineTo(hDC,750,150); hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH); SelectObject(hDC,hBrush); Rectangle(hDC,0,0,100,400); hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); SelectObject(hDC,hBrush); Rectangle(hDC,100,0,200,400); hBrush=(HBRUSH)GetStockObject(GRAY_BRUSH); SelectObject(hDC,hBrush); Rectangle(hDC,200,0,300,400); hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH); SelectObject(hDC,hBrush); Rectangle(hDC,300,0,400,400); hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); SelectObject(hDC,hBrush); Rectangle(hDC,400,0,500,400); hPen=CreatePen(PS_SOLID,2,RGB(255,0,0));//创立画笔 SelectObject(hDC,hPen); //选择画笔 MoveToEx(hDC,0,0,NULL); LineTo(hDC,500,400); DeleteObject(hPen);//删除画笔 DeleteObject(hBrush);//删除画刷 EndPaint(hWnd,&PtStr);//完毕绘图return0;caseWM_DESTROY://完毕应用程序 PostQuitMessage(0);return0;default://其他消息处理程序return(DefWindowProc(hWnd,iMessage,wParam,lParam)); }}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{HWNDhWnd; hWnd=CreateWindow("WinFill", //生成窗口"填充例如程序",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0,CW_USEDEFAULT, 0,NULL,NULL,hInstance,NULL);if(!hWnd)returnFALSE; ShowWindow(hWnd,nCmdShow); //显示窗口 UpdateWindow(hWnd);returnTRUE;}BOOLInitWindowsClass(HINSTANCEhInstance) //定义窗口类{WNDCLASSWndClass; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,"END"); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName="WinFill"; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}截图:2〕编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动的实心圆,而且,每隔四分之一周期,圆的填充色和圆的周边颜色都发生变化,同时,圆的半径在四分之一周期之内由正弦曲线幅值的0.2倍至0.6倍线性增长。源代码:#include<windows.h>#include<stdlib.h>#include<string.h>#include<math.h>#definePi3.1415926longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam);doubledfTheta=0,dfRange=100.0; //正弦曲线的角度变量.longi=0,j=0;longlCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange);//定义圆心坐标和圆半径.POINTlpSin[100]; //定义正弦曲线的点坐标.intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){//填写窗口类属性HWNDhWnd; MSGMessage; WNDCLASSWndClass; WndClass.style=0;//填写属性 WndClass.lpfnWndProc=WndProc; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hInstance=hInstance; WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); WndClass.lpszMenuName=NULL; WndClass.lpszClassName="SIN"; WndClass.hIcon=LoadIcon(NULL,"END");if(!RegisterClass(&WndClass)) //注册窗口. { MessageBeep(0); returnFALSE; } hWnd=CreateWindow ("SIN", //窗口类名."4_6", //标题名.WS_OVERLAPPEDWINDOW, //带标题栏,最大/小按钮的窗口CW_USEDEFAULT, //窗口左上角坐标. 0,CW_USEDEFAULT, //采用缺省的宽度和高度. 0,NULL, //无父窗口.NULL, //无主菜单.hInstance, //当前实例句柄.NULL); ShowWindow(hWnd,nCmdShow); //显示窗口. UpdateWindow(hWnd); //更新并绘制用户区.for(intj=0;j<100;j++) //生成正弦曲线的点坐标. { lpSin[j].x=(long)(j*2*Pi/100*60); lpSin[j].y=(long)(dfRange*sin(j*2*Pi/100)); }while(GetMessage(&Message,0,0,0)) { TranslateMessage(&Message); //消息循环.DispatchMessage(&Message); }returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam){HDChDC; //定义设备环境句柄.HBRUSHhBrush; //定义画刷句柄HPENhPen; //定义画笔句柄PAINTSTRUCTPtStr;//定义包含绘图信息的构造体变量switch(iMessage) {caseWM_PAINT: //处理绘图消息 hDC=BeginPaint(hWnd,&PtStr); //获得设备环境指针 SetWindowOrgEx(hDC,-200,-200,NULL);//设置原点坐标 hPen=CreatePen(PS_DASH,1,RGB(255,0,0)); //建新画笔 SelectObject(hDC,hPen); //选入画笔 Polyline(hDC,lpSin,100); //绘制正弦曲线if(i<=25)//第一个1/4周期. { hPen=CreatePen(PS_DASH,1,RGB(255,0,0)); hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0)); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//计算半径 }elseif(i<=50)//第二个1/4周期. { hPen=CreatePen(PS_DASH,1,RGB(0,255,0)); hBrush=CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0)); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25); }elseif(i<=75)//第三个周期. { hPen=CreatePen(PS_DASH,1,RGB(0,0,255)); hBrush=CreateHatchBrush(HS_CROSS,RGB(0,0,255)); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25); }else//第四个周期. { hPen=CreatePen(PS_DASH,1,RGB(255,255,0)); hBrush=CreateHatchBrush(HS_VERTICAL,RGB(255,255,0)); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25); } SelectObject(hDC,hBrush); //选入画刷. SelectObject(hDC,hPen); //选入画笔. lCentreX=lpSin[i].x; //圆心x坐标. lCentreY=lpSin[i].y; //圆心y坐标. Ellipse(hDC,lCentreX-lRadious,lCentreY-lRadious, lCentreX+lRadious,lCentreY+lRadious);//画圆 i++; DeleteObject(hPen); //删除画笔 DeleteObject(hBrush); //删除画刷 EndPaint(hWnd,&PtStr); //删除设备环境指针 Sleep(100); //停0.1秒if(i<100)InvalidateRect(hWnd,NULL,1); //刷新用户区return0;caseWM_DESTROY: //关闭窗口. PostQuitMessage(0); return0;defaultreturn(DefWindowProc(hWnd,iMessage,wParam,lParam)); }return0;}截图:3、主要仪器设备及药品Windows2000+VC6.0+MSDN实验四文本的输出方法与字体设置〔验证性实验2学时〕1、目的要求:理解字体句柄的念,熟悉Windows文字输出的基本方法和函数,学习字体格式的控制。2、实验内容:〔选做1个〕1〕在窗口中显示出26个英文字母,从左向右字母依次位置提高10个像素单位,并且颜色变为红色,然后回到正常位置;当到达最右端后改变方向从右向左依次变成红色并位置提高10个像素单位。在窗口的第二行显示26个字母,字体从正常到斜体,颜色从黑色到天蓝色不断变换。源代码:#include<windows.h>#include<stdlib.h>#include<string.h>#include<stdio.h>LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam);BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);//主函数intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){MSGMessage;if(!InitWindowsClass(hInstance)) returnFALSE;if(!InitWindows(hInstance,nCmdShow))returnFALSE;while(GetMessage(&Message,0,0,0))//消息循环 { TranslateMessage(&Message);DispatchMessage(&Message); }returnMessage.wParam;}//消息处理函数LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){HDChDC; //设备句柄PAINTSTRUCTps; //画刷构造intX=0,Y=0,i=0,nCharlen=26;staticintnChar=0;charlpsz_1[]="abcdefghijklmnopqrstuvwxyz";charlpsz_2[]="abcdefghijklmnopqrstuvwxyz";staticBOOLbLeft=FALSE,bRight=TRUE;TEXTMETRICtm;intj;SIZEsize;RECT rect; //无效矩形区HFONTholdFont,hnewFont;switch(message) //消息处理函数 {caseWM_CREATE: //窗口创立//SetTimer(hwnd,1,1,NULL);return0;caseWM_TIMER: InvalidateRect(hwnd,&rect,1);return0;caseWM_PAINT: //绘制消息 hnewFont=CreateFont//创立一种新的逻辑字体 (34,0,0,0,500,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_DONTCARE,"黑体"); hDC=BeginPaint(hwnd,&ps); //得到设备环境句柄 GetClientRect(hwnd,&rect); //得到需要绘制的客户区 holdFont=(HFONT)SelectObject(hDC,hnewFont);//选择新的字体GetTextMetrics(hDC,&tm); SetTextColor(hDC,RGB(255,255,255)); //设置文本颜色//SetBkColor(hDC,RGB(0,0,0)); //设置背景颜色 Y=tm.tmExternalLeading+10; //设置输出字符的Y坐标for(i=0;i<nChar;i++) { SetTextColor(hDC,RGB(0,0,0)); //设置字体的颜色为黑色 X=X+tm.tmAveCharWidth*2; //设置输出字符的X坐标TextOut(hDC,X,Y,&lpsz_1[i],1);//输出从第0个到第nChar-1个字符 } SetTextColor(hDC,RGB(255,0,0));//设置字体的颜色为红色 X=X+tm.tmAveCharWidth*2; //设置输出字符的X,Y坐标 Y=tm.tmExternalLeading; //提高10个像素//hF=CreateFont(hDC,40,0); //创立字体//SelectObject(hDC,hF); //选入字体 SetTextColor(hDC,RGB(255,0,0));//设置字体的颜色为黑色TextOut(hDC,X,Y,&lpsz_1[nChar],1);//输出第nChar个字符 Y=tm.tmExternalLeading+10;for(i=nChar+1;i<nCharlen;i++) { SetTextColor(hDC,RGB(0,0,0));//设置字体的颜色为黑色 X=X+tm.tmAveCharWidth*2;//设置输出字符的X坐标TextOut(hDC,X,Y,&lpsz_1[i],1); //输出后面的字符 }if(nChar==nCharlen) //当输出到最后的一个字符时 { bRight=FALSE; //改变红色字移动的方向为向左 bLeft=TRUE; }elseif(nChar==0) //当输出到第一个字时 { bRight=TRUE; //改变红色字移动的方向为向右 bLeft=FALSE; }if(bRight==TRUE)nChar++;elsenChar--;/*GetTextExtentPoint32(hDC,pstring,12,&size); Xchar=(rect.right-rect.left)/2-size.cx/2; Ychar=(rect.bottom-rect.top)/2-size.cy/2; TextOut(hdc,Xchar,Ychar,pstring,12);*/ SelectObject(hDC,holdFont); //保存原来的字体格式 X=0; Y=100; //设置输出字符的Y坐标for(i=0;i<26;i++) {if(i%2==0) { hnewFont=CreateFont( //创立自定义字体 34, //字体的高度 0, //由系统根据高宽比选取字体最正确宽度值 0, //文本的倾斜度为0,表示水平 0, //字体的倾斜度为0 500, //字体的粗度,FW_HEAVY为最粗 0, //非斜体字 0, //无下划线 0, //无删除线ANSI_CHARSET, //表示所用的字符集为ANSI_CHARSETOUT_DEFAULT_PRECIS, //输出精度为缺省精度CLIP_DEFAULT_PRECIS, //剪裁精度为缺省精度DEFAULT_QUALITY, //输出质量为缺省值DEFAULT_PITCH&FF_DONTCARE,//字间距和字体系列使用缺省值"粗体字"); //字体名称 SelectObject(hDC,hnewFont);//将自定义字体选入设备环境 SetTextColor(hDC,RGB(0,0,0)); //设置文本颜色 X=X+50; //设置输出字符的X坐标TextOut(hDC,X,Y,&lpsz_2[i],1);//输出从第0个到第nChar-1个字符 }else { hnewFont=CreateFont( //创立自定义字体 34, //字体的高度 0, //由系统根据高宽比选取字体最正确宽度值 0, //文本的倾斜度为0,表示水平 0, //字体的倾斜度为0 500, //字体的粗度,FW_HEAVY为最粗 1, //非斜体字 0, //无下划线 0, //无删除线ANSI_CHARSET, //表示所用的字符集为ANSI_CHARSETOUT_DEFAULT_PRECIS, //输出精度为缺省精度CLIP_DEFAULT_PRECIS, //剪裁精度为缺省精度DEFAULT_QUALITY, //输出质量为缺省值DEFAULT_PITCH&FF_DONTCARE,//字间距和字体系列使用缺省值"粗体字"); //字体名称 SelectObject(hDC,hnewFont);//将自定义字体选入设备环境 SetTextColor(hDC,RGB(0,0,255)); //设置文本颜色 X=X+50; //设置输出字符的X坐标TextOut(hDC,X,Y,&lpsz_2[i],1);//输出从第0个到第nChar-1个字符 } } DeleteObject(hnewFont); //删除新的字体格式 EndPaint(hwnd,&ps); //完毕绘制 Sleep(100); InvalidateRect(hwnd,&rect,1);return0;caseWM_DESTROY: //退出消息 PostQuitMessage(0); return0; }returnDefWindowProc(hwnd,message,wParam,lParam);}BOOLInitWindowsClass(HINSTANCEhInstance) //定义窗口类{WNDCLASSWndClass; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,"END"); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName="WinFill"; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{HWNDhWnd; hWnd=CreateWindow("WinFill",//生成窗口"填充例如程序",WS_OVERLAPPEDWINDOW, 20, 20, 950, 690,NULL,NULL,hInstance,NULL);if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //显示窗口 UpdateWindow(hWnd);returnTRUE;}截图:2〕编写一个程序,在窗口中显示“VC中显示字体与背景〞,字体颜色为红色,背风光为黄色,字体为宋体,字高40。源代码:#include<windows.h>#include<stdlib.h>#include<string.h>ylongWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam );BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);//主函数intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){MSGMessage;if(!InitWindowsClass(hInstance)) returnFALSE;if(!InitWindows(hInstance,nCmdShow))returnFALSE;while(GetMessage(&Message,0,0,0))//消息循环 { TranslateMessage(&Message);DispatchMessage(&Message); }returnMessage.wParam;}//消息处理函数LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){HDChdc; //设备句柄PAINTSTRUCTps; //画刷构造intXchar,Ychar;SIZEsize;LPCTSTRpstring={"VC中显示字体与背景"};RECT rect; //无效矩形区HFONTholdFont,hnewFont;switch(message) //消息处理函数 {caseWM_CREATE:return0; //窗口创立caseWM_PAINT: //绘制消息 hnewFont=CreateFont//创立一种新的逻辑字体 (40,0,0,0,500,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_DONTCARE,"宋体"); hdc=BeginPaint(hwnd,&ps); //得到设备环境句柄 GetClientRect(hwnd,&rect); //得到需要绘制的客户区 holdFont=(HFONT)SelectObject(hdc,hnewFont);//选择新的字体 SetTextColor(hdc,RGB(255,0,0)); //设置文本颜色 SetBkColor(hdc,RGB(255,255,0)); //设置背景颜色GetTextExtentPoint32(hdc,pstring,12,&size); Xchar=(rect.right-rect.left)/2-size.cx/2; Ychar=(rect.bottom-rect.top)/2-size.cy/2;TextOut(hdc,Xchar,Ychar,pstring,12); SelectObject(hdc,holdFont); //保存原来的字体格式 DeleteObject(hnewFont); //删除新的字体格式 EndPaint(hwnd,&ps); //完毕绘制return0;caseWM_DESTROY: //退出消息 PostQuitMessage(0);return0;default:returnDefWindowProc(hwnd,message,wParam,lParam); }return0;}BOOLInitWindowsClass(HINSTANCEhInstance) //定义窗口类{WNDCLASSWndClass; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,"END"); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName="WinFill"; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{HWNDhWnd; hWnd=CreateWindow("WinFill",//生成窗口"填充例如程序",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0,CW_USEDEFAULT, 0,NULL,NULL,hInstance,NULL);if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //显示窗口 UpdateWindow(hWnd);returnTRUE;}截图:3、主要仪器设备及药品Windows2000+VC6.0+MSDN实验五键盘消息的响应实验〔验证性实验2学时〕1、目的要求:理解Windows程序响应键盘操作的原理,熟悉键盘消息的响应编程。2、实验内容:〔选做1个〕1〕设计一个窗口,在该窗口中练习键盘的响应,要求如下:单击键盘上的向上箭头时,窗口中显示“Youhadhittedtheupkey〞;单击<Shift>键时,窗口中显示“YouhadhittedtheSHIFTkey〞;单击<Ctrl>键时,窗口中显示“YouhadhittedtheCTRLkey〞;单击<Ctrl+A>键时,窗口中显示“YouhadhittedtheCTRLAkey〞;单击<Shift+B>键时,窗口中显示“YouhadhittedtheSHIFTBkey〞。源代码:#include<windows.h>#include<stdlib.h>#include<string.h>longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam );BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);//主函数intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){MSGMessage;if(!InitWindowsClass(hInstance)) returnFALSE;if(!InitWindows(hInstance,nCmdShow))returnFALSE;while(GetMessage(&Message,0,0,0))//消息循环 { TranslateMessage(&Message);DispatchMessage(&Message); }returnMessage.wParam;}//消息处理函数longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam){HDChDC; //定义设备环境句柄.PAINTSTRUCTps; //定义包含绘图信息的构造体变量HPENhPen; //定义画笔句柄。HBRUSHhBrush; //定义画刷句柄//以下定义输出的字符串。staticcharcUp[]="YouhadhittedtheUPkey";staticcharcCtrl[]="YouhadhittedtheCtrlkey";staticcharcShift[]="YouhadhittedtheSHIFTkey";staticcharcCtrl_A[]="YouhadhittedtheCTRLAkey";staticcharcShift_B[]="YouhadhittedtheSHIFTBkey";//下面定义并初始化按键标志变量。staticBOOLnUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;switch(iMessage) {caseWM_KEYDOWN: {switch(wParam) {caseVK_UP: //当按上箭头键时,变量置为真。 nUpKeyDown=TRUE; break;caseVK_SHIFT: //当按shift键时,变量置为真。 nShiftKeyDown=TRUE;break;caseVK_CONTROL: //当按control键时,变量置为真 nCtrlKeyDown=TRUE; break;default: break; } }break;caseWM_KEYUP: InvalidateRect(hWnd,NULL,FALSE); break;caseWM_CHAR:if(wParam==(65&VK_CONTROL)) {if(nCtrlKeyDown==TRUE) { nCtrlAKeyDown=TRUE; nCtrlKeyDown=FALSE; } }elseif(wParam==98||wParam==66) //当按下b键时 {if(nShiftKeyDown==TRUE) //检查shift键是否处于按下状态。 { nShiftBKeyDown=TRUE; //当SHIFT键按下时,变量置为真 nShiftKeyDown=FALSE; } }break;caseWM_PAINT: //处理绘图消息. hDC=BeginPaint(hWnd,&ps); hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH); //创立白画刷。 hPen=(HPEN)GetStockObject(WHITE_PEN); //创立白画笔。 SelectObject(hDC,hPen); //选入白画刷 SelectObject(hDC,hBrush); //选入白画笔 SetTextColor(hDC,RGB(255,0,0)); //设置字体颜色为红色。//输出信息。if(nUpKeyDown==TRUE) { Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cUp,strlen(cUp)); nUpKeyDown=FALSE; }elseif(nCtrlAKeyDown==TRUE) { Rectangle(hDC,0,0,300,200);TextOut(hDC,0,100,cCtrl_A,strlen(cCtrl_A)); nCtrlAKeyDown=FALSE; nCtrlKeyDown=FALSE; }//elseif(nCtrlAKeyDown==TRUE)elseif(nCtrlKeyDown==TRUE&&nCtrlAKeyDown==FALSE) { Rectangle(hDC,0,0,300,200);TextOut(hDC,0,60,cCtrl,strlen(cCtrl)); nCtrlKeyDown=FALSE; }elseif(nShiftBKeyDown==TRUE) { Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cShift_B,strlen(cShift_B)); nShiftBKeyDown=FALSE; nShiftKeyDown=FALSE; }elseif(nShiftBKeyDown==FALSE&&nShiftKeyDown==TRUE) { Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cShift,strlen(cShift)); nShiftKeyDown=FALSE; }//删除画笔和画刷 DeleteObject(hPen); DeleteObject(hBrush); EndPaint(hWnd,&ps);break;caseWM_DESTROY: PostQuitMessage(0); return0;default: return(DefWindowProc(hWnd,iMessage,wParam,lParam)); }return0;}BOOLInitWindowsClass(HINSTANCEhInstance) //定义窗口类{WNDCLASSWndClass; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,"END"); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName="WinFill"; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{HWNDhWnd; hWnd=CreateWindow("WinFill",//生成窗口"填充例如程序",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0,CW_USEDEFAULT, 0,NULL,NULL,hInstance,NULL);if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //显示窗口 UpdateWindow(hWnd);returnTRUE;}截图:2〕编写一个键盘消息处理程序,单击一个按键后,在窗口依次显示出:按键消息,参数wParam的值;假设为字符消息还要显示相应得字符;重复计位数;OEM扫描码;扩展按键标志;ALT按下状态;按键的先前状态;转换状态。测试:依次按下Ctrl,Shift,Alt,a,b,“向上箭头键〞,“向右箭头键〞和Ctrl.源代码:#include<windows.h>#include<stdlib.h>#include<string.h>longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam );BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);//主函数intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){MSGMessage;if(!InitWindowsClass(hInstance)) returnFALSE;if(!InitWindows(hInstance,nCmdShow))returnFALSE;while(GetMessage(&Message,0,0,0))//消息循环 { TranslateMessage(&Message);DispatchMessage(&Message); }returnMessage.wParam;}//消息处理函数longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam){#defineBufSize20 //设置存放字符的缓冲区大小staticcharcCharBuf[BufSize]; //设置静态字符数组,存放输入的字符,字符个数不能超出缓冲区大小staticintnNumChar=0; //现有字符个数staticintnArrayPos=0; //字符的位置staticintnLnHeight;staticintnCharWidth;intx;HDChDC;TEXTMETRICtm;PAINTSTRUCTPtStr; //定义指向包含绘图信息的构造体变量switch(iMessage) //处理消息 {caseWM_CHAR: //遇到非系统字符所作的处理 {if(wParam==VK_BACK) //处理“遇到回退键的消息〞 {if(nArrayPos==0) //假设已在一行文字的开场处,那么提示用户"不能回退"MessageBox(hWnd,"当前位置是文本的起始位置,不能回退",NULL,MB_OK);else { nArrayPos=nArrayPos-1; //每按一次回退键就回退一个字符的位置 nNumChar=nNumChar-1; //对现有字符总数进展计数 InvalidateRect(hWnd,NULL,TRUE); //刷新用户区,并序发送WM_PAINT消息 }break; }if(wParam==VK_ESCAPE) //处理按下Escape键消息 {MessageBox(hWnd,"您现在不能按ESC键,请继续其它操作",NULL,MB_OK);break; }if(nNumChar>=BufSize) //如果写入的字符数超过缓冲区大小,那么报警 {MessageBox(hWnd,"缓冲区已满,不能再输入字符了\n假设需要删除字符,请用BackSpace键",NULL,MB_OK);break; }for(x=nNumChar;x>nArrayPos;x=x-1) cCharBuf[x]=cCharBuf[x-1]; cCharBuf[nArrayPos]=(unsignedchar)wParam; nArrayPos=nArrayPos+1; nNumChar=nNumChar+1; InvalidateRect(hWnd,NULL,TRUE); }break;caseWM_CREATE: //处理窗口创立消息 {hDC=GetDC(hWnd);GetTextMetrics(hDC,&tm); //获取字体信息 nLnHeight=tm.tmHeight+tm.tmExternalLeading; nCharWidth=tm.tmAveCharWidth; ReleaseDC(hWnd,hDC); }break;caseWM_KEYDOWN: //处理按下键消息 {switch(wParam) {caseVK_END: //处理按下键为End时的消息 nArrayPos=nNumChar; //输入位置从本行的末尾开场break;caseVK_HOME: //处理按下键为Home时的消息 nArrayPos=0; //输入位置为本行的起始位置break;caseVK_DELETE: //处理按下键为Delete时的消息if(nArrayPos==nNumChar)//输入位置处于本行的末尾MessageBox(hWnd,"缓冲区已空,没有字符可供删除",NULL,MB_OK);else {for(x=nArrayPos;x<nNumChar;x=x+1) cCharBuf[x]=cCharBuf[x+1]; //每删除一个字符,总字符数减1 nNumChar=nNumChar-1; InvalidateRect(hWnd,NULL,TRUE);//用户区刷新 }break;caseVK_LEFT: //处理按下左方向键时的消息if(nArrayPos>0) nArrayPos=nArrayPos-1;//当前输入位置往前移一个位置elseMessageBox(hWnd,"您已经移动到起始位置,不能再往左移动了",NULL,MB_OK);break;caseVK_RIGHT://处理按下右方向键时的消息if(nArrayPos<nNumChar)//假设当前位置未到缓冲区的末尾,可向右移动 nArrayPos=nArrayPos+1;elseMessageBox(hWnd,"已经到缓冲区的末尾,不能再向右移动了",NULL,MB_OK);break; } }break;caseWM_PAINT: //处理重画消息 hDC=BeginPaint(hWnd,&PtStr);TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar);//输出文本 EndPaint(hWnd,&PtStr);break;caseWM_DESTROY: //处理完毕应用程序消息 PostQuitMessage(0); //完毕应用程序break;default: //其他消息处理程序return(DefWindowProc(hWnd,iMessage,wParam,lParam)); }return0;}BOOLInitWindowsClass(HINSTANCEhInstance) //定义窗口类{WNDCLASSWndClass; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,"END"); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName="WinFill"; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{HWNDhWnd; hWnd=CreateWindow("WinFill",//生成窗口"填充例如程序",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0,CW_USEDEFAULT, 0,NULL,NULL,hInstance,NULL);if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //显示窗口 UpdateWindow(hWnd);returnTRUE;}截图:3、主要仪器设备及药品Windows2000+VC6.0+MSDN实验六鼠标消息的响应实验〔验证性实验2学时〕1、目的要求:理解Windows程序响应鼠标操作的原理,熟悉鼠标消息的响应编程。2、实验内容:1〕用户在窗口的不同区域移动鼠标时,光标将显示如以以下图所标识的不同箭头的形状。如右图;源代码:#include<windows.h>#include<stdlib.h>#include<string.h>#include<stdio.h>longWINAPIWndProc(HWNDhwnd,UINTmessage,UINTwParam,LONGlParam );BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);//主函数intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){MSGMessage;if(!InitWindowsClass(hInstance)) returnFALSE;if(!InitWindows(hInstance,nCmdShow))returnFALSE;while(GetMessage(&Message,0,0,0))//消息循环 { TranslateMessage(&Message);DispatchMessage(&Message); }returnMessage.wParam;}//消息处理函数longWINAPIWndProc(HWNDhwnd,UINTmessage,UINTwParam,LONGlParam){PAINTSTRUCTps;HDChdc;TEXTMETRICtm;HBRUSHhbrush;HPENhpen;HCURSORhcursor;charstr[15];staticintx,y;switch(message) {caseWM_MOUSEMOVE: x=LOWORD(lParam); y=HIWORD(lParam);if(x>50&&x<150&&y>50&&y<150) { hcursor=LoadCursor(NULL,IDC_CROSS); //十字光标 SetCursor(hcursor); }if(x>150&&x<250&&y>50&&y<150) { hcursor=LoadCursor(NULL,IDC_SIZEALL);//十字箭头光标 SetCursor(hcursor); }if(x>250&&x<350&&y>50&&y<150) { hcursor=LoadCursor(NULL,IDC_SIZENESW);SetCursor(hcursor); }//西南-东北光标if(x>50&&x<150&&y>150&&y<250){hcursor=LoadCursor(NULL,IDC_IBEAM);SetCursor(hcursor);}//I字型光标if(x>150&&x<250&&y>150&&y<250) { hcursor=LoadCursor(NULL,IDC_WAIT);SetCursor(hcursor); }//沙漏光标if(x>250&&x<350&&y>150&&y<250) { hcursor=LoadCursor(NULL,IDC_UPARROW);SetCursor(hcursor); }//向上箭头光标if(x>50&&x<150&&y>250&&y<350) { hcursor=LoadCursor(NULL,IDC_SIZEWE);SetCursor(hcursor); }//东西向箭头if(x>150&&x<250&&y>250&&y<350) { hcursor=LoadCursor(NULL,IDC_SIZENWSE);SetCursor(hcursor); }//西北-东南箭头if(x>250&&x<350&&y>250&&y<350) { hcursor=LoadCursor(NULL,IDC_SIZENS);SetCursor(hcursor); }//南北向箭头 hdc=GetDC(hwnd);GetTextMetrics(hdc,&tm); hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH); SelectObject(hdc,hbrush); hpen=(HPEN)GetStockObject(WHITE_PEN); SelectObject(hdc,hpen); Rectangle(hdc,5,5,tm.tmAveCharWidth*8,tm.tmHeight+3);//sprintf(str,"%d%d\0",x,y);//TextOut(hdc,5,5,str,lstrlen(str)); EndPaint(hwnd,&ps);break;caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); hpen=(HPEN)GetStockObject(BLACK_PEN); SelectObject(hdc,hpen); Rectangle(hdc,50,50,350,350); MoveToEx(hdc,50,150,NULL); LineTo(hdc,350,150); MoveToEx(hdc,50,250,NULL); LineTo(hdc,350,250); MoveToEx(hdc,150,50,NULL); LineTo(hdc,150,350); MoveToEx(hdc,250,50,NULL); LineTo(hdc,250,350); EndPaint(hwnd,&ps);break;caseWM_DESTROY: PostQuitMessage(0);default:returnDefWindowProc(hwnd,message,wParam,lParam); }return(0);}BOOLInitWindowsClass(HINSTANCEhInstance) //定义窗口类{WNDCLASSWndClass; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.hCursor=LoadCursor(NULL,IDC

温馨提示

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

评论

0/150

提交评论