【精品】Win32 编程精品ppt课件.ppt

上传人:1595****071 文档编号:86271414 上传时间:2023-04-14 格式:PPT 页数:157 大小:931KB
返回 下载 相关 举报
【精品】Win32 编程精品ppt课件.ppt_第1页
第1页 / 共157页
【精品】Win32 编程精品ppt课件.ppt_第2页
第2页 / 共157页
点击查看更多>>
资源描述

《【精品】Win32 编程精品ppt课件.ppt》由会员分享,可在线阅读,更多相关《【精品】Win32 编程精品ppt课件.ppt(157页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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将消息放到消

26、息队列中,立刻返回,用于队列消息的发送。无法获知消息是否被对方处理。绘图消息WM_PAINTWM_PAINT 当窗口需要绘制的时候,会发送窗口处理函数。窗口无效区域 被声明成需要重新绘制的区域。BOOL InvalidateRect(HWND hWnd,/窗口句柄 CONST RECT*lpRect,/区域的矩形坐标 BOOL bErase /重绘前是否先擦除);在程序中,如果需要绘制窗口,调用函数声明窗口无效区域。绘图消息WM_PAINTWM_PAINT参数WPARAM-不使用LPARAM-不使用消息处理步骤1 开始绘图处理HDC BeginPaint(HWND hwnd,/绘图窗口LPPA

27、INTSTRUCT lpPaint/绘图参数的BUFF);返回绘图设备句柄HDC2 绘图3 结束绘图处理BOOL EndPaint(HWND hWnd,/绘图窗口CONST PAINTSTRUCT*lpPaint /绘图参数的指针BeginPaint返回);键盘消息1 键盘消息WM_KEYDOWN-按键被按下时产生WM_KEYUP-按键被放开时产生WM_SYSKEYDOWN-系统键按下时产生 比如ALT、F10WM_SYSKEYUP-系统键放开时产生WM_CHAR-字符消息(TranslateMessage发送)2 消息参数按键消息:WPARAM-按键的Virtual Key(虚拟键码)LPA

28、RAM-按键的参数,例如按下次数WM_CHAR消息:WPARAM-输入的字符(ASC字符编码)LPARAM-按键的相关参数 键盘消息消息的使用1 KEYDOWN可以重复出现,KEYUP只能在按键松开时出现1次2 TranslateMessage在转换WM_KEYDOWN消息时,对于可见字符可以产生WM_CHAR,不可见字符无此消息。3 WM_KEYDOWN/UP的wParam是表示的按键的虚拟键码值,WM_CHAR的wParam是表示输入的字符ASC字符编码。鼠标消息鼠标消息1 基本鼠标消息WM_LBUTTONDOWN-鼠标左键按下WM_LBUTTONUP-鼠标左键抬起WM_RBUTTONDO

29、WN-鼠标右键按下WM_RBUTTONUP-鼠标右键抬起WM_MOUSEMOVE-鼠标移动消息2 双击消息WM_LBUTTONDBLCLK-鼠标左键双击WM_RBUTTONDBLCLK-鼠标右键双击3 滚轮消息WM_MOUSEWHEEL-鼠标滚轮消息鼠标消息基本鼠标消息消息参数WPARAM-其他按键的状态,例如Ctrl/Shift等LPARAM-鼠标的位置,窗口客户区坐标系。LOWORD X坐标位置HIWORD Y坐标位置鼠标消息使用一般情况鼠标按下/抬起成对出现。在鼠标移动过程中,会根据移动速度产生一系列的WM_MOUSEMOVE消息。鼠标消息双击鼠标消息消息参数WPARAM-其他按键的状态

30、,例如Ctrl/Shift等LPARAM-鼠标的位置,窗口客户区坐标系。LOWORD X坐标位置HIWORD Y坐标位置使用时需要在注册窗口类的时候添加CS_DBLCLKS 风格。消息产生顺序 以WM_LBUTTONDBLCLK为例:WM_LBUTTONDOWNWM_LBUTTONUPWM_LBUTTONDBLCLKWM_LBUTTONUP鼠标消息鼠标滚轮 WM_MOUSEWHEEL消息参数WPARAM:LOWORD-其他按键的状态HIWORD-滚轮的偏移量,是120的倍数,通过正负值表示表示滚动方向。正:向前滚动负:向后滚动LPARAM:鼠标当前的位置,屏幕坐标系LOWORD-X坐标HIWO

31、RD-Y坐标使用通过偏移量,获取滚动的方向和倍数。定时器消息1 定时器消息可以在程序中设置定时器,当到达时间间隔时,定时器会向程序发送一个WM_TIMER消息。定时器的精度是毫秒,但是准确度很低。例如设置时间间隔为1000ms,但是会在非1000毫秒到达。2 消息的参数WPARAM-定时器IDLPARAM-定时器处理函数的指针定时器消息3 定时器使用3.1 创建定时器UINT SetTimer(HWND hWnd,/定时器窗口句柄UINT nIDEvent,/定时器IDUINT uElapse,/时间间隔TIMERPROC lpTimerFunc/定时器处理函数指针);创建成功,返回非0。当l

32、pTimerFunc为NULL使用窗口处理函数,做为定时器处理函数,当lpTimerFunc不为NULL使用定时器处理函数处理定时器消息。3.2 消息处理 WM_TIMER3.3 关闭定时器BOOL KillTimer(HWND hWnd,/定时器窗口句柄UINT uIDEvent/定时器ID);附:GetClientRect 获取窗口客户区大小菜单的使用菜单的分类1.1 窗口的顶层菜单1.2 弹出式菜单1.3 系统菜单HMENU类型表示菜单,菜单每一项有相应的ID。菜单的使用窗口的顶层菜单创建菜单 HMENU CreateMenu(VOID);/创建成功返回菜单句柄增加菜单项 (Insert

33、Menu)BOOL AppendMenu(HMENU hMenu,/菜单句柄UINT uFlags,/菜单项风格UINT uIDNewItem,/菜单项IDLPCTSTR lpNewItem/菜单项的名称);设置到窗口BOOL SetMenu(HWND hWnd,/窗口句柄HMENU hMenu/菜单句柄);菜单的使用弹出式菜单 Popup菜单的创建HMENU CreatePopupMenu(VOID);/创建成功返回菜单句柄加入顶层菜单BOOL AppendMenu(HMENU hMenu,/菜单句柄UINT uFlags,/菜单项增加选项,MF_POPUPUINT_PTR uIDNewIt

34、em,/弹出式菜单的句柄LPCTSTR lpNewItem/菜单项的名称);菜单的使用菜单命令处理WM_COMMAND 消息WPARAM:HIWORD-对于菜单项为0LOWORD-菜单项的IDLPARAM-对于菜单为NULL命令处理过程获取WPARAM菜单ID,根据ID处理。菜单的使用菜单项的状态在增加菜单项可以设置菜单项的状态。可以使用菜单API 修改状态CheckMenuItemEnableMenuItem函数使用时,需要通过设置MF_BYPOSITION或者MF_BYCOMMAND,确定使用菜单索引或者菜单ID。WM_INITMENUPOPUP在菜单被激活但是未显示,窗口会收到这个消息W

35、PARAM 即将显示菜单句柄LPARAM-LOWORD 是被点击顶层菜单项索引(位置)HIWORD即将显示菜单是否为窗口菜单窗口菜单:顶层菜单/系统菜单 属于窗口菜单。弹出式菜单不属于窗口菜单系统菜单的使用1 系统菜单的获取HMENU GetSystemMenu(HWND hWnd,/窗口句柄BOOL bRevert/重置选项);返回获取到的系统菜单句柄bRevert:TRUE-删除旧菜单,恢复到默认的系统菜单FALSE-返回当前的系统菜单句柄。2 系统菜单的修改AppendMenuDeleteMenu3 系统菜单命令响应通过WM_SYSCOMMAND响应菜单命令。WPARAM的LOWORD是

36、命令ID右键菜单 Context Menu的使用1 创建菜单右键菜单是一个弹出式菜单,使用CreatePopupMenu创建。2 显示弹出式菜单BOOL TrackPopupMenu(HMENU hMenu,/弹出式菜单句柄UINT uFlags,/显示方式int x,/水平位置,屏幕坐标系int y,/垂直位置,屏幕坐标系int nReserved,/保留,必须0 HWND hWnd,/处理菜单消息的窗口句柄CONST RECT*prcRect/NULL,忽略);TrackPopupMenu是阻塞函数右键菜单 Context Menu的使用3 命令处理WM_COMMAND,与窗口菜单一致如果

37、Track设置了TPM_RETURNCMD选项,那么点击的菜单项ID通过函数的返回值获取。4 菜单项的状态WM_INITMENUPOPUP,按照弹出菜单处理右键菜单 Context Menu的使用 菜单处理位置1 鼠标右键抬起WM_RBUTTONUP 鼠标右键消息窗口坐标系坐标,要使用需要转换成屏幕坐标系ClientToScreenScreenToClient2 WM_CONTEXTMENUWParam-右键点击的窗口句柄LPARAM-LOWORD X坐标,屏幕坐标系 HIWORD Y坐标,屏幕坐标系WM_CONTEXTMENU消息是在WM_RBUTTONUP消息之后产生。资源的使用资源相关资

38、源脚本文件:*.rc文件编译器:RC.EXE菜单资源的使用1 添加菜单资源2 加载菜单资源2.1 在注册时设置菜单资源2.2 加载菜单资源,设置到窗口HMENU LoadMenu(HINSTANCE hInstance,/handle to moduleLPCTSTR lpMenuName /menu name or resource identifier);CreateWindow/ExSetMenu资源的使用图标资源 ICON的使用1 添加资源注意图标的大小,一个图标文件中,可以有多个不同大小的图标。2 加载HICON LoadIcon(HINSTANCE hInstance,/handl

39、e to application instanceLPCTSTR lpIconName /name string or resource identifier);成功返回HICON句柄3 设置3.1 注册窗口类3.2 WM_SETICON消息4 绘制DrawIcon 在窗口客户区中绘制 一个图标资源的使用光标资源的使用1 添加光标的资源光标的大小默认是32X32像素,每个光标有HotSpot,是当前鼠标的热点2 使用资源HCURSOR LoadCursor(HINSTANCE hInstance,/handle to application instance LPCTSTR lpCursorN

40、ame /name or resource identifier);hInstance-可以为NULL,获取系统默认的Cursor2.1 在注册窗口时,设置光标2.2 使用SetCursor设置光标HCURSOR SetCursor(HCURSOR hCursor /handle to cursor);资源的使用光标资源的使用 3 WM_SETCURSOR 消息参数WPARAM-当前使用的光标句柄LPARAM-LOWORD 光标活动区域(Hit-Test code)HTCLIENT/HTCAPTION HIWORD-当前鼠标消息ID字符串资源1 添加字符串资源添加字符串表,在表中增加字符串2

41、字符串资源的使用int LoadString(HINSTANCE hInstance,/handle to resource moduleUINT uID,/字符串IDLPTSTR lpBuffer,/存放字符串BUFFint nBufferMax/字符串BUFF长度);成功返回字符串长度,失败0资源的使用加速键资源的使用1 添加 资源添加加速键表,增加命令ID对应的加速键。2 使用 2.1 加载加速键表 HACCEL LoadAccelerators(HINSTANCE hInstance,/handle to module LPCTSTR lpTableName /accelerator

42、table name );返回加速键表句柄 2.2 处理加速键消息 int TranslateAccelerator(HWND hWnd,/处理消息的窗口句柄 HACCEL hAccTable,/加速键表句柄 LPMSG lpMsg/消息 );如果是加速键,返回非零。2.3 在WM_COMMAND中相应消息,消息参数 WPARAM-HIWORD 为1,表示加速键 为0,表示菜单 LOWORD 为命令ID LPARAM 为NULL资源的使用加速键资源的使用3 TranslateAccelerator处理过程3.1 检测消息是否是WM_KEYDOWNWM_SYSKEYDOW,获取按键状态3.2 根

43、据按键状态,从HACCEL中查找对应命令ID3.3 找到对应ID,发送WM_COMMAND消息,处理ID所对应的命令。Windows绘图1 绘图相关绘图设备 DC(Device Context),HDC-DC句柄,表示绘图设备GDI-Windows graphics device interfaceWin32提供的绘图API2 颜色 颜色的表示 计算机使用红、绿、蓝,R-0255G-0255B-0255 每一个点颜色是3个字节24位保存 0-224-116位:5,5,632位:8,8,8,8绘图或透明度Windows绘图颜色的使用COLORREF-实际DWORD,例如:COLORREF nCo

44、lor=0;赋值使用RGB宏,例如:RGBAnColor=RGB(0,0,0);获取RGB值,GetRValue/GetGValue/GetBValue例如:BYTE nRed=GetRValue(nColor);Windows绘图点的使用GetPixel 获取指定点的颜色COLORREF GetPixel(HDC hdc,/handle to DCint nXPos,/x-coordinate of pixelint nYPos /y-coordinate of pixel);SetPixel 设置指定点的颜色COLORREF SetPixel(HDC hdc,/DC句柄int X,/X坐标

45、int Y,/Y坐标COLORREF crColor/设置的颜色);Windows绘图线的使用(直线、弧线)MoveToEx-移动 当前点 到 指定点LineTo-从当前点到指定点绘制一条直线当前点:上一次绘图时的最后一点,初始为(0,0)点。封闭图形:能够画刷填充的图形Rectangle/RoundRectEllipse GDI绘图对象-画笔画笔的作用线的颜色、线型、线粗。HPEN-画笔句柄 画笔的使用1 创建画笔HPEN CreatePen(int fnPenStyle,/画笔的样式int nWidth,/画笔的粗细COLORREF crColor/画笔的颜色);创建成功返回句柄PS_SO

46、ILD-实心线,可以支持多个像素宽其他线型只能是一个像素宽。GDI绘图对象-画笔2 将画笔应用到DC中HGDIOBJ SelectObject(HDC hdc,/绘图设备句柄HGDIOBJ hgdiobj/GDI绘图对象句柄,画笔句柄);返回原来的GDI绘图对象句柄注意保存原来DC当中画笔。3 绘图4 取出DC中的画笔将原来的画笔,使用SelectObject函数,放入到设备DC中,就会将我们创建的画笔取出。5 释放画笔BOOL DeleteObject(HGDIOBJ hObject /GDI绘图对象句柄,画笔句柄);只能删除不被DC使用的画笔,所以在释放前,必须将画笔从DC中取出。GDI绘

47、图对象-画刷画刷相关画刷-封闭图形的填充的颜色、图案HBRUSH-画刷句柄画刷的使用1 创建画刷CreateSolidBrush-创建实心画刷CreateHatchBrush-创建阴影画刷 CreatePatternBrush 创建位图画刷2 将画刷应用到DC中SelectObject3 绘图4 将画刷从DC中取出SelectObject5 删除画刷DeleteObjectGDI绘图对象-画刷其他可以使用 GetStockObject 函数获取系统维护的画刷、画笔等。如果不使用画刷填充,需要使用NULL_BRUSH参数,获取不填充的画刷。GetStockObject返回的画刷不需要Delete

48、ObjectGDI绘图对象-位图位图相关光栅图形-记录图像中每一点的颜色等信息。矢量图形-记录图像算法、绘图指令等。HBITMAP-位图句柄位图的使用1 在资源中添加位图资源2 从资源中加载位图LoadBitmap3 创建一个与当前DC相匹配的DC(内存DC)HDC CreateCompatibleDC(HDC hdc /当前DC句柄,可以为NULL(使用屏幕DC));返回创建好的DC句柄4 将位图放入匹配的DC中 SelectObjectGDI绘图对象-位图5 成像(1:1)BOOL BitBlt(HDC hdcDest,/目的DCint nXDest,/目的左上X坐标int nYDest,

49、/目的左上Y坐标int nWidth,/目的宽度int nHeight,/目的高度HDC hdcSrc,/源DCint nXSrc,/源左上X坐标int nYSrc,/源左上Y坐标DWORD dwRop /成像方法 SRCCOPY);GDI绘图对象-位图缩放成像BOOL StretchBlt(HDC hdcDest,/handle to destination DCint nXOriginDest,/x-coord of destination upper-left cornerint nYOriginDest,/y-coord of destination upper-left corner

50、int nWidthDest,/width of destination rectangleint nHeightDest,/height of destination rectangleHDC hdcSrc,/handle to source DCint nXOriginSrc,/x-coord of source upper-left cornerint nYOriginSrc,/y-coord of source upper-left cornerint nWidthSrc,/源DC宽int nHeightSrc,/源DC高DWORD dwRop /raster operation co

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

当前位置:首页 > 教育专区 > 小学资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁