编程环境使用及基本Windows程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一编程环境使用及基本Windows程序
一、目的和要求
1.熟悉Visual C++6.0编程环境及编译错误的处理。

2.了解Windows程序的基本组成及其基本工作原理。

3.输入一个Windows程序,改正输入中的错误,观看运行结果。

二、实验原理
Visual C++6.0是Windows环境下最主要的应用开发系统之一,它是C++语言的集成开发环境,与Win32紧密相连,拥有强大的调试功能为大型复杂软件的开发提供了有效的排错手段。

创建新的项目工作区:File->New->Workspaces-> 输入工作区名字并指定工作区目录,然后选择Win32应用程序,添加C++源文件,输入文件名即可。

项目工作区窗口简介:项目工作区由ClassView、ResourceView及FileView三个面板组成。

核心概念:
窗口:是Windows应用程序基本的操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。

事件驱动:Windows程序设计围绕事件或消息的产生驱动运行处理函数。

消息是描述事件发生的信息。

句柄:是整个Windows编程的基础,一个句柄是Windows使用的一个唯一的整数值,用于标识应用程序中不同的对象和同类对象中不同的实例,应用程序通过句柄能够访问相应的对象信息。

消息:Windows利用消息与其它的应用程序及系统进行通信。

Windows消息由三部分组成:消息号、字参数、长字参数。

消息号由事先定义好的消息名称标识;字参数和长字参数用于提供消息的附加信息,其内容与具体的消息号有关。

MSG结构在头文件中定义如下:
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
核心函数:
WinMain函数是所有Windows应用程序的入口,功能是完成一系列的定义和初始化工作,并产生消息循环。

WinMain函数实现以下功能:注册窗口类,建立窗口及执行其他必要的初始化工作;进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程;当消息循环检索到WM_QUIT消息时终止程序运行。

窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接收到的消息的处理过程,是消息处理分支控制语句的集合。

通常,窗口函数由一个或多个switch语句组成。

每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case 语句被激活并执行相应的响应程序模块。

三、实验内容及步骤
1.建立工程,掌握编写Windows程序的正确步骤。

2.输入一个Windows程序。

3.编译程序,改正出现的语法和逻辑错误。

4.观察程序的运行结果。

5.在WinMain函数和WndProc函数中设置断点,观察执行的过程,体会消息驱动的含义。

四、思考问题
1.试着添加教材中提到的其它消息,观察程序运行的结果。

2.哪些是最常用的消息?
3.消息循环是如何实现的?
实验二图形设备接口及绘图
一、目的和要求
1.掌握设备描述表的基本概念。

2.掌握绘图函数。

3.掌握映射模式及相关函数。

二、实验原理
Windows图形设备接口(GDI,Graphics Device Interface)是为与设备无关的图形设计的,负责系统与用户或绘图程序之间的信息交换,并在输出设备上显示图形或文字。

设备描述表(Device Context)是一个用来确定任何设备的GDI输出位置和内容的属性集合,应用程序可以使用设备描述表的句柄来间接地存取设备描述表及其属性。

获取设备环境是应用程序输出图形的先决条件,常用的两种获取设备环境的方法是调用函数BeginPaint或GetDC。

调用BeginPaint函数:
hdc=BeginPaint(hwnd,&ps);
由BeginPaint函数获取的设备环境必须用EndPaint函数释放:
void EndPaint(HWND hwnd,PAINTSTRUCT &ps)
调用GetDC函数:
如果Windows应用程序的绘图工作并非由WM_PAINT消息驱动,则需调用GetDC函数获取设备环境,hdc=GetDC(hwnd);
由GetDC函数获取的设备环境必须用ReleaseDC函释放:
void ReleaseDC(HWND hwnd);
Windows绘图使用画笔和画刷进行,画笔的功能是画直线和曲线,画刷用于指定区域的填充。

Windows使用32位无符号整数表示颜色,32位整数中的低三位字节分别表示红、绿、蓝三颜色值,每一颜色值的范围是0到255。

映射模式定义了将逻辑单位转化为设备的度量单位以及设备的x方向和y方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况。

使用下面的语句来设置映射方式:
SetMapMode (hdc, iMapMode) ;
窗口:对应逻辑坐标系上程序员设定的区域。

视口:对应实际输出设备上程序员设定的区域。

窗口区域的定义由SetWindowExtEx函数完成:
BOOL SetWindowExtEx( HDC hdc,
int nHeight,nWidth,//以逻辑单位表示的窗口区域高宽度
LPSIZE lpSize,//函数调用前窗口区域尺寸的SIZE结构地址
);
视口区域的定义由SetViewportExtEx函数完成:
BOOL Set ViewportExtEx ( HDC hdc,
int nHeight,nWidth,//以物理设备单位表示的新视口区域高宽度
LPSIZE lpSize
);
Windows GDI 函数很多,常用的如下:
设置画笔当前位置的函数MoveToEx
BOOL MoveToEx ( HDC hdc,
int X, // X、Y分别为新位置的逻辑坐标
int Y,
LPPOINT lpPoint //lpPoint为存放原画笔位置的POINT结构地址
)
从当前位置向指定坐标点画直线的函数LineTo:
BOOL LineTo(HDC hdc,int X,int Y); //其中X和Y为线段的终点坐标。

三、实验内容及步骤
1.输入如下程序:利用绘图函数创建填充区,Windows通过使用当前画笔画一个图形的边
界,然后用当前的刷子填充这个图形来创建一个填充图形。

共有三个填充图形,第一个是用深灰色画刷填充带圆角的矩形,第二个是采用亮灰色画刷填充一个椭圆型图,第三个是用虚画刷填充饼形图。

2.输入如下程序:设置映射与使用映射模式。

本例要求程序的初始阶段按模式MM_TEXT
绘图,用户通过单击鼠标以改变映射模式,单击鼠标左键时,产生WM_LBUTTONDOWN消息,通知应用程序设置映射模式为ISOTROPIC,并调用InvalidateRect函数刷新用户区,在用户单击鼠标右键时,产生WM_RBUTTONDOWN 消息,应用程序将映射模式设置成ANSIOTROPIC,同时刷新用户区。

3.编译程序,改正出现的语法和逻辑错误。

4.观察输出的结果,验证程序的正确性。

5.单步执行程序,观察程序执行的过程,加深理解消息循环。

6.修改程序,使用不同的画刷、画笔和绘图函数,掌握绘图的基本原理。

7.修改映射模式,观察运行结果,掌握影射的概念。

8.完成教材练习4-8,应注意风车旋转时的角度、叶片的大小、旋转速度。

四、思考问题
1.查阅常用的绘图函数,了解对应的功能。

2.通过使用映射模式,了解TextOut函数中,映射模式对位置的影响。

3.在练习4-8中,可以使用两种更新屏幕的方法,各是什么?各有什么特点?
实验三文本输出及鼠标、键盘响应
一、目的和要求
1.掌握文本输出的基本概念。

2.掌握键盘和鼠标响应的基本概念。

二、实验原理
在Windows编程中,文本操作首先要获得文本句柄,此外,应用程序还要设置字体、字符大小、字符颜色等有关属性,并将这一些属性选入设备环境。

定义字体句柄变量:HFONT hF,调函数GetStockObject获得系统字体句柄,它返回的是系统的缺省字体,调用函数SelectObject将字体选入设备环境。

应用程序通过调用函数SetTextColor设置字体颜色,调用SetBkColor设置背景颜色。

可调用函数GreateFont创建自定义字体。

确定后续文本的坐标,应先获取当前的字符串的宽度,Windows系统提供函数GetTextExtentPoint32完成这项任务,并把它存储于一个SIZE结构中。

该函数的原型为:BooL GetTextExtentPoint32(HDC hdc,
LPCTSTR lpszString, //lpszString为指定的字符串
int nLength, //nLength为字符串中的字符数
LPSIZE lpSize //lpSize为返加字符串宽度及高度的SIZE数据结构的地址)
Windows编程中最常用的文本输出函数是TextOut,其函数原型如下:
BOOL TextOut(HDC hdc,
int X, int Y, //X, Y)为用户区中字符串的起始坐标
LPCTSTR lpstring, //lpstring为显示的字符串
int nCount //nCount为字符串中的字节数
);
该函数表示以坐标X,Y为起点,输出字节数为nCount、名为lpstring中的字符串。

键盘是一个基本的输入设备,鼠标在Windows提供的图形界面中的点击和拖放操作方便了用户对应用软件的操作。

键盘上每一个有意义的键都对应着一个唯一的标识值,称之为扫描码;虚拟码是由Windows系统定义的与设备无关的键的标识,设备驱动程序截取键的扫描码后,把它翻译成虚拟码。

键盘消息可以分成两类,即按键消息和字符消息。

每当用户按下或松开一个键时,就产生了一个按键消息。

当一个按键的组合产生了一个可以显示的字符时,就产生了一个字符消息。

按键消息的wParam参数包含了识别按下的键的虚键码。

在鼠标消息中,参数lParam包含了鼠标位置,lParam字的低位包含了鼠标位置的x坐标值,lParam字的高位包含了鼠标位置的y坐标。

lParam所表示的坐标是相当于窗口的左上角为原点的坐标值;参数wParam内包含了一个指示各种虚键状态的值。

对于鼠标消息的处理,一般又分为两种,一种是要对Shift和Ctrl键进行监测,另一种则不监测,要分别处理。

三、实验内容及步骤
1.输入如下程序:在用户窗口上输出几行字符串,当窗口接收到WM_PAINT消息后,显
示的文本每次都被重新刷新。

2.输入如下程序:在窗口的客户区显示输入的字符,并响应回退键(BackSpace)、Delete
键和回车键。

3.输入如下程序:用户在窗口的不同区域移动鼠标时,光标将显示不同的形状,如“十”
字形光标、“水平双箭头”光标、“垂直双箭头”光标、“沙漏光标”。

4.编译程序,改正出现的语法和逻辑错误。

5.观察输出的结果,验证程序的正确性。

6.修改颜色、字体、输出位置,观察程序运行结果。

7.创建自定义字体,设置下划线、斜体等特殊字体。

8.修改函数的输入参数,设置鼠标的不同形状。

四、思考问题
1.在应用程序中,如何响应各种键盘信息?
2.字符消息和按键消息有什么不同?
3.如何响应鼠标和键盘的击键组合?
实验四资源的使用
一、目的和要求
1.掌握菜单、对话框等资源的概念。

2.掌握菜单编程和对话框编程。

二、实验原理
菜单是Windows图形用户界面中窗口的重要组成部分。

菜单可使用户直观地了解并方便地使用应用程序所提供的各项功能。

Windows应用程序中加载菜单的方法有如下三种:在窗口类中加载菜单;在创建窗口时加载菜单,即在调用函数CreateWindow创建窗口时加载窗口菜单;动态加载菜单,在调用函数LoadMenu获取菜单句柄后,通过调用函数SetMenu动态地加载菜单。

调用函数EnableMenuItem()改变其初始状态:禁止或激活菜单项。

可在应用程序中通过两种形式动态地增加菜单项:可调用函数AppendMenu在菜单的尾部增加菜单项;也调用函数InsertMenu 在菜单中插入新的菜单项。

对菜单项的处理是核心内容,使用如下的格式:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{ switch (message)
{
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
c ase IDM_ADDMENU:
}
}
}
}
对话框是一个弹出式窗口,它一般用于程序需要用户输入或者需要和用户进行交互活动的场合。

模式对话框不允许用户在关闭对话框之前切换到应用程序的其他窗口。

当一个模式对话框初始化时,对话框的消息循环将处理消息,但并不返回给WinMain函数。

非模式对话框允许用户在该对话框与应用程序其它窗口之间的切换,即对话框和其他应用程序的窗口之间进行切换。

无模式对话框从WinMain函数的消息循环中接收输入。

在资源描述文件中定义对话框资源后,应用程序可通过调用DialogBox函数在窗口中显示,调用函数EndDialog关闭对话框。

非模态对话框的创建由函数CreateDialog完成,调用函数DestroyWindow关闭对话框。

由于非模态对话框并不禁止应用程序向其他窗口发送消息,因此,在WinMain函数的消息循环中必须包含截获发往非模态对话框的消息,并将其发往相应的对话框处理函数进行处理。

三、实验内容及步骤
1.创建一个窗口菜单框架,菜单栏包含“文件”、“编辑”和“帮助”菜单,还包括相应的
下拉菜单,用户单击其菜单选项,完成预定功能。

2.创建一个含有菜单的对话框程序,可以根据菜单显示一个模态对话框和非模态对话框。

3.根据教材的要求,使用资源编辑器建立程序中使用的菜单、加速键。

4.将自定义菜单的ID用常数表示出来。

5.补全所需的其它内容。

6.编译程序,改正出现的语法和逻辑错误。

7.观察程序运行的结果,掌握菜单的工作原理。

8.将教材习题4-8增加菜单,可以根据菜单来设定风车大小、旋转方向、旋转速度。

四、思考问题
1.菜单项的ID值是如何响应鼠标事件的?
2.模式对话框和非模式对话框有什么不同?在消息处理上的区别是什么?
3.程序中添加资源后,会增加哪些文件,它们的功能是什么?
实验五Windows基本控件的使用(综合性实验)
一、目的和要求
1.掌握常用控件的基本概念。

2.掌握动态数据交换的含义及使用。

3.掌握按钮编程和编辑框编程。

二、实验原理
控件是Windows 图形用户界面的主要组成部分之一,用户通过操作控件对象完成与应用程序之间的交互。

这里主要介绍按钮和编辑框控件。

按钮包括以下几种:
普通按钮:适用于消息的发送;
单选按钮:适用于同一组属性相同的数据中选一个数据;
复选框按钮:常用于只有两种,完全相反状态的情况下。

按钮通常响应ON_BN_CLICKED消息。

编辑框控件看起来是个非常简单的矩形窗口,但它具有许多功能,编辑框控件可以自带滚动条,显示多行文本。

编辑框类CEdit是CWnd类直接派生来的,它具有CWnd的所有功能。

编辑框通过向其父窗口发送WM_COMMAND消息通知应用程序用户的交互信息,应用程序对编辑框的操作通过调用函数SendMessage或SendDlgItemMessage给编辑框发送消息。

DDX(动态数据交换)的基本特征是在对话框中某控件和某成员变量之间建立连接,自动实现控件和变量之间的数据更新。

它的工作方式是当ClassWizard把某变量和控件连接起来时,它在数据映射中创建一个入口。

当调用UpdateData(FALSE)时,MFC调用DoDataExchange 函数,ClassWizard放于DoDataExchange中的实现代码将把来自变量的数据拷贝到对应的控件。

如果调用UpdateData(TRUE),MFC把数据拷贝回变量。

三、实验内容及步骤
1.输入实现如下功能的程序:
2.编写一个对话框程序,实现如下功能:窗口中有一个垂直放置的滚动条控件、多个按钮
和一个提示用的编辑框,根据用户的操作在编辑框中同步显示滑块的位置。

步骤如下:
①添加控件,并且设置合适的属性②给滚动条设置变量③给滚动条添加代码。

3.编写一个对话框程序,实现如下功能:对话框程序含有菜单,窗口中有三个编辑框控件
和一个按钮,编辑框依次用来表示输入的乘数、被乘数和乘积的结果,按钮或菜单用来进行乘法运算及其它操作。

步骤如下:①添加控件,并且设置合适的属性,②给按钮添加响应代码。

4.定义变量时根据要求选择变量类型。

5.查看向导生成的动态数据交换的代码,理解其含义。

6.在按钮响应函数中设置断点,观察响应单击事件。

四、思考问题
1.按钮是如何响应鼠标单击事件的?
2.将编辑框控件定义成控件类型或者字符串类型有什么不同?
3.类向导中的消息映射面板和成员变量面板各有什么功能?。

相关文档
最新文档