【精品】Win32 编程精品ppt课件.ppt
《【精品】Win32 编程精品ppt课件.ppt》由会员分享,可在线阅读,更多相关《【精品】Win32 编程精品ppt课件.ppt(157页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Win32 编程PointsWindows编程基础Windows应用程序的类型控制台程序 Console DOS程序,本身没有窗口,通过Windows DOS窗口执行窗口程序 拥有自己的窗口,可以与用户交互库程序存放代码、数据的程序,执行文件可以从中取出代码执行和获取数据 静态库程序 扩展名LIB,在执行文件执行时从中获取代码动态库程序 扩展名DLL,在编译链接程序时,将函数地址放入到执行文件中Windows编程基础三种应用程序的对比 入口函数控制台程序-main窗口程序-WinMain动态库程序-DllMain静态库程序-无入口函数(根本无法执行)文件存在方式 控制台程序、窗口程序-EXE文
2、件动态库程序-DLL文件静态库程序-LIB文件执行方式控制台程序-在DOS窗口内执行。窗口程序-拥有自己的窗口在自己的窗口内执行.动态库程序-本身无法执行,由可执行程序或其他的DLL调用静态库程序-执行不存在,代码会嵌入到可执行文件或DLL等中。Windows开发环境Windows开发工具和库开发工具 Visual Studio C+VC1.5-VC6.0 VC2005-VC2010(10.0)VC的编译工具 编译器CL.EXE 将.cpp/.C源代码编译成目标代码.obj 链接器LINK.EXE 将目标代码、库链接生成最终文件 资源编译器RC.EXE (.rc)将资源编译,最终通过链接器存入
3、最终文件编译、链接和执行编译环境准备 VC98BINVCVARS32.BAT编译程序-CL CL.EXE-?显示CL的帮助 /c 只编译不链接 /Tc 编译C文件 /Tp 编译C+文件链接程序-LINK LINK.EXE xxx.obj xxx.lib 执行编写第一个窗口程序(HelloWorld版)编写窗口程序的步骤:1 定义WinMain函数2 定义窗口处理函数(自己定义,处理消息)3 注册窗口类(向XP里边写入数据)4 创建窗口(在内存中创建窗口)5 显示窗口(根据内存数据,在显示器中绘制出来)6 消息循环(提取/翻译/派发消息)7 消息处理资源的使用编写资源的文件.rc资源脚本文件编译
4、rc文件 RC.EXE将资源链接到程序中 LINK.EXENMAKE 和 MakefileNMAKEMakefile的一个解释执行的工具,根据 Makefile文件中的定义,编译和链接程序,最终生成文件.Makefile(.mak)定义编译和链接等操作的脚本文件(把项目的处理命令写入),一般对整个项目进行处理。Makefile的语法HELLO:依赖行 cl.exe hellownd.c/c/命令行 rc.exe hellownd.rc/命令行 link.exe hellownd.obj hellownd.res user32.lib/命令行Makefile文件中可以有多个依赖行。执行方式NMA
5、KE首先找到第一个依赖行检查依赖行的依赖项,如果发现依赖项,首先执行依赖项命令行执行完所有依赖项命令后,再执行自己的命令行。DBCS和UNICODE编码的区别DBCS字符编码:A 我 是 程 序 员 01 0203 0405 0607 0809 0A0B 但是解析时,可能为:01 02030405060708090A0B 0102 030405060708090A0BUNICODE编码:A 我 是 程 序 员0001 0203 0405 0607 0809 0A0B 不存在解析的问题字符集的应用宽字节字符wchar_t 每个字符占2个字节char 每个字符占1个字节或2个字节 wchar_t
6、实际是 unsigned short 类型,定义时,需要增加“L”,通知编译器按照双字节编译字符串,采用UNICODE编码。需要使用支持 wchar_t 函数操作宽字节字符串。例如:wchar_t*pwszText=LHello wchar;wprintf(L%sn,pwszText);字符集的应用 TCHAR#ifdef UNICODE typedef wchar_t TCHAR;#define _TEXT(quote)L#quote#else typedef char TCHAR;#define _TEXT(quote)quote#endifUNICODE字符打印 wprintf对UNIC
7、ODE字符打印支持不完善。在Windows下使用WriteConsole API打印UNICODE字符窗口程序的创建窗口程序的创建步骤:1 定义WinMain入口函数2 定义窗口处理函数 WindowProc(处理消息)3 注册窗口类 RegisterClass(往XP系统写数据)4 创建窗口 CreateWindow(在内存中将窗口创建出来)5 显示窗口(将窗口绘制在显示器上)ShowWindow/UpdateWindow6 消息循环 GetMessage TranslateMessage DisptachMessage7 消息处理窗口的注册窗口类 窗口类包含了窗口的各种参数信息的数据结构。
8、每个窗口都具有窗口类,基于窗口类创建窗口。每个窗口类都具有一个名称,使用前必须注册到系统。窗口类的分类 系统窗口类 系统已经定义好的窗口类,所有应用程序都可以直接使用。应用程序全局窗口类 由用户自己定义,当前应用程序所有模块都可以使用。应用程序局部窗口类 由用户自己定义,当前应用程序中本模块可以使用系统窗口类的注册不需要注册,直接使用窗口类即可。系统已经定义好相应名称,例如:按钮 -BUTTON 编辑框-EDIT应用程序全局窗口类的注册RegisterClass/RegisterClassExATOM RegisterClass(CONST WNDCLASS*lpWndClass/窗口类的数据
9、);注册成功后,返回一个数字标识。ATOM RegisterClassEx(CONST WNDCLASSEX*lpwcx /窗口类的数据);应用程序全局窗口类的注册typedef struct _WNDCLASSEX UINT cbSize;/结构体的大小 sizeof UINT style;/窗口类的风格 WNDPROC lpfnWndProc;/窗口处理函数 int cbClsExtra;/窗口类的附加数据buff的大小 int cbWndExtra;/窗口的附加数据buff的大小 HINSTANCE hInstance;/当前模块的实例句柄 HICON hIcon;/窗口图标句柄 HCU
10、RSOR hCursor;/鼠标的句柄 HBRUSH hbrBackground;/绘制窗口背景的画刷句柄 LPCTSTR lpszMenuName;/窗口菜单的资源ID字符串 LPCTSTR lpszClassName;/窗口类的名称 HICON hIconSm;/窗口的小图标句柄 WNDCLASSEX,*PWNDCLASSEX;应用程序全局窗口类的注册应用程序全局窗口类的注册,需要在窗口类的风格中增加 CS_GLOBALCLASS,例如:WNDCLASSEX wce=0;wce.style=.|CS_GLOBALCLASS;应用程序局部窗口类 在注册窗口类时,不添加CS_GLOBALCLA
11、SS风格。窗口类的风格CS_GLOBALCLASS-应用程序全局窗口类CS_BYTEALIGNCLIENT-窗口客户区的水平位置8倍数对齐CS_BYTEALIGNWINDOW-窗口的水平位置8倍数对齐CS_HREDRAW-当窗口水平变化时,窗口重新绘制CS_VREDRAW-当窗口垂直变化时,窗口重新绘制 CS_CLASSDC-该类型的窗口,都是有同一个绘图(DC)设备 CS_PARENTDC-该类型的窗口,使用它的父窗口的绘图(DC)设备CS_OWNDC-该类型的窗口,每个窗口都使用自己的绘图(DC)设备CS_SAVEBITS-允许窗口保存成图(位图),提高窗口的绘图效率,但是耗费内存资源CS
12、_DBLCLKS-允许窗口接收鼠标双击CS_NOCLOSE-窗口没有关闭按钮窗口类的查找过程1 系统根据传入的窗口类名称,在应用程序局部窗口类中查找,如果找到执行2,如果未找到执行3。2 比较局部窗口类与创建窗口时传入的HINSTANCE变量。如果发现相等,创建和注册的窗口类在同一模块,创建窗口返回。如果不相等,继续执行3。3 在应用程序全局窗口类,如果找到,执行4,如果未找到执行5。4 使用找到的窗口类的信息,创建窗口返回。5 在系统窗口类中查找,如果找到创建窗口返回,否则创建窗口失败。相关APIRegisterClass/RegisterClassEx 注册GetClassInfo 获取信
13、息UnregisterClass 卸载窗口的创建CreateWindow/CreateWindowExHWND CreateWindowEx(DWORD dwExStyle,/窗口的扩展风格LPCTSTR lpClassName,/已经注册的窗口类名称LPCTSTR lpWindowName,/窗口标题栏的名字DWORD dwStyle,/窗口的基本风格int x,/窗口左上角水平坐标位置int y,/窗口左上角垂直坐标位置int nWidth,/窗口的宽度int nHeight,/窗口的高度HWND hWndParent,/窗口的父窗口句柄HMENU hMenu,/窗口菜单句柄HINSTAN
14、CE hInstance,/应用程序实例句柄LPVOID lpParam/窗口创建时附加参数 );创建成功返回窗口句柄子窗口的创建创建时要设置父窗口句柄创建风格要增加 WS_CHILD|WS_VISIBLE窗口类和窗口的附加数据 作用 注册窗口时,可以设置这两个数据内存空间 的大小。int cbClsExtra;/窗口类的附加数据BUFF大小 int cbWndExtra;/窗口的附加数据BUFF大小 可以提供窗口类和窗口存放自己的数据的空间。Windows消息机制程序执行机制 过程驱动-程序的执行过程是按照预定好的顺序执行。事件驱动-程序的执行是无序,用户可以根据需要随机触发相应的事件。Wi
15、n32窗口程序就是采用 事件驱动 方式执行,也就是 消息机制。什么是消息?当系统通知窗口工作时,就采用消息的方式派发给窗口。消息组成(windows平台下)窗口句柄消息ID消息的两个参数(附带信息)消息产生的时间消息产生时的鼠标位置窗口处理函数和消息每个窗口都必须具有窗口处理函数。LRESULT CALLBACK WindowProc(HWND hwnd,/窗口句柄 UINT uMsg,/消息ID WPARAM wParam,/消息参数 LPARAM lParam /消息参数);当系统通知窗口时,会调用窗口处理函数同时,将消息ID和消息参数传递给窗口处理函数。在窗口处理函数中,不处理的消息,使
16、用缺省窗口处理函数,例如DefWindowProc。消息相关函数1 GetMessage-获取本进程的消息。BOOL GetMessage(LPMSG lpMsg,/存放获取到的消息BUFFHWND hWnd,/窗口句柄 UINT wMsgFilterMin,/获取消息的最小ID 0 UINT wMsgFilterMax /获取消息的最大ID 0);lpMsg-当获取到消息后,将消息的参数存放到MSG结构中。hWnd-获取到hWnd所指定窗口的消息。wMsgFilterMin和wMsgFilterMax-只能获取到由它们指定的消息范围内的消息,如果都为0,表示没有范围。消息相关函数2 Tran
17、slateMessage-翻译消息。将按键消息,翻译成字符消息。BOOL TranslateMessage(CONST MSG*lpMsg/要翻译的消息地址 );检查消息是否是按键的消息,如果不是按键消息,不做任何处理,继续执行。3 DispatchMessage-派发消息。将消息派发到该消息所属窗口的窗口处理函数上。LRESULT DispatchMessage(CONST MSG*lpmsg/要派发的消息);Windows常用消息WM_DESTROY-窗口被销毁时的消息,无消息参数。常用于在窗口被销毁之前,做相应的善后处理,例如资源、内存等。WM_SYSCOMMAND-系统命令消息,当点击
18、窗口的最大化、最小化、关闭等命令时,收到这个消息。常用在窗口关闭时,提示用户处理。wParam 具体点击位置,例如关闭SC_CLOSE等.lParam-鼠标位置 LOWORD 低字-水平位置HIWORD 高字-垂直位置Windows常用消息WM_CREATE-在窗口创建成功还未显示之前,收到这个消息。常用于初始化窗口的参数、资源等等,包括创建子窗口等。WPARAM-不使用LPARAM-是CREATESTRUCT结构的指针,保存了CreatWindowEx中的12个参数。WM_SIZE-在窗口的大小发生变化后,会收到WM_SIZE。常用于窗口大小变化后,调整窗口内各个部分的布局。WPARAM-窗
19、口大小变化的原因。LPARAM-变化窗口客户区的大小LOWORD-变化后的宽度HIWORD-变化后的高度Windows常用消息WM_QUIT-用于结束消息循环处理。wParam-PostQuitMessage 函数传递的参数。lParam-不使用当GetMessage收到这个消息后,会返回FALSE,结束while处理,退出消息循环。WM_PAINT-绘图消息键盘消息鼠标消息定时器消息消息的获取GetMessage-从系统获取消息,将消息从系统中移除,阻塞函数。当系统无消息时,GetMessage会等候下一条消息。PeekMessage-以查看的方式从系统获取消息,可以不将消息从系统移除,非阻
20、塞函数。当系统无消息时,返回FALSE,继续执行后续代码。BOOL PeekMessage(LPMSG lpMsg,/message informationHWND hWnd,/handle to windowUINT wMsgFilterMin,/first messageUINT wMsgFilterMax,/last messageUINT wRemoveMsg/移除标识);消息的发送SendMessage-发送消息,会等候消息处理的结果。PostMessage-投递消息,消息发出后立刻返回,不等候消息执行结果。BOOL SendMessage/PostMessage(HWND hWnd
21、,/消息发送的目的窗口UINT Msg,/消息IDWPARAM wParam,/消息参数LPARAM lParam /消息参数);消息的分类1 系统消息-ID范围 0-0 x03FF 由系统定义好的消息,可以在程序中直接使用。2 用户自定义消息-ID范围 0 x0400-0 x7FFF(31743)#define WM_MYMESSAGE WM_USER+n由用户自己定义,满足用户自己的需求。由用户自己发出消息,并响应处理。自定义消息宏:WM_USER 3 应用程序消息-ID范围 0 x8000-0 xBFFF 程序之间通讯时使用的消息。应用程序消息宏:WM_APP 4 系统注册消息-ID范围
22、 0 xC000-0 xFFFF 在系统注册并生成相应消息,然后可以在各个程序中使用这个消息。消息队列消息队列用于存放消息的一个队列,消息在队列中先入先出。所有窗口程序都具有消息队列。程序可以从队列中获取消息。消息队列的类型系统消息队列-由系统维护的消息队列。存放系统产生的消息,例如鼠标、键盘等。程序消息队列-属于每一个应用程序(线程)的消息队列。由应用程序(线程)维护。消息队列的关系1 当鼠标、键盘产生消息时,会将消息存放到系统消息队列2 系统会根据存放的消息,找到对应窗口的消息队列。3 将消息投递到程序的消息队列中。消息和消息队列根据消息和消息队列之间使用关系,将消息分成两类:队列消息-消
23、息的发送和获取,都是通过消息队列完成。非队列消息-消息的发送和获取,是直接调用消息的窗口处理完成。队列消息-消息发送后,首先放入队列,然后通过消息循环,从队列当中获取。GetMessage-从消息队列中获取消息(永远只能)PostMessage-将消息投递到消息队列常见队列消息:WM_PAINT、键盘、鼠标、定时器。非队列消息消息发送时,首先查找消息接收窗口的窗口处理函数,直接调用处理函数,完成消息。SendMessage-直接将消息发送给窗口的处理函数,并等候处理结果。常见消息:WM_CREATE、WM_SIZE等。消息的获取消息循环GetMessage/PeekMessage从程序的消息队
24、列当中,获取到消息。TranslateMessage 检查获取到的消息,如果发现是按键消息,产生一个字符消息(WM_CHAR),并放入程序的消息队列。DispatchMessage 根据消息,找到窗口处理函数,调用窗口处理函数,完成消息的处理。GetMessage/PeekMessage次序1 在程序(线程)消息队列查找消息,如果队列有消息,检查消息是否满足指定条件(HWND,ID范围),不满足条件就不会取出消息,否则从队列取出消息返回。2 如果程序(线程)消息队列没有消息,向系统消息队列获取属于本程序的消息。如果系统队列的当前消息属于本程序,系统会将消息转发到程序消息队列。3 如果系统消息队
25、列也没有消息,检查所有窗口的需要重新绘制的区域,如果发现有需要绘制的区域,产生WM_PAINT消息,取得消息返回处理。4 如果没有重新绘制区域,检查定时器如果有到时的定时器,产生WM_TIMER,返回处理执行。5 如果没有到时的定时器,整理程序的资源、内存等等。6 GetMessage会继续等候下一条消息。PeekMessage会返回FALSE,交出程序的控制权。注意:GetMessage如果获取到是WM_QUIT,函数会返回FALSE。消息的发送1 SendMessage发送消息到指定的窗口,并等候对方将消息处理,然后消息执行结果,用于非队列消息的发送。2 PostMessage将消息放到消
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 【精品】Win32 编程精品ppt课件 Win32 编程 ppt 课件
限制150内