第03章 开发Windows应用程序的技术基础.ppt
第 3 章 开发Windows应用程序的技术基础本章主要目的是向读者介绍编写Windows应用程序所采用的基本技术,约定和惯例,API的结构与基本用法等作了介绍,对Windows应用程序的各个组成部分也作了初步介绍,并用框图的形式介绍Windows应用程序的工作原理。3.1 应用程序的结构与编译解决多任务的关键是:控制核心应该从程序本身转移到Windows操作系统。应该由Windows操作系统决定那个应用程序可以占用CPU时间,程序的结构也不再是过程式程序中的赋值、循环、分支等C语言中常见的结构,而是消息,处理。为了解决这个问题,应用程序采用一种称为”事件驱动结构”是合适的。所谓非抢占式是指一旦这个应用程序取得了执行权,就一直要把这个程序执行下去,除非遇到新的消息来干预。否则,其他程序没有办法执行。如果把非抢占式和”事件驱动结构相结合,那就是Win16操作系统下的应用程序。3.1.1 Windows应用程序的结构和C语言程序结构的比较C语言程序的主体结构是 int main()定义函数1 定义函数2 定义函数n3.1.1 Windows应用程序的结构和C语言程序结构的比较而Windows应用程序的结构可以用下面的框图来表示。图3-1 Windows应用程序的结构有两个函数所组成两个函数所组成,一个是WinMain函数,另一个称为窗口函数,又称窗口消息处理程序。WinMainWindows Function3.1.2 Windows应用程序的编译和C语言程序编译的比较1、C语言的编译图示语言的编译图示yy1.h,yy2.h,yyn.hok1.c,ok2.c,okn.cYes.objYes.exemath.lib,graphics.lib2、Windows应用程序的编译C语言的编译图示语言的编译图示Windows程序的C代码文件Winddows程序的资源对话框编程器图像编程器字体编程器资源编译器C编译器链接器3.1.3 编译应用程序所需的六个基本文件1.源代码文件,文件的后缀是.C或.CPP;2.资源文件位图(.bmp)图标(.ico)菜单等资源(.res)对话框(dlg)字体(fnt)3.也资源描述文件(.rc)资源编译器会对RC文件提供的资源信息进行生成和编译,并把它们插入到exe文件,形成真正的可执行文件。3.1.3 编译应用程序所需的六个基本文件4.头文件(.h)WINDOWS.H头文件WINDEF.H头文件,包含有大量简单和集合数据的定义,这些数据在Win32编程中经常要用到WinNT.h5.项目文件(.MAKE)6.模块文件(.DEF)3.1.3 Windows程序中基本数据类型Win32类型类型对应的对应的C类型类型说明说明ULONGunsigned long无符号长整数 ULONG d=56989;UCHARunsigned char无符号字符 UCHAR c=4;DWORDunsigned long无符号长整数、双词BOOLint布尔型 BOOL flag=0;BYTEunsigned char无符号字符称为字节WORDunsigned short无符号短整数、词INTint整数UINTunsigned int无符号整数HANDLEvoid*无符号整数指针HINSTANCEvoid*实例句柄(代号)HICONvoid*图标句柄(代号)HMENUvoid*菜单句柄(代号)HMENU hMenu;3.2 Windows 应用程序设计接口(API)两种APIWin16 APIWin32 API三个核心API组件Win16 APIWin32 API说明USER.EXEUSER32.DLLUSER组件负责窗口管理,包括消息,菜单,光标,通信,计时器和一些与窗口显示无关,但与控制窗口显示有关的函数。GDI.EXE GDI32.DLLGDI是图形设备接口,它管理用户介面和图形绘制,包括windows元文件,位图,设备描述表和字体。KRNL386.EXE KERNEL32.DLL KERNEL处理存贮器底层功能,任务和资源管理,它是Windows的核心3.3 标识符的匈牙利命名惯例标识符的匈牙利命名惯例为什么此惯例称为匈牙利命名惯例。匈牙利命名惯例的两条约定。标识符以一个事者几个小写字母开始,这些小写字母表示标识符的数据类型大小写混杂写,使得标识符具有一定的含义,便于理解,增强可读性。#include int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)MessageBox(NULL,TEXT(Hello,Windows XP!),TEXT(HelloMsg),0);return 0;3.3 标识符的匈牙利命名惯例标识符的匈牙利命名惯例字首字首 数据数据类类型型cchar或WCHAR或TCHAR类型byBYTE(无正负号字符)类型nshort类型iint类型 iCmdShowx,yint类型分别用作x座标和y座标cx,cyint类型分别用作x长度和y长度;c代表计数器b或fBOOL(int);f代表flagwWORD(无正负号短整数)lLONG(长整数)dwDWORD(无正负号长整数)fnfunction(函数)WNDPROC fnWndProc;sstring(字符串)sz字节是以值0结尾的字符串 char*szCmdLine=OK;h句柄(代号)HMENU hMenu;p指针3.4 事件驱动程序设计什么是事件驱动程序设计,它与传统程序设计有什么区别。事件驱动程序:Windows应用程序是消息驱动程序,又称事件驱动程序事件驱动意味着操作系统的每一部分之间,以及操作系统与应用程序之间都是通过“消息”进行通信联系的。计算机中的一个事件通过驱动程序变成一个消息鼠标事件产生鼠标消息键盘事件产生键盘3.4 事件驱动程序设计int WinMain(hInst,hPrev,.)MSG msg;RegisterClass(.);/向Windows系统注册窗口类CreateWindow(.);/创建应用程序的窗口ShowWindow(.);/显示刚才创建的窗口/进入消息循环while(GetMessage(&msg.)/从Win获取消息,直到获到WM_QUIT为止TranslateMessage(&msg);/变换消息,使消息规范化以便于处理DispatchMessage(&msg);/在Win的协助下,将消息送给“消息处理函数”return msg.wParam;int WindowsFunction().3.4 事件驱动程序设计事件驱动程序的工作原理开始填写窗口类的条款向Win注册窗口类创建应用程序窗口从程序的消息队列消息队列中获取一个消息是WM_QUIT消息消息吗?结束窗口函数处理处理该消息该消息非是消息循环while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);int WindowsFunction().3.4 事件驱动程序设计消息与消息处理是实现事件驱动的关键。消息与消息处理是实现事件驱动的关键。3.7 Windows应用程序的工作原理应用程序的工作原理 Windows程序对输入消息的获得与处理Windows操作系统负责收集输入消息并把它存入系统消息队列(system queue)然后由操作系统再分送给应用程序消息队列(application queue),以供应用程序的消息循环来读取System QueueApplication Queueint WinMain()while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);.int WindowsFunction().Windows System3.7 Windows应用程序的工作原理应用程序的工作原理 窗口消息传送给窗口函数的途径:Windows首先把消息从系统队列送到Application Queue,再由应用程序的消息循环去提取,并委托操作系统把消息送给窗口函数:PostMessage()函数Windows直接把消息送给窗口函数:SendMessage()函数。3.7 Windows应用程序的工作原理应用程序的工作原理 当使用者准备关闭某窗口时Windows会送WM_DESTORY消息给这个窗口的窗口函数窗口函数分辨出WM_DESTORY消息后,就会将屏幕上的窗口删除,然后用post方式将WM_QUIT消息送给Application Queue。应用程序的消息循环收到WM_QUIT消息,从而消息循环结束WinMain()函数结束,于是该Windows程序结束3.7 Windows应用程序的工作原理应用程序的工作原理 当使用者准备关闭某窗口时WM_DESTORYWM_QUIT应用程序消息队列窗口函数(消息处理函数)int WndProc()int WinMain()while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);.Windows 操作系统Windows应用程序send3.8 窗口类的作用及其用法初步窗口类的作用及其用法初步窗口每个Windows应用程序(或进程)都要有一个窗口,每个窗口代表一个应用程序。窗口类一个应用程序在创建某个类型的窗口前,必须首先注册该“窗口类”(Windows Class)。3.8 窗口类的作用及其用法初步窗口类的作用及其用法初步typedef struct tagWNDCLASSA/ASCII版本 UINT style;/窗口类的风格 WNDPROC lpfnWndProc;/窗口函数(过程)int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;/该窗口类的窗口过程所属的应用实例HICON hIcon;/该窗口类所用的图标HCURSOR hCursor;/该窗口类所用的光标HBRUSH hbrBackground;/该窗口类所用的背景刷LPCSTR lpszMenuName;/该窗口类所用的菜单资源LPCSTR lpszClassName;/该窗口类的名称 WNDCLASSA;3.8 窗口类的作用及其用法初步窗口类的作用及其用法初步struct tagWNDCLASSW/Unicode版 UINT style;/窗口类的风格WNDPROC lpfnWndProc;/窗口函数(过程)int cbClsExtra;int cbWndExtra;HANDLE hInstance;/该窗口类的窗口过程所属的应用实例HICON hIcon;/该窗口类所用的图标HCURSOR hCursor;/该窗口类所用的光标HBRUSH hbrBackground;/该窗口类所用的背景刷LPCWSTR lpszMenuName;/该窗口类所用的菜单资源LPCWSTR lpszClassName;/该窗口类的名称;3.8 窗口类的作用及其用法初步窗口类的作用及其用法初步ASCII版本WNDCLASSA wndclass;Unicode版WNDCLASSW wndclass;综合版/#define UNICODE/#define _UNICODEWNDCLASS wndclass;练习练习 3 1.16位和位和 32位位Windows 操作系统对应用程序的支持有什么不同操作系统对应用程序的支持有什么不同?2.Windows应用程序的编译和应用程序的编译和C语言程序编译有什么不同语言程序编译有什么不同?3.资源描述文件的作用是什么?资源编译器的功能是什么?4.资源文件与资源描述文件资源文件与资源描述文件(.RC)的区别?的区别?5.模块定义文件模块定义文件(.DEF)在编译中的作用?在编译中的作用?6.WINDOWS.H头文件的作用?WINDEF.H中定义了那些东西?WINNT.H头文件的作用?7.项目文件的作用?8.简述程序设计接口程序设计接口(API)的组成情况的组成情况9.讲讲匈牙利命名惯例的约定,还要记住那些习惯用法?匈牙利命名惯例的约定,还要记住那些习惯用法?10.解释事件驱动程序的原理,并和过程式程序进行比较11.何谓动态连接?何谓静态连接?动态连接库文件的后缀是什么?12.Win32里,微软设计者们又定义了一种新的调用规范,用什么符号表示?13.介绍PASCAL调用规范,C调用规范(用_cdecl表示),_stdcall调用规范14.W32中有那些识别字都定义成_stdcall15.消息循环从应用程序消息队列取得窗口消息是怎样送給窗口消息处理程序消息循环从应用程序消息队列取得窗口消息是怎样送給窗口消息处理程序?