资源描述
目录 2.12.1WindowsWindows操作系统介绍 2.22.2Windows Windows 编程模式 2.32.3 结束语 1概况1您的内容打在这里,或者通过复制您的文本后。概况2您的内容打在这里,或者通过复制您的文本后。概况3您的内容打在这里,或者通过复制您的文本后。+整体概况2第二章 Windows Windows程序设计 Windows是一个具有可视化图形用户界面的多任务的操作系统,它为用户提供了风格统一的由窗口、菜单、工具栏等界面元素所构成的多任务环境。32.12.1 Windows Windows操作系统介绍 2.1.1 Windows2.1.1 Windows操作系统的发展简介 1.Microsoft公司早在1985年和1987年分别推出 Windows 1.03版和Windows2.0版。2.1990年5月推出Windows3.0。3.1991年推出Windows3.1。4.1995年推出新一代操作系统Windows95,是操作系统发展史上一个里程碑式的作品。42.1.2.Windows2.1.2.Windows操作系统的特点 直观、高效、统一的面向对象的图形用户界面,易学易用 丰富的设备无关的图形操作 多任务多进程 2.1.3.Windows2.1.3.Windows的内存管理 Windows系统采用虚拟内存,在操作系统中有两种存贮器,物理存贮器和虚拟存贮器。5虚拟内存系统的工作过程如下:1.当建立一个新进程时,操作系统赋予每个进程2GB的虚拟地址(不是内存)。2.虚拟内存管理器把应用程序的代码映射到应用程序的 虚拟地址空间的某个位置,并把当前所需要的代码加 载到物理内存。3.如果应用程序使用了动态链接库(DLL),则被映射到 进程的虚拟地址空间,并在需要时加载到物理内存。64.程序的数据存储和栈操作等需要的空间在物理内存中分配,并映射到虚拟地址空间。5.应用程序使用虚拟地址空间中的地址开始执行,虚拟内存管理器把每个对内存的访问映射到物理内存的某个位置,从而访问数据。72.2.Windows 2.2.Windows 编程模式 由于Windows 操作系统完全不同于单任务的MS-DOS 操作系统,Windows程序设计有着完全不同模式,具有图形用户界面、多任务、多窗口等特点。Visual C+Visual C+提供两套完整的Windows Windows 程序开发系统:直接使用Windows提供的API 函数;采用面向对象的方式,使用微软基础类库MFC。8 Windows API是Windows 系统和Windows 应用程序间的标准接口,为应用程序提供Windows支持的函数定义、参数定义和消息格式等。标准Win32 API Win32 API 函数可以分为以下几类:1)系统服务 2)通用控件库3)图形设备接口4)网络服务5)用户接口6)系统Shell 7)Windows 系统信息 2.2.1 Windows API2.2.1 Windows API简介 92.2.2 Windows2.2.2 Windows程序设计的基本概念 1.1.窗口 -窗口是Windows程序的基本操作单元,是应用程序与用户之间进行交互的接口,也是系统管理应用程序的基本单位。编写应用程序其实就是创建一个或多个窗口,程序的执行过程是窗口内部、窗口与窗口之间以及窗口与系统之间进行数据交换与处理的过程。10在winuser.h中定义了代表窗口的WNDCLASS结构类型。typedef struct tagWNDCLASS UINT style;/窗口风格 WNDPROC lpfnWndProc;/指向窗口处理函数的函数指针 int cbClsExtra;/窗口结构中的预留字节数 int cbWndExtra;/本窗口创建的其它窗口结构中预留字节数 HINSTANCE hInstance;/注册该窗口类的实例句柄 HICON hIcon;/代表该窗口类的图标句柄 HCURSORhCursor;/该窗口客户区鼠标光标句柄 HBRUSHhbrBackGround;/该窗口背景颜色句柄 LPCSTRlpszMenuName;/指向窗口菜单名的字符指针 LPCSTRlpszClassName;/指向窗口名的字符指针 WNDCLASS,*PWNDCLASS,NEAR*NPWNDCLASS,FAR*LPWNDCLASS;11 2.2.句柄和WindowsWindows对象 Windows对象-窗口、图标、光标、菜单及正在运行的应用程序实例等等。句 柄-系统用来唯一标识某个Windows对象的一个无符号整数,相当于Windows对象的名字,应用程序只有通过句柄才能使用Windows对象。应用程序是通过恒定不变的句柄来访问程序中各个对象的。这是多任务操作系统对多个进程进行管理的基本手段。12Windows常用句柄类型如下所示:句柄类型 说明HANDLE 一般类型句柄 HWND 窗口类型句柄 HINSTANCE 程序实例句柄 HCURSOR 光标类型句柄 HFONT 字体类型句柄 HPEN 画笔类型句柄 HBRUSH 画刷类型句柄 HDC 设备描述表类型句柄 HICON 图标类型句柄 HMENU 菜单类型句柄 HBITMAP 位图类型句柄 HFILE 文件类型句柄 133.3.事件与消息 事件-在Windows环境下,应用程序启动后,系统等待用户在图形用户界面内的输入选择,如鼠标按键、键盘按键、窗口被创建、关闭、改变大小、移动等。只要有事件发生,系统即产生特定的消息,消息描述了事件的类别,包含了相关信息,Windows应用程序利用消息与系统及其它应用程序进行信息交换。由于windows事件的发生的是随机的,程序的执行先后顺序也无法预测,系统采用消息队列来存放事件发生的消息,然后从消息队列中依次取出消息进行相应的处理。14在winuser.h中,消息结构的定义如下:typedef struct tagMSG HWND hWnd;/指定消息发向的窗口句柄UINTmessage;/标识消息的消息值WPARAM wParam;/消息参数LPARAM lParam;/消息参数DWORDtime;/消息进入队列的时间POINTpt;/消息进入队列时鼠标指针的屏幕坐标 MSG,*PMSG,NEAR*NPMSG,FAR*LPMSG;15下面介绍消息结构中各个成员的意义:a)message是标识消息的消息值或消息名。每个消息都有唯一一个数值标识,常用不同前缀的符号常量以示区别。例如,WM_表示窗口消息。Windows Windows常用的窗口消息和消息值定义,定义于winuser.hwinuser.h中:#define WM_CREATE 0X0001 /创建窗口产生的消息#define WM_DESTROY 0X0002 /撤销窗口产生的消息#define WM_PAINT 0X000F /重画窗口产生的消息#define WM_CLOSE 0X0010 /关闭窗口产生的消息#define WM_CHAR 0X0102 /按下非系统键产生的字符消息#define WM_USER 0X0400 /用户自定义消息 16b)wParam和lParam都是32位消息参数,其数据类型在windef.h中定义如下:typedef UINT WPARAM;typedef LONG LPARAM;c)pt表示消息进入消息队列时鼠标指针的屏幕坐标,POINT是定义在windef.h中的结构体,表示屏幕上一个点:typedef struct tagPOINT LONG x;/表示点的屏幕横坐标 LONGy;/表示点的屏幕纵坐标 POINT,PPOINT,NEAR*NPPOINT,FAR*LPPOINT;174.4.进程与线程 32位Windows提供“进程-线程-窗口”的模式来管理运行的程序。“程序”指存储在介质上、含有指令和数据的文件,是一个被动的对象;“进程”是一个被运行的程序的实例,代表了内存中正在运行的指令和系统资源,如地址空间、打开的文件等,是一个主动对象。“进程”又分为“动态”和“静态”的两部分,其中“动 态”部分形成“线程”概念。18 进程并不执行代码,它只是线程的容器,拥有系统资源和私有资源。当创建一个进程的同时也创建了第一个线程,称为“主线程”,线程是进程主动的关键。主线程的入口函数是WinMain。之后,主线程可以在进程中再创建一个或多个线程,即“多线程”,多个线程共享进程的静态部分。使用进程-线程模式,是因为创建一个线程比一个进程所需资源要少,且线程间共享进程地址空间,简化了进程间的通信,可提高程序执行效率。19 窗口是应用程序和用户进行交互的接口,窗口总是由线程拥有,一个线程可以拥有一个或多个窗口,也可没有窗口。关系如下图所示:进程1线程1.1线程1.2线程1.3窗口1.1.2窗口1.1.1窗口1.1.3进程2线程2.1窗口2.1.1205.5.资源共享 不同之处:DOS程序:在运行时独占系统的全部资源,包括显示器、内存等,直到程序结束时才释放资源。Windows:它是一个多任务的操作系统,各个应用程序 共享系统提供的资源。Windows Windows的基本模式是:向Windows系统请求资源;使用该资源;释放该资源给Windows以供别的程序使用。21 注意:1.最容易忽略的是第三步,如果忽略了这一步,会 出现程序运行出现异常情况,或干扰其它程序正 常运行,甚至造成立即死机,如设备上下文没有 释放时。2.CPU也是一种非常重要的资源,应用程序应避免长 时间的占用CPU资源;如果确实需要这样做,也应 当采取一些措施,以让程序能够响应用户的输入。3.主存也是一个共享资源,要防止同时运行的多个应 用程序因协调不好而耗尽内存资源。226.6.数据类型 包括简单类型和结构类型,常用数据类型说明如下:数据类型说 明 BYTE 8 8位无符号字符 BSTR 3232位字符指针 COLORREF 3232位整数,表示一个颜色 WORD 16 16位无符号整数 LONG 32 32位有符号整数 DWORD 32 32位无符号整数 UINT 32 32位无符号整数 BOOL 布尔值,值为TRUETRUE或FALSEFALSE232.2.3 Windows 2.2.3 Windows 程序结构 1.Windows1.Windows应用程序的构成 组成:程序代码、用户界面资源和动态链接库库模块(dynamic-link library)。程序代码主要由可执行代码构成 资源是应用程序所能够使用的一类预定义工具,用户界面资源是应用程序定义的图形用户接口GUI(graphical user interface),如菜单、对话框、按钮等。24资 源类型 说明快捷键(Accelerator)存贮击键和命令组合位图(Bitmap)包括WindowsWindows匹配格式的图形对话框(Dialogbox)对话框控件细节、布局、属性图标(Icon)存贮图标用位图组菜单(Menu)菜单和菜单组文本和布局细节字符串表(String table)存字符串和相关标识符(ID)(ID)值工具栏(Toolbar)工具栏布局细节和画按钮所用的位图版本消息(Cursor)程序状态消息,如程序名,作者,拷贝日期 版本号光标包括画光标用的特殊位图常用资源如下:25 Windows应用程序的创建与控制台应用类似,要经过编译、链接两个阶段,要增加资源编辑、编译过程。过程如下图:集成开发环境应用程序向导资源编辑器Create.DEF.CPP.H.DSW.DSP.ICC.RC.BMP源文件资源文件编译.objBuild资源编译.res应用程序262.2.应用程序的执行过程(1)操作系统接收命令后,创建新的进程和初始 线程(initial thread)。(2)应用代码加载内存。(3)如应用了DLL,则加载DLL到内存。(4)为项目空间(如数据和堆栈)分配物理内存,并映射到虚拟地址空间。(5)应用程序开始执行。273.3.处理消息 消息处理过程如下图所示:硬件消息系统队列应用1消息队列应用2消息队列应用3消息队列消息循环窗口过程缺省窗口过程发送消息派发消息应用328(1).当Windows应用程序开始执行,操作系统在预定的入口WinMain与应用程序连接;(2).应用程序创立一个或更多的窗口,每个窗口(包括对话框)都有一个窗口过程函数,程序通过窗口接收用户的输入和决定窗口显示;(3).各种输入产生的消息首先进入系统队列,由系统根据产生消息的窗口将消息发至窗口所在应用程序的消息队列;(4).程序的消息循环代码段检索从消息队列中来的消息,并把它们返回Windows,由Windows发给适当的窗口过程函数进行处理,对于程序未响应的消息,发给缺省窗口过程函数进行处理。292.2.4 Windows 2.2.4 Windows 程序设计实例 例一.最简单的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按钮;30 (3).集成开发环境为工程生成stdafx.h,stdafx.cpp 和Ex2_1.cpp文件,并产生了WinMain函数的框架。在WinMain函数体内,加入Messagebox一条语句。#include stdafx.h#include stdafx.h int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTRlpCmdLine,int nCmdShow )LPSTRlpCmdLine,int nCmdShow )MessageBox(NULL,“My first Windows Applicaion!”,“Ex2_1”,MessageBox(NULL,“My first Windows Applicaion!”,“Ex2_1”,MB_OK);MB_OK);return 0;return 0;(4).选择Build|Build Ex2_1.exe菜单项创建可执行 文件,然后选择Build|Exacute Ex2_1.exe,执行程序,结果如图2.6。31图2.42.4 32图2.52.5 33图2.62.6 34说明:1.(1)stdafx.h是一个预编译头文件,Windows包含进 程序的头文件很多,在程序开发过程中需要不 断地编译,如果每次全部重新编译非常浪费时间;(2)stdafx的目的就是将前面编译的结果储存起来,下一次编译时从磁盘取出来,对未修改部分不再 重新编译,这样可大大节省编译时间;(3)stdafx.cpp中主要有包含windows.h一条指令,windows.h windows.h是windows程序最基本的 头文件,它们定义了windows的所有数据类型、数据结构、符号常量和API函数原型声明。352.WinMain函数是windows程序的入口函数,包含4个参数:(1)hInstance是唯一标识本程序的实例句柄,系统 和其它应用程序通过该句柄与本程序通讯。(2)hPrevInstance是本程序的前一个实例句柄,由 于32位windows采用进程线程模式,每一线程 拥有自己的句柄,因此该参数始终为空。(3)lpCmdLine是一个字符串指针,指向命令行参数 字符串,没有命令行参数时为空。36(4)nCmdShow指明程序最初运行时窗口打开方式,如正常方式、最大化或最小化运行。(5)WinMain返回一个整数值,作为退出代码。APIENTRY表示函数调用约定,函数调用时参数 按从左至右的顺序压入栈,由被调用者将参数 弹出栈。373.MessageBox 是一个API函数,显示一个消息框,其原型为:int WINAPI MessageBox(HWND hWnd,LPCSTR lpszText,LPCSTR lpszCaption,UINT uType);第一个参数指明此消息框的父窗口句柄,为NULL 则说明没有父窗口;第二、三个参数类型均为字符型指针,分别指向消 息框中要显示的字符串和消息框标题栏 显示的字符串;第四个参数是一个无符号整数,表明消息框中显示 的按钮和风格。38WindowsWindows已有定义:#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_YESNOCANCEL0 x00000003L /YES/YES、NONO、CANCELCANCEL三/个按钮uTypeuType参数 即可取这些定义值或是它们按位或运算的组合。MessageBoxMessageBox返回所按下按钮的IDID值。即Windows用一个无符号整数唯一表示某个资源(对话框、按钮、菜单等等),并定义一个唯一的符号常量与之对应,称为资源的ID值。39 windows windows内部定义的部分资源标识:#define IDOK1 /OK/OK按钮IDID值#define IDCANCEL 2 /CANCEL/CANCEL按钮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值40例2 2显示一个窗口的WindowsWindows应用程序。工程创建方法同例1 1,按下面内容编辑源文件Ex2_2.cppEx2_2.cpp。#include /包含windows.hwindows.h头文件LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/窗口函数声明/*/*入口函数 WinMain()*/WinMain()*/int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)WNDCLASS wndclass;/定义窗口类结构变量 HWND hwnd;/定义窗口句柄 MSG msg;/定义消息结构变量 41 /定义窗口类 wndclass.style=CS_HREDRAW|CS_VREDRAW;/改变窗口口大小则重画 wndclass.lpfnWndProc=WndProc;/窗口函数为 WndProc WndProc wndclass.cbClsExtra=0;/窗口类无扩展wndclass.cbWndExtra=0;/窗口实例无扩展 wndclass.hInstance=hInstance;/注册窗口类的实例句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/窗口用默认光标 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);/显口用箭头光标 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);/背景为白色 wndclass.lpszMenuName=NULL;/窗口缺省无菜单 wndclass.lpszClassName=Ex2_2;/窗口类名为Ex2_2Ex2_2/注册窗口类。若失败则返回42 /显示并更新窗口 ShowWindow(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,UINT message,WPARAM wParam,LPARAM lParam)43 /根据消息值转相应的消息处理switch(message)/重画窗口客户区消息处理 case WM_PAINT:HDC hdc;/定义设备描述表句柄 PAINTSTRUCT ps;/定义绘图信息结构变量 hdc=BeginPaint(hwnd,&ps);/获取要重画的窗口的设备描述表句柄 TextOut(hdc,0,0,This is my Windows application,60);/输出文本 EndPaint(hwnd,&ps);/结束要重画的窗口 return 0;44程序的运行结果:/撤消窗口消息处理case WM_DESTROY:PostQuitMessage(0);/产生退出程序消息WM_QUITWM_QUIT return 0;return DefWindowProc(hwnd,message,wParam,lParam);/其它转缺省窗口函数45说明:1.WinMain-1.WinMain-在WinMainWinMain中主要完成以下工作:(1)定义一个窗口类,包括定义窗口对象并对它的相关成员赋值;(2)注册窗口类,调用RegisterClass注册窗口类,并判断是否 注册成功。其参数是WNDCLASS结构类型指针,用需要注册的 窗口对象地址进行调用;(3)创建窗口,定义注册窗口后,可以创建一个或多个同类型的 窗口;由API函数CreateWindow创建窗口,并返回所创建窗口 的句柄;(4)调用API函数ShowWindow和UpdateWindow显示并更新窗口,它们的参数相同,第一个参数是要显示的窗口句柄,第二个 参数是窗口显示的方式;46(5)程序运行的准备工作完成,进入消息循环(while循环),GetMessage函数从应用程序消息队列中读取消息,TranslateMessage函数进行键盘消息转换,然后由DispatchMessag将消息派送给相应的窗口函数进行处理 当消息队列为空时,应用程序进入等待状态,等待用户输入。47 当GetMessage获取到WM_QUIT消息时,返回FALSE,结束 消息循环。a.GetMessage函数原型如下:BOOL WINAPI GetMessage(LPMSG,HWND,UINT,UINT);其中 第一个参数为存放消息的MSG结构指针,第二个参数表示接收消息的窗口句柄,第三、四个参数分别表示要获取的最大和最小消息值。当后三个参数值设为NULL或0时,表示应用程序接收它 所创建的所有窗口的所有消息。48b.TranslateMessage函数负责键盘消息转换。TranslateMessage完成的工作:击键消息除字符键消息外,其它击键操作产生虚拟键消息,包括 WM_KEYDOWN,WM_SYSKEYDOWN,WM_KEYUP,WM_SYSKEYUP,这些虚拟键消息必须通过转换成字符消息程序才能响应,这就是TranslateMessage完成的工作。49消息派送流程 c.DispatchMessage函数 负责将消息派送到相应的窗口函数,如下图所示:hWndMessagewParawIparamTimePtMSGEx2_2Ex2_2HWNDStyleWndprocEx2_2Ex2_2WNDCLASS502.WndProc2.WndProc函数 -是一个消息处理函数,应用程序的表现完全取决于窗口函数的定义。WndProc的原型如下:LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);第一个参数表示对应窗口的句柄,第二个参数是需要处理的消息的消息值,第三、四个参数包含了相应消息的某些信息,如消息发生时鼠标位置等等。WndProc函数的结构是一个switch语句,根据消息值不同,选择不同的case子句执行。513.3.进队消息和不进队消息 窗口函数一般由系统调用,应用程序不直接调用它,而是通过SendMessage()函数发送消息来间接调用窗口函数。消息分为进队消息和不进队消息。(1)(1)进队消息(2)-是由windows放入应用程序消息队列、由应用程序消息循环从消息队列中取出并派送到窗口函数的消息。(3)调用API函数PostMessage可以派送(dispatch)一条消 息到指定窗口的消息队列,其原型如下:BOOL WINAPI PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);其中MsgMsg参数指定了要发送的消息值(名)。52(2)(2)不进队消息 -不进入消息队列,直接发送(send)给指定窗口的窗口函数进行处理。调用CreateWindow()创建窗口时发送的WM_CREATE消息,调用UpdateWindow()更新窗口时发送的WM_PAINT消息,调用DestroyWindow()时发送的WM_DESTROY消息,都是不进队消息。可以通过调用SendMessageSendMessage函数直接发送消息给窗口:LRESULT WINAPI SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);534.4.设备描述表 WM_PAINT是重画窗口客户区消息,当窗口内容被改变、移动或窗口被覆盖后,需要对窗口进行重画,一般应用程序都需要处理这个消息,处理这一消息需要获取设备描述表句柄。Windows的图形设备接口GDI(Graphics Device Interface)是一组API函数,它提供与设备无关的 图形功能,使应用程序在不同图形设备(如打印机)上进行相同的操作(调用GDI函数),而无需考虑设 备的硬件差异,设备无关性是通过设备描述表实 现的。54设备描述表DC(Device Context)-也称为设备上下文,是GDI内部定义的一个有图形对象、图形方式及其属性的一个数据结构,与特定设备相关,描述了硬件设备的具体特征信息。与具体设备相关的操作交给DC,将应用程序的设备无关图形功能调用转换为 在设备驱动程序下执行的设备相关操作。应用程序不能直接访问设备描述表,为了进行图形输出,必须先获取设备描述表句柄,然后以设备描述表句柄为参数调用GDI函数,实现图形功能。55提问与解答环节Questionsandanswers56结束语感谢参与本课程,也感激大家对我们工作的支持与积极的参与。课程后会发放课程满意度评估表,如果对我们课程或者工作有什么建议和意见,也请写在上边57感谢观看Theusercandemonstrateonaprojectororcomputer,orprintthepresentationandmakeitintoafilm58
展开阅读全文