第二章Windows程序设计ppt.ppt

上传人:qwe****56 文档编号:70105464 上传时间:2023-01-16 格式:PPT 页数:185 大小:1.26MB
返回 下载 相关 举报
第二章Windows程序设计ppt.ppt_第1页
第1页 / 共185页
第二章Windows程序设计ppt.ppt_第2页
第2页 / 共185页
点击查看更多>>
资源描述

《第二章Windows程序设计ppt.ppt》由会员分享,可在线阅读,更多相关《第二章Windows程序设计ppt.ppt(185页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、目录目录 2.12.1WindowsWindows操作系统介绍操作系统介绍 2.22.2Windows Windows 编程模式编程模式 2.32.3 结束语结束语 第二章第二章 WindowsWindows程序设计程序设计 Windows是一个具有可视化图形用户界面的多任务的操作系统,它为用户提供了风格统一的由窗口、菜单、工具栏等界面元素所构成的多任务环境。2.12.1 WindowsWindows操作系统介绍操作系统介绍 2.1.1 2.1.1 WindowsWindows操作系统的发展简介操作系统的发展简介 1.Microsoft公司早在1985年和1987年分别推出 Windows 1

2、.03版和Windows2.0版。2.1990年5月推出Windows3.0。3.1991年推出Windows3.1。4.1995年推出新一代操作系统Windows95,是操作系统发展史上一个里程碑式的作品。2.1.2.2.1.2.WindowsWindows操作系统的特点操作系统的特点 直观、高效、统一的面向对象的图形用户界面,易学易用 丰富的设备无关的图形操作 多任务多进程 2.1.3.2.1.3.WindowsWindows的内存管理的内存管理 Windows系统采用虚拟内存,在操作系统中有两种存贮器,物理存贮器和虚拟存贮器。虚拟内存系统的工作过程如下虚拟内存系统的工作过程如下:1.当建

3、立一个新进程时,操作系统赋予每个进程2GB的虚拟地址(不是内存)。2.虚拟内存管理器把应用程序的代码映射到应用程序的 虚拟地址空间的某个位置,并把当前所需要的代码加 载到物理内存。3.如果应用程序使用了动态链接库(DLL),则被映射到 进程的虚拟地址空间,并在需要时加载到物理内存。4.程序的数据存储和栈操作等需要的空间在物理内存中分配,并映射到虚拟地址空间。5.应用程序使用虚拟地址空间中的地址开始执行,虚拟内存管理器把每个对内存的访问映射到物理内存的某个位置,从而访问数据。2.2.2.2.Windows Windows 编程模式编程模式 由于Windows 操作系统完全不同于单任务的MS-DO

4、S 操作系统,Windows程序设计有着完全不同模式,具有图形用户界面、多任务、多窗口等特点。Visual C+Visual C+提供两套完整的提供两套完整的Windows Windows 程序开发系统:程序开发系统:直接使用Windows提供的API 函数;采用面向对象的方式,使用微软基础类库MFC。Windows API是Windows 系统和Windows 应用程序间的标准接口,为应用程序提供Windows支持的函数定义、参数定义和消息格式等。标准标准Win32 API Win32 API 函数可以分为以下几类:函数可以分为以下几类:1)系统服务 2)通用控件库3)图形设备接口4)网络服

5、务5)用户接口6)系统Shell 7)Windows 系统信息 2.2.1 2.2.1 Windows APIWindows API简介简介 2.2.2 Windows2.2.2 Windows程序设计的基本概念程序设计的基本概念 1.1.窗口窗口 -窗口是Windows程序的基本操作单元,是应用程序与用户之间进行交互的接口,也是系统管理应用程序的基本单位。编写应用程序其实就是创建一个或多个窗口,程序的执行过程是窗口内部、窗口与窗口之间以及窗口与系统之间进行数据交换与处理的过程。在winuser.h中定义了代表窗口的WNDCLASS结构类型。typedef struct tagWNDCLASS

6、 UINT style;/窗口风格窗口风格 WNDPROC lpfnWndProc;/指向窗口处理函数的函数指针指向窗口处理函数的函数指针 int cbClsExtra;/窗口结构中的预留字节数窗口结构中的预留字节数 int cbWndExtra;/本本窗口创建的其它窗口结构中预留字节数窗口创建的其它窗口结构中预留字节数 HINSTANCE hInstance;/注册该窗口类的实例句柄注册该窗口类的实例句柄 HICON hIcon;/代表该窗口类的图标句柄代表该窗口类的图标句柄 HCURSORhCursor;/该该窗口客户区鼠标光标句柄窗口客户区鼠标光标句柄 HBRUSHhbrBackGrou

7、nd;/该窗口背景颜色句柄该窗口背景颜色句柄 LPCSTRlpszMenuName;/指向窗口菜单名的字符指针指向窗口菜单名的字符指针 LPCSTRlpszClassName;/指向窗口名的字符指针指向窗口名的字符指针 WNDCLASS,*PWNDCLASS,NEAR*NPWNDCLASS,FAR*LPWNDCLASS;2.2.句柄和句柄和WindowsWindows对象对象 Windows对象-窗口、图标、光标、菜单及正在运行的应用程序实例等等。句 柄-系统用来唯一标识某个Windows对象的一个无符号整数,相当于Windows对象的名字,应用程序只有通过句柄才能使用Windows对象。应用

8、程序是通过恒定不变的句柄来访问程序中各个对象的。这是多任务操作系统对多个进程进行管理的基本手段。Windows常用句柄类型如下所示:句柄类型句柄类型 说明说明HANDLE 一般类型句柄 HWND 窗口类型句柄 HINSTANCE 程序实例句柄 HCURSOR 光标类型句柄 HFONT 字体类型句柄 HPEN 画笔类型句柄 HBRUSH 画刷类型句柄 HDC 设备描述表类型句柄 HICON 图标类型句柄 HMENU 菜单类型句柄 HBITMAP 位图类型句柄 HFILE 文件类型句柄 3.3.事件与消息事件与消息 事件-在Windows环境下,应用程序启动后,系统等待用户在图形用户界面内的输入选

9、择,如鼠标按键、键盘按键、窗口被创建、关闭、改变大小、移动等。只要有事件发生,系统即产生特定的消息,消息描述了事件的类别,包含了相关信息,Windows应用程序利用消息与系统及其它应用程序进行信息交换。由于windows事件的发生的是随机的,程序的执行先后顺序也无法预测,系统采用消息队列来存放事件发生的消息,然后从消息队列中依次取出消息进行相应的处理。在winuser.h中,消息结构的定义如下:typedef struct tagMSG HWND hWnd;/指定消息发向的窗口句柄指定消息发向的窗口句柄UINTmessage;/标识消息的消息值标识消息的消息值WPARAM wParam;/消息

10、参数消息参数LPARAM lParam;/消息参数消息参数DWORDtime;/消息进入队列的时间消息进入队列的时间POINTpt;/消息进入队列时鼠标指针的屏幕坐标消息进入队列时鼠标指针的屏幕坐标 MSG,*PMSG,NEAR*NPMSG,FAR*LPMSG;下面介绍消息结构中各个成员的意义:下面介绍消息结构中各个成员的意义:a)message是标识消息的消息值或消息名。每个消息都有唯一一个数值标识,常用不同前缀的符号常量以示区别。例如,WM_表示窗口消息。WindowsWindows常用的窗口消息和消息值定义,常用的窗口消息和消息值定义,定义于定义于winuserwinuser.h.h中:

11、中:#define WM_CREATE 0X0001 /创建窗口产生的消息创建窗口产生的消息#define WM_DESTROY 0X0002 /撤销窗口产生的消息撤销窗口产生的消息#define WM_PAINT 0X000F /重画窗口产生的消息重画窗口产生的消息#define WM_CLOSE 0X0010 /关闭窗口产生的消息关闭窗口产生的消息#define WM_CHAR 0X0102 /按下非系统键产生的字符消息按下非系统键产生的字符消息#define WM_USER 0X0400 /用户自定义消息用户自定义消息 b)wParam和lParam都是32位消息参数,其数据类型在win

12、def.h中定义如下:typedef UINT WPARAM;typedef LONG LPARAM;c)pt表示消息进入消息队列时鼠标指针的屏幕坐标,POINT是定义在windef.h中的结构体,表示屏幕上一个点:typedef struct tagPOINT LONG x;/表示点的屏幕横坐标表示点的屏幕横坐标 LONGy;/表示点的屏幕纵坐标表示点的屏幕纵坐标 POINT,PPOINT,NEAR*NPPOINT,FAR*LPPOINT;4.4.进程与线程进程与线程 32位Windows提供“进程-线程-窗口”的模式来管理运行的程序。“程序”指存储在介质上、含有指令和数据的文件,是一个被动

13、的对象;“进程”是一个被运行的程序的实例,代表了内存中正在运行的指令和系统资源,如地址空间、打开的文件等,是一个主动对象。“进程”又分为“动态”和“静态”的两部分,其中“动 态”部分形成“线程”概念。进程并不执行代码,它只是线程的容器,拥有系统资源和私有资源。当创建一个进程的同时也创建了第一个线程,称为“主线程”,线程是进程主动的关键。主线程的入口函数是WinMain。之后,主线程可以在进程中再创建一个或多个线程,即“多线程”,多个线程共享进程的静态部分。使用进程-线程模式,是因为创建一个线程比一个进程所需资源要少,且线程间共享进程地址空间,简化了进程间的通信,可提高程序执行效率。窗口是应用程

14、序和用户进行交互的接口,窗口总是由线程拥有,一个线程可以拥有一个或多个窗口,也可没有窗口。关系如下图所示:进程1线程1.1线程1.2线程1.3窗口1.1.2窗口1.1.1窗口1.1.3进程2线程2.1窗口2.1.15.5.资源共享资源共享 不同之处:不同之处:DOS程序:在运行时独占系统的全部资源,包括显示器、内存等,直到程序结束时才释放资源。Windows:它是一个多任务的操作系统,各个应用程序 共享系统提供的资源。WindowsWindows的基本模式是:的基本模式是:向Windows系统请求资源;使用该资源;释放该资源给Windows以供别的程序使用。注意:注意:1.最容易忽略的是第三步

15、,如果忽略了这一步,会 出现程序运行出现异常情况,或干扰其它程序正 常运行,甚至造成立即死机,如设备上下文没有 释放时。2.CPU也是一种非常重要的资源,应用程序应避免长 时间的占用CPU资源;如果确实需要这样做,也应 当采取一些措施,以让程序能够响应用户的输入。3.主存也是一个共享资源,要防止同时运行的多个应 用程序因协调不好而耗尽内存资源。6.6.数据类型数据类型 包括简单类型和结构类型,常用数据类型说明如包括简单类型和结构类型,常用数据类型说明如下:下:数据类型数据类型说说 明明 BYTE 8 8位无符号字符位无符号字符 BSTR 3232位字符指针位字符指针 COLORREF 3232

16、位整数,表示一个颜色位整数,表示一个颜色 WORD 16 16位无符号整数位无符号整数 LONG 32 32位有符号整数位有符号整数 DWORD 32 32位无符号整数位无符号整数 UINT 32 32位无符号整数位无符号整数 BOOL 布尔值,值为布尔值,值为TRUETRUE或或FALSEFALSE2.2.3 Windows 2.2.3 Windows 程序结构程序结构 1.Windows1.Windows应用程序的构成应用程序的构成 组成:组成:程序代码、用户界面资源和动态链接库库模块(dynamic-link library)。程序代码主要由可执行代码构成 资源是应用程序所能够使用的一类

17、预定义工具,用户界面资源是应用程序定义的图形用户接口GUI(graphical user interface),如菜单、对话框、按钮等。资资 源类型源类型 说明说明快捷键(Accelerator)存贮击键和命令组合存贮击键和命令组合位图(Bitmap)包括包括WindowsWindows匹配格式的图形匹配格式的图形对话框(Dialogbox)对话框控件细节、布局、属性对话框控件细节、布局、属性图标(Icon)存贮图标用位图组存贮图标用位图组菜单(Menu)菜单和菜单组文本和布局细节菜单和菜单组文本和布局细节字符串表(String table)存字符串和相关标识符存字符串和相关标识符(ID)(I

18、D)值值工具栏(Toolbar)工具栏布局细节和画按钮所用的位图工具栏布局细节和画按钮所用的位图版本消息(Cursor)程序状态消息,如程序名,作者,拷贝日期程序状态消息,如程序名,作者,拷贝日期 版本号光标包括画光标用的特殊位图版本号光标包括画光标用的特殊位图常用资源如下:常用资源如下:Windows应用程序的创建与控制台应用类似,要经过编译、链接两个阶段,要增加资源编辑、编译过程。过程如下图:过程如下图:集成开发环境集成开发环境应用程序向导应用程序向导资源编辑器资源编辑器Create.DEF.CPP.H.DSW.DSP.ICC.RC.BMP源文件源文件资源文件资源文件编译编译.objBui

19、ld资源编译资源编译.res应用程序应用程序2.2.应用程序的执行过程应用程序的执行过程(1)操作系统接收命令后,创建新的进程和初始 线程(initial thread)。(2)应用代码加载内存。(3)如应用了DLL,则加载DLL到内存。(4)为项目空间(如数据和堆栈)分配物理内存,并映射到虚拟地址空间。(5)应用程序开始执行。3.3.处理消息处理消息 消息处理过程如下图所示:消息处理过程如下图所示:硬件消息硬件消息系统队列系统队列应用应用1消息队列消息队列应用应用2消息队列消息队列应用应用3消息队列消息队列消息循环消息循环窗口过程窗口过程缺省缺省窗口过程窗口过程发送消息发送消息派发消息派发消

20、息应用应用3(1).当Windows应用程序开始执行,操作系统在预定的入口WinMain与应用程序连接;(2).应用程序创立一个或更多的窗口,每个窗口(包括对话框)都有一个窗口过程函数,程序通过窗口接收用户的输入和决定窗口显示;(3).各种输入产生的消息首先进入系统队列,由系统根据产生消息的窗口将消息发至窗口所在应用程序的消息队列;(4).程序的消息循环代码段检索从消息队列中来的消息,并把它们返回Windows,由Windows发给适当的窗口过程函数进行处理,对于程序未响应的消息,发给缺省窗口过程函数进行处理。2.2.4 Windows 2.2.4 Windows 程序设计实例程序设计实例 例

21、一例一.最简单的Windows应用程序,输出一个消息窗口。过程:过程:(1).创建工程,选择File|New菜单项,如图2.4,在Project页面,选择Win32 Application工程类型,输入工程名Ex2_1并选择工程路径,按OK按钮至下一步;(2).在Win32 Application-Step 1 of 1对话框(图2.5),选择A Simple Win32 Application单选项,按Finish按钮;(3).集成开发环境为工程生成stdafx.h,stdafx.cpp 和Ex2_1.cpp文件,并产生了WinMain函数的框架。在WinMain函数体内,加入Message

22、box一条语句。#include include stdafxstdafx.h.h int int APIENTRY APIENTRY WinMain WinMain(HINSTANCE(HINSTANCE hInstance hInstance,HINSTANCE,HINSTANCE hPrevInstancehPrevInstance,LPSTRlpCmdLineLPSTRlpCmdLine,int nCmdShow int nCmdShow )MessageBoxMessageBox(NULL,“My first Windows(NULL,“My first Windows Applic

23、aion Applicaion!”,“Ex2_1”,!”,“Ex2_1”,MB_OK);MB_OK);return 0;return 0;(4).选择Build|Build Ex2_1.exe菜单项创建可执行 文件,然后选择Build|Exacute Ex2_1.exe,执行程序,结果如图2.6。图图2.42.4 图图2.52.5 图图2.62.6 说明说明:1.(1)stdafx.h是一个预编译头文件,Windows包含进 程序的头文件很多,在程序开发过程中需要不 断地编译,如果每次全部重新编译非常浪费时间;(2)stdafx的目的就是将前面编译的结果储存起来,下一次编译时从磁盘取出来,对未

24、修改部分不再 重新编译,这样可大大节省编译时间;(3)stdafx.cpp中主要有包含windows.h一条指令,windows.h windows.h是windows程序最基本的 头文件,它们定义了windows的所有数据类型、数据结构、符号常量和API函数原型声明。2.WinMain函数是windows程序的入口函数,包含4个参数:(1)hInstance是唯一标识本程序的实例句柄,系统 和其它应用程序通过该句柄与本程序通讯。(2)hPrevInstance是本程序的前一个实例句柄,由 于32位windows采用进程线程模式,每一线程 拥有自己的句柄,因此该参数始终为空。(3)lpCmdL

25、ine是一个字符串指针,指向命令行参数 字符串,没有命令行参数时为空。(4)nCmdShow指明程序最初运行时窗口打开方式,如正常方式、最大化或最小化运行。(5)WinMain返回一个整数值,作为退出代码。APIENTRY表示函数调用约定,函数调用时参数 按从左至右的顺序压入栈,由被调用者将参数 弹出栈。3.MessageBox 是一个API函数,显示一个消息框,其原型为:int WINAPI MessageBox(HWND hWnd,LPCSTR lpszText,LPCSTR lpszCaption,UINT uType);第一个参数指明此消息框的父窗口句柄,为NULL 则说明没有父窗口;

26、第二、三个参数类型均为字符型指针,分别指向消 息框中要显示的字符串和消息框标题栏 显示的字符串;第四个参数是一个无符号整数,表明消息框中显示 的按钮和风格。WindowsWindows已有定义:已有定义:#define MB_OK0 x00000000L/OK/OK按钮按钮#define MB_OKCANCEL0 x00000001L/OK/OK和和CANCELCANCEL两个按钮两个按钮#define MB_ABORTRETYRIG NORE 0 x00000002L /ABORT/ABORT、RETRY RETRY、/IGNORE/IGNORE三个按钮三个按钮#define MB_YESN

27、OCANCEL0 x00000003L /YES/YES、NONO、CANCELCANCEL三三/个按钮个按钮uTypeuType参数参数 即可取这些定义值或是它们按位或运算的组合。MessageBoxMessageBox返回所按下按钮的返回所按下按钮的IDID值。值。即Windows用一个无符号整数唯一表示某个资源(对话框、按钮、菜单等等),并定义一个唯一的符号常量与之对应,称为资源的ID值。windowswindows内部定义的部分资源标识内部定义的部分资源标识:#define IDOK1 /OK/OK按钮按钮IDID值值#define IDCANCEL 2 /CANCEL/CANCEL按

28、钮按钮IDID值值#define IDABORT3 /ABORT/ABORT 按钮按钮IDID值值#define IDRETRY4 /RETRY/RETRY按钮按钮IDID值值#define IDIGNORE 5 /IGNORE/IGNORE按钮按钮IDID值值#define IDYES 6 /YES/YES按钮按钮IDID值值#define IDNO7/NO/NO按钮按钮IDID值值例例2 2显示一个窗口的显示一个窗口的WindowsWindows应用程序。应用程序。工程创建方法同例工程创建方法同例1 1,按下面内容编辑源文件,按下面内容编辑源文件Ex2_2.cppEx2_2.cpp。#in

29、clude /包含包含windows.hwindows.h头文件头文件LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/窗口函数声明窗口函数声明/*/*入口函数入口函数 WinMainWinMain()*/()*/int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)WNDCLASS wndclass;/定义窗口类结构变量定义窗口类结构变量 HWND hwnd;/定义窗口句柄定义窗口句柄 MSG msg;/定义

30、消息结构变量定义消息结构变量 /定义窗口类定义窗口类 wndclass.style=CS_HREDRAW|CS_VREDRAW;/改变窗口口大小则重画改变窗口口大小则重画 wndclass.lpfnWndProc=WndProc;/窗口函数为窗口函数为 WndProcWndProc wndclass.cbClsExtra=0;/窗口类无扩展窗口类无扩展wndclass.cbWndExtra=0;/窗口实例无扩展窗口实例无扩展 wndclass.hInstance=hInstance;/注册窗口类的实例句柄注册窗口类的实例句柄 wndclass.hIcon=LoadIcon(NULL,IDI_A

31、PPLICATION);/窗口用默认光标窗口用默认光标 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);/显口用箭头光标显口用箭头光标 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);/背景为白色背景为白色 wndclass.lpszMenuName=NULL;/窗口缺省无菜单窗口缺省无菜单 wndclass.lpszClassName=Ex2_2;/窗口类名为窗口类名为Ex2_2Ex2_2/注册窗口类。若失败则返回注册窗口类。若失败则返回 /显示并更新窗口显示并更新窗口 ShowWi

32、ndow(hwnd,nCmdShow);/显示窗口显示窗口 UpdateWindow(hwnd);/更新窗口的客户区更新窗口的客户区 /消息循环消息循环 while(GetMessage(&msg,NULL,0,0)/获取消息,遇获取消息,遇WM_QUITWM_QUIT退出循环退出循环 TranslateMessage(&msg);/键盘消息转换键盘消息转换 DispatchMessage(&msg);/派送消息给窗口函数派送消息给窗口函数 return msg.wParam;/返回退出值返回退出值 /窗口函数窗口函数 LRESULT CALLBACK WndProc(HWND hwnd,UI

33、NT message,WPARAM wParam,LPARAM lParam)/根据消息值转相应的消息处理根据消息值转相应的消息处理switch(message)/重画窗口客户区消息处理重画窗口客户区消息处理 case WM_PAINT:HDC hdc;/定义设备描述表句柄定义设备描述表句柄 PAINTSTRUCT ps;/定义绘图信息结构变量定义绘图信息结构变量 hdc=BeginPaint(hwnd,&ps);/获取要重画的窗口的设备描述表句柄获取要重画的窗口的设备描述表句柄 TextOut(hdc,0,0,This is my Windows application,60);/输出文本输

34、出文本 EndPaint(hwnd,&ps);/结束要重画的窗口结束要重画的窗口 return 0;程序的运行结果:程序的运行结果:/撤消窗口消息处理撤消窗口消息处理case WM_DESTROY:PostQuitMessage(0);/产生退出程序消息产生退出程序消息WM_QUITWM_QUIT return 0;return DefWindowProc(hwnd,message,wParam,lParam);/其它转缺省窗口函数其它转缺省窗口函数说明:说明:1.WinMain-1.WinMain-在在WinMainWinMain中主要完成以下工作:中主要完成以下工作:(1)定义一个窗口类,

35、包括定义窗口对象并对它的相关成员赋值;(2)注册窗口类,调用RegisterClass注册窗口类,并判断是否 注册成功。其参数是WNDCLASS结构类型指针,用需要注册的 窗口对象地址进行调用;(3)创建窗口,定义注册窗口后,可以创建一个或多个同类型的 窗口;由API函数CreateWindow创建窗口,并返回所创建窗口 的句柄;(4)调用API函数ShowWindow和UpdateWindow显示并更新窗口,它们的参数相同,第一个参数是要显示的窗口句柄,第二个 参数是窗口显示的方式;(5)程序运行的准备工作完成,进入消息循环(while循环),GetMessage函数从应用程序消息队列中读取

36、消息,TranslateMessage函数进行键盘消息转换,然后由DispatchMessag将消息派送给相应的窗口函数进行处理 当消息队列为空时,应用程序进入等待状态,等待用户输入。当GetMessage获取到WM_QUIT消息时,返回FALSE,结束 消息循环。a.GetMessage函数原型如下:BOOL WINAPI GetMessage(LPMSG,HWND,UINT,UINT);其中 第一个参数为存放消息的MSG结构指针,第二个参数表示接收消息的窗口句柄,第三、四个参数分别表示要获取的最大和最小消息值。当后三个参数值设为NULL或0时,表示应用程序接收它 所创建的所有窗口的所有消息

37、。b.TranslateMessage函数负责键盘消息转换。TranslateMessage完成的工作:击键消息除字符键消息外,其它击键操作产生虚拟键消息,包括 WM_KEYDOWN,WM_SYSKEYDOWN,WM_KEYUP,WM_SYSKEYUP,这些虚拟键消息必须通过转换成字符消息程序才能响应,这就是TranslateMessage完成的工作。消息派送流程消息派送流程 c.DispatchMessage函数 负责将消息派送到相应的窗口函数,如下图所示:hWndMessagewParawIparamTimePtMSGEx2_2Ex2_2HWNDStyleWndprocEx2_2Ex2_2

38、WNDCLASS2.WndProc2.WndProc函数函数 -是一个消息处理函数,应用程序的表现完全取决于窗口函数的定义。WndProc的原型如下:LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);第一个参数表示对应窗口的句柄,第二个参数是需要处理的消息的消息值,第三、四个参数包含了相应消息的某些信息,如消息发生时鼠标位置等等。WndProc函数的结构是一个switch语句,根据消息值不同,选择不同的case子句执行。3.3.进队消息和不进队消息进队消息和不进队消息 窗口函数一般由系统调用

39、,应用程序不直接调用它,而是通过SendMessage()函数发送消息来间接调用窗口函数。消息分为进队消息和不进队消息。(1)(1)进队消息进队消息 -是由windows放入应用程序消息队列、由应用程序消息循环从消息队列中取出并派送到窗口函数的消息。调用API函数PostMessage可以派送(dispatch)一条消 息到指定窗口的消息队列,其原型如下:BOOL WINAPI PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);其中其中MsgMsg参数指定了要发送的消息值参数指定了要发送的消息值(名名)。(2)(2)不进队消

40、息不进队消息 -不进入消息队列,直接发送(send)给指定窗口的窗口函数进行处理。调用CreateWindow()创建窗口时发送的WM_CREATE消息,调用UpdateWindow()更新窗口时发送的WM_PAINT消息,调用DestroyWindow()时发送的WM_DESTROY消息,都是不进队消息。可以通过调用可以通过调用SendMessageSendMessage函数直接发送消息给窗口:函数直接发送消息给窗口:LRESULT WINAPI SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);4.4.设备描述表设备描述

41、表 WM_PAINT是重画窗口客户区消息,当窗口内容被改变、移动或窗口被覆盖后,需要对窗口进行重画,一般应用程序都需要处理这个消息,处理这一消息需要获取设备描述表句柄。Windows的图形设备接口GDI(Graphics Device Interface)是一组API函数,它提供与设备无关的 图形功能,使应用程序在不同图形设备(如打印机)上进行相同的操作(调用GDI函数),而无需考虑设 备的硬件差异,设备无关性是通过设备描述表实 现的。设备描述表DC(Device Context)-也称为设备上下文,是GDI内部定义的一个有图形对象、图形方式及其属性的一个数据结构,与特定设备相关,描述了硬件设

42、备的具体特征信息。与具体设备相关的操作交给DC,将应用程序的设备无关图形功能调用转换为 在设备驱动程序下执行的设备相关操作。应用程序不能直接访问设备描述表,为了进行图形输出,必须先获取设备描述表句柄,然后以设备描述表句柄为参数调用GDI函数,实现图形功能。5.5.应用程序的退出应用程序的退出 当用户选择File菜单的退出菜单项时,windows会产生一系列消息,如键盘或鼠标消息,WM_SYSCOMMAND消息,WM_CLOSE消息,WM_CLOSE是一条进队消息,被放入应用程序消息队列中。GetMessage函数从消息队列中取得WM_CLOSE消息,由DispatchMessage派送给窗口函

43、数,窗口函数中没有对WM_CLOSE处理的代码,转由缺省窗口函数处理,缺省窗口函数调用DestroyWindow函数撤销窗口,并将不进队消息WM_DESTROY直接发送给窗口函数,窗口函数处理WM_DESTROY时调用函数void PostQuitMessage(int nExitCode);并产生WM_QUIT消息放入消息队列中,其中参数nExitCode是应用程序退出代码。GetMessage函数取得WM_QUIT消息后,返回FALSE,结束消息循环,此时msg.wParam中存放的是调用PostQuitMessage时的参数,应用程序执行下面语句返回此参数并退出程序。return msg

44、.wParam;2.3 2.3 结束语结束语 使用API函数开发Windows应用程序,程序有大致相同的结构,在WinMain中完成定义、注册、创建、显示窗口的任务,启动消息循环,派送不同消息到各个窗口函数处理;在WndProc函数中,根据消息参数判断类型,转到相应的代码断进行处理,各种操作都借助API函数完成。因此,熟悉掌握Windows程序结构、API函数的功能和参数、各类消息的一般处理方法及参数的含义,都非常重要。3.1.3.1.MFCMFC程序设计介绍程序设计介绍3.2.3.2.MFC MFC 程序设计程序设计3.3.3.3.用户界面资源的应用用户界面资源的应用3.4.3.4.对话框的

45、应用对话框的应用3.5.3.5.基于对话框的应用程序设计基于对话框的应用程序设计3.6.3.6.文本和图形输出文本和图形输出3.7.3.7.文档的保存文档的保存3.8.3.8.拆分窗口和多视图的拆分窗口和多视图的MDIMDI应用程序开发应用程序开发目录目录第三章第三章 用用MFC MFC 设计设计WindowsWindows应用程序应用程序 微软基础类库微软基础类库MFC(Microsoft Foundation Class),MFC(Microsoft Foundation Class),包含了所有与系统相关的类包含了所有与系统相关的类(包括图形用户界面相关的类包括图形用户界面相关的类),其

46、中封装了大多数的,其中封装了大多数的APIAPI函数。约有函数。约有200200个类,提供了个类,提供了应用程序框架和创建应用程序的组件。同时提供了应用应用程序框架和创建应用程序的组件。同时提供了应用程序框架和开发应用程序的工具如应用程序向导、类向程序框架和开发应用程序的工具如应用程序向导、类向导、可视化资源设计等高效工具,用消息映射处理消息导、可视化资源设计等高效工具,用消息映射处理消息响应,大大简化了响应,大大简化了WindowsWindows应用程序的开发工作,使程序应用程序的开发工作,使程序员可以从繁重的编程工作中解脱,提高工作效率。员可以从繁重的编程工作中解脱,提高工作效率。3.1.

47、MFC3.1.MFC程序设计介绍程序设计介绍 MFC类库分为两个主要部分:基础类;宏、全局变量及全局函数。3.1.1MFC 3.1.1MFC 的主要类及其层次关系的主要类及其层次关系 MFCMFC中主要包括以下类别:中主要包括以下类别:1.1.CObjectCObject及其派生类及其派生类 -是大多数MFC类的基类,它提供序列化(读入或保存数据)、运行时类信息、诊断和调试支持等等。常用常用CObjectCObject派生类派生类:基类基类 功能功能CcmdTarget 所有处理用户请求的类的基类所有处理用户请求的类的基类 CWinApp 代表应用程序的核心代表应用程序的核心 Cdocumen

48、t 文档类储存应用程序数据集文档类储存应用程序数据集 CWnd 处理一般处理一般WindowsWindows消息的图形用户界面消息的图形用户界面 对象的基类对象的基类 CFrameWnd 应用程序主窗口框架应用程序主窗口框架 Cview 视图类显示数据并与文档对象交互视图类显示数据并与文档对象交互 CObject派生类还包括适用于基于Win32 API应用 程序的类,如菜单类,图形类及文件服务类等。2.2.应用程序结构类应用程序结构类 -代表应用程序的基本组成元素,其中包括 CWinApp,Cdocument,CCmdTarget,CWinThread,CDocTemplate。当运行应用程序

49、时,这些类首先被实例化,并完成当运行应用程序时,这些类首先被实例化,并完成特定的功能,具体说明如下:特定的功能,具体说明如下:(1).CWinApp,每一个应用程序都从CWinApp派生一个类,并构造这个类的一个全局对象,代表应用程序本身,它负责初始化应用程序,建立文档模板结构,从消息队列中读取消息并派送到相应位置进行处理,当应用程序退出时负责清理工作。(3).CCmdTarget是MFC中与消息映射相关类的基础类,所有CCmdTarget派生类都可以处理由选择菜单产生的命令消息。(2).CDocument是使用文档/视图结构的应用程序中的文档类。应用程序从CDocument派生一个类代表应用

50、程序的文档,文档是程序数据的抽象表示,程序设计者必须决定数据在文档中的具体储存方式及访问权限。(4).CWinThread类封装了操作系统的线程,允许MFC程序创建和操作线程。有关进程与线程的概念见第二章。(5).CDocTemplate文档模板类是CSingleDocTemplate和CMultiDocTemplate的基类,单文档模板和多文档模板分别适应于在单文档界面应用和多文档界面应用,功能是将应用框架、文档、视图和一系列资源捆绑在一起。它们在它们在MFCMFC类层次中的关系如下:类层次中的关系如下:CObjectCCmdTarget CWinThread CDocument CWinA

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com