《Windows程序设计》实验教学大纲.docx
《《Windows程序设计》实验教学大纲.docx》由会员分享,可在线阅读,更多相关《《Windows程序设计》实验教学大纲.docx(80页珍藏版)》请在冰豆网上搜索。
《Windows程序设计》实验教学大纲
《Windows程序设计》实验教学大纲
《Windows程序设计》实验教学大纲
实验学时:
32学时实验个数:
11实验学分:
1
课程性质:
(必做)适用专业:
计算机科学与技术、软件工程、网络工程
教材及参考书:
《VisualC++面向对象与可视化程序设计教程》(第三版)
大纲执笔人:
大纲审定人:
郭涛
一、实验课的性质与任务
本课程实验大纲是面向计算机相关专业学生开设的《Windows程序设计》(以VC++为开发环境)实验课计划指导大纲,是依据《Windows程序设计》课程教学计划指导大纲编制。
本课程主要讲述了利用WindowsAPI函数和MFC进行简单的Windows程序开发的基本流程,结合该课程教学计划大纲的相应内容,设计了10个单项实验和综合实验,力求提高学生的动手能力,做到理论和实践相结合。
使学生在实验过程中掌握Windows程序设计的思想、原理,能使用SDK和MFC实现基于窗口的程序设计。
二、实验课程目的与要求
1.实验目的:
Windows程序设计实验课的开设,是为了使学生更好地理解和掌握运用VC开发环境开发Windows程序设计的基本理论、基本方法和基本技术,强化程序设计能力。
2.实验要求:
1)在实验中,要求学生个人独立思考,设计算法流程,编写出程序,完成上机调试,最后给出实验报告。
2)本课程的学习过程是复杂程序设计的训练过程,要求学生编写的程序结构清楚、正确易读,符合软件工程的规范;
a)3)在实验中更好地理解和掌握VC程序设计这门课程中所学的基本理论和方法,强化程序设计能力。
三、实验项目及内容提要
《Windows程序设计》实验课程(1106844037)
序号
实验项目编号
实验名称
学时
必做
选做
学分数
实验类型
内容提要
基本操作
验证
综合
设计
1
1
VisualC++6.0开发环境实验
2
√
√
熟悉VisualC++6.0开发环境
2
2
Windows应用程序基本框架实验
2
√
√
Windows框架程序设计
3
3
Windows绘图试验
4
√
√
GDI绘图
4
4
文本的输出方法与字体设置实验
2
√
√
GDI文字输出
5
5
键盘消息的响应实验
2
√
√
基本键盘消息响应
6
6
鼠标消息的响应实验
2
√
√
基本鼠标消息响应
7
7
资源在Windows编程中的应用实验
4
√
√
资源编程
8
8
控件API编程
4
√
√
控件编程
9
9
在MFC中创建应用程序资源
2
√
√
利用MFC创建资源
10
10
单文档与多文档
2
√
√
文档编程
11
11
综合性实验
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
#include
#include
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
#include
#include
#include
#definePi3.1415926
longWINAPIWndProc(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;
default
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
return0;
}
截图:
3、主要仪器设备及药品
Windows2000+VC6.0+MSDN
实验四文本的输出方法与字体设置
(验证性实验2学时)
1、目的要求:
理解字体句柄的念,熟悉Windows文字输出的基本方法和函数,学习字体格式的控制。
2、实验内容:
(选做1个)
1)在窗口中显示出26个英文字母,从左向右字母依次位置提高10个像素单位,并且颜色变为红色,然后回到正常位置;当到达最右端后改变方向从右向左依次变成红色并位置提高10个像素单位。
在窗口的第二行显示26个字母,字体从正常到斜体,颜色从黑色到天蓝色不断变换。
源代码:
#include
#include
#include
#include
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,bR