第3章开发Windows应用程序的技术基础•本章主要目的是向读者介绍编写Windows应用程序所采用的基本技术,约定和惯例,API的结构与基本用法等作了介绍,对Windows应用程序的各个组成部分也作了初步介绍,并用框图的形式介绍Windows应用程序的工作原理。3.1应用程序的结构与编译•解决多任务的关键是:•控制核心应该从程序本身转移到Windows操作系统。•应该由Windows操作系统决定那个应用程序可以占用CPU时间,程序的结构也不再是过程式程序中的赋值、循环、分支等C语言中常见的结构,而是消息,处理。•为了解决这个问题,应用程序采用一种称为”事件驱动结构”是合适的。•所谓非抢占式是指一旦这个应用程序取得了执行权,就一直要把这个程序执行下去,除非遇到新的消息来干预。否则,其他程序没有办法执行。•如果把非抢占式和”事件驱动结构相结合,那就是Win16操作系统下的应用程序。3.1.1Windows应用程序的结构和C语言程序结构的比较C语言程序的主体结构是intmain(){………}定义函数1定义函数2……定义函数n3.1.1Windows应用程序的结构和C语言程序结构的比较•而Windows应用程序的结构可以用下面的框图来表示。图3-1•Windows应用程序的结构有两个函数所组成,一个是WinMain函数,另一个称为窗口函数,又称窗口消息处理程序。WinMainWindowsFunction3.1.2Windows应用程序的编译和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.3Windows程序中基本数据类型Win32类型对应的C类型说明ULONGunsignedlong无符号长整数ULONGd=56989;UCHARunsignedchar无符号字符UCHARc='4';DWORDunsignedlong无符号长整数、双词BOOLint布尔型BOOLflag=0;BYTEunsignedchar无符号字符称为字节WORDunsignedshort无符号短整数、词INTint整数UINTunsignedint无符号整数HANDLEvoid*无符号整数指针HINSTANCEvoid*实例句柄(代号)HICONvoid*图标句柄(代号)HMENUvoid*菜单句柄(代号)HMENUhMenu;3.2Windows应用程序设计接口(API)•两种API–Win16API–Win32API•三个核心API组件Win16APIWin32API说明USER.EXEUSER32.DLLUSER组件负责窗口管理,包括消息,菜单,光标,通信,计时器和一些与窗口显示无关,但与控制窗口显示有关的函数。GDI.EXEGDI32.DLLGDI是图形设备接口,它管理用户介面和图形绘制,包括windows元文件,位图,设备描述表和字体。KRNL386.EXEKERNEL32.DLLKERNEL处理存贮器底层功能,任务和资源管理,它是Windows的核心3.3标识符的匈牙利命名惯例•为什么此惯例称为匈牙利命名惯例。•匈牙利命名惯例的两条约定。–标识符以一个事者几个小写字母开始,这些小写字母表示标识符的数据类型–大小写混杂写,使得标识符具有一定的含义,便于理解,增强可读性。#includewindows.hintWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){MessageBox(NULL,TEXT(Hello,WindowsXP!),TEXT(HelloMsg),0);return0;}3.3标识符的匈牙利命名惯例字首数据类型cchar或WCHAR或TCHAR类型byBYTE(无正负号字符)类型nshort类型iint类型iCmdShowx,yint类型分别用作x座标和y座标cx,cyint类型分别用作x长度和y长度;c代表「计数器」b或fBOOL(int);f代表「flag」wWORD(无正负号短整数)lLONG(长整数)dwDWORD(无正负号长整数)fnfunction(函数)WNDPROCfnWndProc;sstring(字符串)sz字节是以值0结尾的字符串char*szCmdLine=OK;h句柄(代号)HMENUhMenu;p指针3.4事件驱动程序设计•什么是事件驱动程序设计,它与传统程序设计有什么区别。•事件驱动程序:–Windows应用程序是消息驱动程序,又称事件驱动程序–事件驱动意味着操作系统的每一部分之间,以及操作系统与应用程序之间都是通过“消息”进行通信联系的。•计算机中的一个事件通过驱动程序变成一个消息–鼠标事件产生鼠标消息–键盘事件产生键盘3.4事件驱动程序设计intWinMain(hInst,hPrev,...){MSGmsg;RegisterClass(...);//向Windows系统注册窗口类CreateWindow(...);//创建应用程序的窗口ShowWindow(...);//显示刚才创建的窗口//进入消息循环while(GetMessage(&msg...))//从Win获取消息,直到获到WM_QUIT为止{TranslateMessage((&msg);//变换消息,使消息规范化以便于处理DispatchMessage((&msg);//在Win的协助下,将消息送给“消息处理函数”}returnmsg.wParam;}intWindowsFunction(){…..}3.4事件驱动程序设计•事件驱动程序的工作原理开始填写窗口类的条款向Win注册窗口类创建应用程序窗口从程序的消息队列中获取一个消息是WM_QUIT消息吗?结束窗口函数处理该消息非是消息循环while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}intWindowsFunction(){…..}3.4事件驱动程序设计•消息与消息处理是实现事件驱动的关键。3.7Windows应用程序的工作原理•Windows程序对输入消息的获得与处理–Windows操作系统负责收集输入消息并把它存入系统消息队列(systemqueue)–然后由操作系统再分送给应用程序消息队列(applicationqueue),以供应用程序的消息循环来读取SystemQueueApplicationQueueintWinMain(){……while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}…….}intWindowsFunction(){…..}WindowsSystem3.7Windows应用程序的工作原理•窗口消息传送给窗口函数的途径:–Windows首先把消息从系统队列送到ApplicationQueue,再由应用程序的消息循环去提取,并委托操作系统把消息送给窗口函数:PostMessage()函数–Windows直接把消息送给窗口函数:SendMessage()函数。3.7Windows应用程序的工作原理•当使用者准备关闭某窗口时•Windows会送WM_DESTORY消息给这个窗口的窗口函数•窗口函数分辨出WM_DESTORY消息后,就会将屏幕上的窗口删除,然后用post方式将WM_QUIT消息送给ApplicationQueue。•应用程序的消息循环收到WM_QUIT消息,从而消息循环结束•WinMain()函数结束,于是该Windows程序结束3.7Windows应用程序的工作原理•当使用者准备关闭某窗口时WM_DESTORYWM_QUIT应用程序消息队列窗口函数(消息处理函数)intWndProc(){……}intWinMain(){……while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}…….}Windows操作系统Windows应用程序send3.8窗口类的作用及其用法初步窗口•每个Windows应用程序(或进程)都要有一个窗口,每个窗口代表一个应用程序。窗口类•一个应用程序在创建某个类型的窗口前,必须首先注册该“窗口类”(WindowsClass)。3.8窗口类的作用及其用法初步typedefstructtagWNDCLASSA//ASCII版本{UINTstyle;//窗口类的风格WNDPROClpfnWndProc;//窗口函数(过程)intcbClsExtra;intcbWndExtra;HINSTANCEhInstance;//该窗口类的窗口过程所属的应用实例HICONhIcon;//该窗口类所用的图标HCURSORhCursor;//该窗口类所用的光标HBRUSHhbrBackground;//该窗口类所用的背景刷LPCSTRlpszMenuName;//该窗口类所用的菜单资源LPCSTRlpszClassName;//该窗口类的名称}WNDCLASSA;3.8窗口类的作用及其用法初步structtagWNDCLASSW//Unicode版{UINTstyle;//窗口类的风格WNDPROClpfnWndProc;//窗口函数(过程)intcbClsExtra;intcbWndExtra;HANDLEhInstance;//该窗口类的窗口过程所属的应用实例HICONhIcon;//该窗口类所用的图标HCURSORhCursor;//该窗口类所用的光标HBRUSHhbrBackground;//该窗口类所用的背景刷LPCWSTRlpszMenuName;//该窗口类所用的菜单资源LPCWSTRlpszClassName;//该窗口类的名称};3.8窗口类的作用及其用法初步•ASCII版本WNDCLASSAwndclass;•Unicode版WNDCLASSWwndclass;•综合版//#defineUNICODE//#define_UNICODEWNDCLASSwndclass;练习31.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里,微软设计者们又定义了一种新的调用规范,用什么符号