




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Windows编程基础,Windows编程基础,Windows程序内部运行原理 SDK方式编写Windows应用程序 Windows应用程序特性,CH1.1Windows程序内部运行原理,目标:理解Windows程序的运行机制 掌握以下基本概念 窗口 Windows API 消息与消息机制 消息响应 句柄,Windows应用程序,操作系统,计算机硬件输入输出设备之间的相互关系,Windows API,操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用(System call),
2、这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称Windows API。,Windows API,Windows API的作用 是Windows系统与Windows应用程序间的标准程序接口 Windows应用程序可以利用标准大量API函数调用系统功能 窗口管理函数:实现窗口的创建、移动和修改功能 系统服务函数:实现与操作系统有关的多种功能 图形设备(GDI)函数:实现与设备无关的图形操作功能,消息响应,操作系统能够感知输入设备的变化(事件),并且能够知道具体的事件情况,但操作系统并不决定对这一事件如何作
3、出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。对事件作出反应的过程就是消息响应。,消息,操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。,消息结构体,MSG结构定义如下:,typedef struct tagMSG HWNDhwnd; /窗口句柄 UINTmessage; /主消息 WPARAMwParam; /附加消息 LPARAMlParam; DWORDtime; /送至队列的时间 POINTpt; /消息发送时屏幕光标的位置 MSG, *PMS
4、G;,第一个成员变量hwnd表示消息所属的窗口。我们通常开发的程序都是窗口应用程序,一个消息一般都是与某个窗口相关联的。例如,在某个活动窗口中按下鼠标左键,产生的按键消息就是发给该窗口的。在Windows程序中,用HWND类型的变量来标识窗口。 第二个成员变量message指定了消息的标识符。在Windows中,消息是由一个数值来表示的,不同的消息对应不同的数值。但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM是Window Message的缩写)的形式,XXX对应某种消息的英文拼写的大写形式。例如,鼠标左键按下消息是WM_LBUTTONDOWN,键盘按下消
5、息是WM_KEYDOWN,字符消息是WM_CHAR,等等。在程序中我们通常都是以WM_XXX宏的形式来使用消息的。 提示:如果想知道WM_XXX消息对应的具体数值,可以在Visual C+开发环境中选中WM_XXX,然后单击鼠标右键,在弹出菜单中选择goto definition,即可看到该宏的具体定义。跟踪或查看某个变量的定义,都可以使用这个方法。 第三、第四个成员变量wParam和lParam,用于指定消息的附加信息。例如,当我们收到一个字符消息的时候,message成员变量的值就是WM_CHAR,但用户到底输入的是什么字符,那么就由wParam和lParam来说明。wParam、lPar
6、am表示的信息随消息的不同而不同。如果想知道这两个成员变量具体表示的信息,可以在MSDN中关于某个具体消息的说明文档查看到。读者可以在VC+的开发环境中通过goto definition查看一下WPARAM和LPARAM这两种类型的定义,可以发现这两种类型实际上就是unsigned int和long。 最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置。,从变量的类型区分变量的用途,int x,y; x=50; y=30; /x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重等等。,typedef int WIDTH typedef int HEIGHT
7、 WIDTH x; HEIGHT y; /好处:我们从变量的类型上就可以知道x和y是用来表示宽度和高度。,Windows对象,Windows窗口是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。 Windows Object是Windows系统的内部结构,是Windows的规范部件,包括各种窗口、菜单、按钮、对话框以及程序模块等,通过一个句柄来引用。,句柄(Handle),句柄(HANDLE),Windows用来标识被应用程序建立或使用的Windows对象的一个唯一的整数值。 操作系统要管理和操作这些Windows对象(资源),都
8、是通过句柄来找到对应的对象。按Windows对象的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。 操作系统给每一个窗口指定的一个唯一的标识号(整数值)即窗口句柄。,消息结构体,typedef struct tagMSG HWNDhwnd; /窗口句柄 UINTmessage; /主消息 WPARAMwParam; /附加消息 LPARAMlParam; DWORDtime; /送至队列的时间 POINTpt; /消息发送时屏幕光标的位置 MSG, *PMSG;,主消息,由事先定义好的消息
9、名标识 采用不同的前缀符号来区别能够解释和处理消息的窗口类型 WM_ 窗口消息 BM_ 按钮控制消息 CB_ 组合框控制消息 DM_ 默认下压式按钮控制消息 EM_ 编辑控制消息 LB_ 列表框控制消息 SMB_ 滚动条控制消息,附加消息,与主消息有关 wParam lParam,消息结构体,typedef struct tagMSG HWNDhwnd; /窗口句柄 UINTmessage; /主消息 WPARAMwParam; /附加消息 LPARAMlParam; DWORDtime; /送至队列的时间 POINTpt; /消息发送时屏幕光标的位置 MSG, *PMSG;,消息结构体,对于
10、MSG这个结构体来说,它里面包含的信息是相当丰富的,它包含了对于一个消息来说,它和哪一个窗口相关,这个消息本身是什么,这个消息的附加参数是什么,消息发生投递的时间是什么。我们拿到这样一个消息就像当全面了。那么我们就知道应该做什么样的处理。,Windows应用程序,操作系统,计算机硬件输入输出设备之间的相互关系,消息队列,对于每一个应用程序,操作系统会给它建立一个消息队列。这个队列实际上是一个先进先出的缓冲区,通常是一个某种变量类型的数组。消息队列中的每个元素都是一条消息。 操作系统将生成的每个消息按先后顺序放进消息队列中。应用程序总是依次取走队列里的第一条消息。应用程序取走消息后便能够知道用户
11、的操作和程序状态的变化,从而对特定的消息进行处理(编写代码)消息响应。,应用程序获得的消息,进队消息 进队消息是由Windows放入程序的消息队列中的 不进队消息 不进队消息直接发送给窗口过程,CH1.2 SDK方式编写Windows应用程序,目标:能够用SDK (Windows API+C/C+)编写一个简单的Windows应用程序,通过编写程序掌握Windows程序的运行原理及编写方式。为MFC的学习打下基础。 掌握以下基本知识: Windows应用程序基本结构,程序执行的起点(入口函数)?,main(),WinMain(),WinMain函数,Windows程序的入口函数 int WIN
12、API WinMain( HINSTANCE hInstance, / handle to current instance HINSTANCE hPrevInstance, / handle to previous instance LPSTR lpCmdLine, / command line int nCmdShow / show state );,匈牙利表示法,一种命名约定 匈牙利命名法是微软推广的一种关于变量、函数、对象、前缀、宏定义等各种类型的符号的命名规范。匈牙利命名法的主要思想是:在变量和函数名中加入前缀以增进人们对程序的理解。 为纪念Microsoft程序员Charles S
13、imonyi所使用的命名约定,命名约定,常用的命名约定有三种: Unix环境常用的命名法 my_age、num_of_student 驼峰式命名法 myAge、numOfStudent 匈牙利标记法 iMyCar、bIsRight,WinMain函数,Windows程序的入口函数 int WINAPI WinMain( HINSTANCE hInstance, / handle to current instance HINSTANCE hPrevInstance, / handle to previous instance LPSTR lpCmdLine, / command line in
14、t nCmdShow / show state );,函数调用约定,函数调用是通过堆栈来实现的。在调用时,将参数值和调用后的返回地址压入所分配的堆栈空间中。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。在参数传递中,有两个很重要的问题必须得到明确说明: 当参数个数多于一个时,按照什么顺序把参数压入堆栈 函数调用后,由谁来把堆栈恢复原装(堆栈清除),main( ) 调fun( ) 结束,fun( ) 返回,保存: 返回地址 当前现场,恢复: 主调程序现场 返回地址,函数的调用,窗口的创建,创建一个完整的窗口需要经过下面四个操作步骤: 设计一个窗口类; 注册窗口类; 创建窗口
15、; 显示及更新窗口。,创建窗口 第一步,窗口类的定义 WNDCLASS,typedef struct tagWNDCLASS UINTstyle; /窗口类风格 WNDPROClpfnWndProc; /窗口过程函数 intcbClsExtra;/在类结构中预留的空间 intcbWndExtra; /在Windows内部预留空间 HINSTANCEhInstance; /程序实例句柄 HICONhIcon; /窗口的图标 HCURSORhCursor; /光标句柄 HBRUSHhbrBackground; /背景色 LPCTSTRlpszMenuName; /窗口类菜单 LPCTSTRlpsz
16、ClassName; /窗口类名 WNDCLASS, *PWNDCLASS;,窗口类的类型,在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位(bit)为1,其余的bit都为0。,如果我们希望某一变量的数值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我们只需使用二进制OR
17、(|)操作符将他们进行或运算相组合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我们希望在某一变量原有的几个特征上去掉其中一个特征,用取反()之后再进行与( /窗口类风格 WNDPROClpfnWndProc; /窗口过程函数 intcbClsExtra;/在类结构中预留的空间 intcbWndExtra; /在Windows内部预留空间 HINSTANCEhInstance; /程序实例句柄 HICONhIcon; /窗口的图标 HCURSORhCursor; /光标句柄 HBRUSHhbrBackground; /背景色 LPCTSTRlps
18、zMenuName; /窗口类菜单 LPCTSTRlpszClassName; /窗口类名 WNDCLASS, *PWNDCLASS;,窗口过程函数,窗口过程函数用来对消息进行处理 第二个成员变量lpfnWndProc指定了这一类型窗口的过程函数,也称回调函数。,回调函数,当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。,窗口过程函数,对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受
19、消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。,创建窗口 第一步,窗口类的定义 WNDCLASS,typedef struct tagWNDCLASS UINTstyle; /窗口类风格 WNDPROClpfnWndProc; /窗口过程函数 intcbClsExtra;/在类结构中预留的空间 intcbWndExtra; /在Windows内部预留空间 HINSTANCEhInstance; /程序实例句柄 HICONhIcon; /窗口的图标 HCURSORhCursor; /光标句
20、柄 HBRUSHhbrBackground; /背景色 LPCTSTRlpszMenuName; /窗口类菜单 LPCTSTRlpszClassName; /窗口类名 WNDCLASS, *PWNDCLASS;,WNDCLASS,类附加空间(cbClsExtra) Windows为系统中每一个窗口类管理一个WNDCLASS结构。在应用程序注册一个窗口类时,它可以让Windows系统为该结构分配和追加一定字节数的附加内存空间,这部分内存称之为类附加内存,由属于这种窗口类的所有窗口共享,类附加内存空间用于存储类的附加信息。 函数SetClassWord和SetClassLong用来把某一个值复制到
21、类附加内存中,并可以通过GetClassWord和GetClassLong来检取这些值。,WNDCLASS,窗口附加空间(cbWndExtra) Windows为每一个窗口管理一个内部数据结构,在注册一个窗口类时,应用程序能够指定一定字节的附加内存空间,称为窗口附加内存。在创建这类窗口时,Windows系统就为窗口结构分配和追加指定数目的窗口附加内存空间,应用程序可以用这部分内存存储窗口特有的数据。 函数SetWindowWord和SetWindowLong可以把某一个值复制到附加内存,函数GetWindowWord和GetWindowLong可以检取这些值。,创建窗口 第一步,窗口类的定义
22、WNDCLASS,typedef struct tagWNDCLASS UINTstyle; /窗口类风格 WNDPROClpfnWndProc; /窗口过程函数 intcbClsExtra;/在类结构中预留的空间 intcbWndExtra; /在Windows内部预留空间 HINSTANCEhInstance; /程序实例句柄 HICONhIcon; /窗口的图标 HCURSORhCursor; /光标句柄 HBRUSHhbrBackground; /背景色 LPCTSTRlpszMenuName; /窗口类菜单 LPCTSTRlpszClassName; /窗口类名 WNDCLASS,
23、*PWNDCLASS;,LoadIcon,LoadIcon的作用是在应用程序中加载一个窗口图标,其原型为: HICON LoadIcon( HINSTANCE hInstance, LPCTSTR lpIconName );,图标资源名或系统 预定义图标标识名,图标资源所在的模块句柄, NULL则使用系统预定义图标,基于资源的程序设计,Windows程序分为“程序代码”和“用户接口(UI)资源”两大部分。程序代码使用编译器编译,用户接口资源使用资源编译器编译,最后两者使用连接器加上库文件可以生成可执行文件。,基于资源的程序设计,用户接口(UI)资源是指功能菜单、对话框、程序图标、光标等资源,它
24、是Windows应用程序界面的重要组成部分。资源的使用极大方便了应用程序界面的设计,也大大方便了应用程序与用户的交互。 这些用户资源的实际内容(二进制代码)是借助各种工具产生的。并以各种扩展名的文件存在,如.ico,.bmp,.cur等。程序员必须在一个所谓的资源描述文档(.rc)中描述它们。RC编译器读取RC文件的描述后,将所有用户接口资源文件集中制作一个.RES文件。 这些资源可以使用VC+提供的资源编辑器来实现创建和编辑。,资源,资源分类 菜单 WM_COMMAND消息 wParam低16位传递菜单项资源ID 对话框 WM_COMMAND消息 wParam低16位传递子窗口(控件)资源I
25、D 资源ID 资源的唯一标识,基于资源的程序设计,创建窗口 第一步,窗口类的定义 WNDCLASS,typedef struct tagWNDCLASS UINTstyle; /窗口类风格 WNDPROClpfnWndProc; /窗口过程函数 intcbClsExtra;/在类结构中预留的空间 intcbWndExtra; /在Windows内部预留空间 HINSTANCEhInstance; /程序实例句柄 HICONhIcon; /窗口的图标 HCURSORhCursor; /光标句柄 HBRUSHhbrBackground; /背景色 LPCTSTRlpszMenuName; /窗口类
26、菜单 LPCTSTRlpszClassName; /窗口类名 WNDCLASS, *PWNDCLASS;,LoadCursor,LoadCursor的作用是在应用程序中加载一个窗口光标, 其原型为: HCURSOR LoadCursor( HINSTANCE hInstance, LPCTSTR lpCursorName );,光标资源所在的模 块句柄,NULL则使 用系统预定义光标,光标资源名或系统 预定义光标标识名,创建窗口 第一步,窗口类的定义 WNDCLASS,typedef struct tagWNDCLASS UINTstyle; /窗口类风格 WNDPROClpfnWndProc
27、; /窗口过程函数 intcbClsExtra;/在类结构中预留的空间 intcbWndExtra; /在Windows内部预留空间 HINSTANCEhInstance; /程序实例句柄 HICONhIcon; /窗口的图标 HCURSORhCursor; /光标句柄 HBRUSHhbrBackground; /背景色 LPCTSTRlpszMenuName; /窗口类菜单 LPCTSTRlpszClassName; /窗口类名 WNDCLASS, *PWNDCLASS;,GetStockObject,GetStockObject的作用是获取笔、画刷、调色板、字体的句柄。应用程序调用函数Ge
28、tStockObject获取系统提供的背景刷。其原型为: HGDIOBJ GetStockObject( int fnObject / type of stock object );,创建窗口 第一步,窗口类的定义 WNDCLASS,typedef struct tagWNDCLASS UINTstyle; /窗口类风格 WNDPROClpfnWndProc; /窗口过程函数 intcbClsExtra;/在类结构中预留的空间 intcbWndExtra; /在Windows内部预留空间 HINSTANCEhInstance; /程序实例句柄 HICONhIcon; /窗口的图标 HCURSO
29、RhCursor; /光标句柄 HBRUSHhbrBackground; /背景色 LPCTSTRlpszMenuName; /窗口类菜单 LPCTSTRlpszClassName; /窗口类名 WNDCLASS, *PWNDCLASS;,菜单,Windows应用程序加载菜单的方法:在窗口类的定义中加载菜单资源 wndcls.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1); 在创建窗口时加载菜单 HMENU hMenu; hMenu=LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1) 动态加载菜单:应用程序通过调用函数L
30、oadMenu获取菜单句柄后,还可通过SetMenu动态加载菜单。,创建窗口 第二步,注册窗口类 RegisterClass,ATOMRegisterClass (CONST WNDCLASS*lpWndClass );,创建窗口 第三步,创建窗口实例 CreateWindow,HWND CreateWindow ( LPCTSTR lpszClassName,/窗口类名 LPCTSTR lpszTitle, /窗口标题名 DWORD dwStyle, /创建窗口的样式 int x,y, /窗口左上角坐标 int nWidth,nHeight, /窗口宽度和度高 HWND hwndParent
31、, /该窗口的父窗口句柄 HWENU hMenu, /窗口主菜单句柄 HINSTANCE hInstance, /创建窗口的应用程序当前句柄 LPVOID lpParam /指向一个传递给窗口的参数值的指针 ),窗口样式,菜单,Windows应用程序加载菜单的方法:在窗口类的定义中加载菜单资源 wndcls.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1); 在创建窗口时加载菜单 HMENU hMenu; hMenu=LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1) 动态加载菜单:应用程序通过调用函数LoadMenu获取
32、菜单句柄后,还可通过SetMenu动态加载菜单。,创建窗口 第四步,显示窗口 ShowWindow,BOOLShowWindow (HWNDhWnd, intnCmdShow );,创建窗口 第五步,刷新窗口 UpdateWindow,BOOL UpdateWindow( HWND hWnd );,显示窗口后,应用程序调用UpdateWindow更新并绘制用户区, 并发出WM_PAINT消息。 UpdateWindow(hwnd);,建立消息循环,Windows应用程序的运行以消息为核心,应用程序必须读取应用程序消息队列,检索消息并将它们发送出去,以便适当的窗口函数能够处理它们,完成这一任务的
33、便是消息循环。,建立消息循环,从消息队列中获取消息 GetMessage 翻译消息和派遣消息 TranslateMessage DispatchMessage,建立消息循环,GetMessage,从消息队列中读取 一条消息,并将消 息放在MSG结构中,其中函数GetMessage形式为: GetMessage( lpMSG, /指向MSG结构的指针 hwnd, nMsgFilteMin, /用于消息过滤的最小消息号值 nMsgFilterMax /用于消息过滤的最大消息号值 ),返回零值,即检索 到WM_QUIT消息,程 序结束循环并退出,窗口过程,窗口过程函数用来对消息进行处理,LRESUL
34、T CALLBACKWndProc ( HWNDhWnd, UINT message, WPARAM wParam, LPARAM lParam );,窗口函数的一般形式如下: LRESULT CALLBACK WndProc(HWND hwnd,UINT messgae, WPARAM wParam,LPARAM lParam ) switch(message) message为标识的消息 case break; case WM_DESTROY: PostQuitMessage(0); default: return DefWindowProc(hwnd,message,wParam,lPa
35、ram); return(0); ,在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗口时发出的。它向应用程序发出WM_QUIT消息,请求退出处理函数: void PostQuitMessage(int nExitCode) /nExitCode为应用程序的退出代码,为未定义处理过程的消息提供缺省处理,程序执行流程,格式化字符串函数,格式化字符串的函数 sprintf stdio.h,char szChar20; sprintf(szChar,char is %d,wParam);,MessageBox函数,用于显示信息,int /返回用户所选按钮代表的数值 Message
36、Box ( HWND hWnd, /窗口句柄 LPCTSTR lpText, /消息框主体显示的文本 LPCTSTR lpCaption, /消息框标题栏显示文本 UINT uType /代表消息框风格的常数组合 ) ;,消息框风格,以MB_开始的常数组合代表消息框的风格 多种风格之间用“|”分隔,if(IDOK = MessageBox( NULL, 是否退出本程序?, 退出, MB_OKCANCEL| MB_ICONQUESTION) MessageBox(NULL,再见!,退出,MB_OK);,GDI简介图形设备接口,Windows应用程序中的图形输出流程 应用程序提出绘图请求 GDI接
37、受请求并传递给对应设备的驱动程序 设备驱动程序完成特定的硬件输出,GDI简介,绘图机制 绘图函数(如:Ellipse、 TextOut ) 绘图工具(画笔、画刷等)(GDIObject) 设备上下文(绘图环境)(Device Context),获得绘图环境,构造绘图工具,绘图,应用程序每一次文字图形操作均参照设备描述表中的属性进行。设备描述表描述了特定输出设备状态、文本和图形的绘图参数等;包括设备上可使用的输出区域、逻辑坐标系、选定何种绘图工具绘图、绘图前景色、填充色、字体、字体颜色、字的磅数等属性。,设备描述表( Device context ),画笔 HPEN,创建画笔 将画笔选入DC 删
38、除画笔资源,HPEN hPen; hPen = CreatePen( S_SOLID,2,RGB(255,0,0); / 线形,线宽,颜色,SelectObject(hdc,hPen);,DeleteObject(hPen);,画刷 HBRUSH,创建画刷 将画刷选入DC 删除画刷资源,HBRUSH hBrush; hBrush = CreateSolidBrush(RGB(255,0,0);,SelectObject(hdc,hBrush);,DeleteObject(hBrush);,GDI简介,要在窗口的客户区绘图,可以使用Windows的图形设备接口(GDI)函数 每个GDI函数都需要
39、将设备描述表句柄作为函数的第一个参数,例如 DrawText( HDC, LPCTSTR, int, LPRECT, UINT ); TextOut( HDC, int, int, LPCTSTR, int );,画线,画线 LineTo LineTo(HDC,int,int); 例:LineTo(hdc,100,100); 默认情况下从(0,0)开始画 移动画笔 MoveToEx MoveToEx(HDC,int,int,LPPOINT);,画其它图形,画椭圆 Ellipse(hdc,100,100,200,200); 画圆角矩形 RoundRect(hdc,); 画弧 Arc(hdc,);
40、 画饼 Pie(hdc,); 画矩形 Rectangle(HDC,int,int,int,int);,获取设备描述表:方法一,该方法适合于处理非WM_PAINT消息 用GetDC获取设备描述表句柄 用ReleaseDC释放设备描述表句柄 这种获取设备描述表的一般方式如下,hdc = GetDC(hwnd) ; ReleaseDC(hwnd, hdc) ;,WM_PAINT消息,什么时候向窗口过程发送WM_PAINT消息(窗口发生重绘) “无效”的时候 调用UpdateWindow函数刷新窗口 窗口的全部或者部分失效的时候 窗口从无到有 手动刷新窗口 调用InvalidateRect函数,获取设
41、备描述表:方法二,该方法只适合于处理WM_PAINT消息 用BeginPaint“使无效窗口生效”并“返回设备描述表句柄” 用EndPaint释放设备描述表句柄 一般处理WM_PAINT的形式如下:,Case WM_PAINT; hdc = BeginPaint(hwnd, ,PAINTSTRUCT结构,Windows系统为每一个窗口建立了一个PAINTSTRUCT结构。该结构中包含了包围无效区域的一个最小矩形的结构RECT,应用程序可以根据这个无效区域执行更新的操作。 PAINTSTRUCT结构体不需要我们维护,是系统内部维护的结构体。,获取设备描述表:方法三,获取整个窗口的设备描述表 用GetWindowDC获取整个窗口的设备描述表句柄 用ReleaseDC释放设备
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 疼痛管理中的安全护理方法
- 环境大数据分析-第2篇-洞察及研究
- 生产制造材料保证措施
- 智能防火墙技术-洞察及研究
- 九年级学生法治教育德育计划
- 云计算与大数据中心热管理优化技术研究-洞察及研究
- 部编版人教四年级语文上册家庭故事习作范文
- 病毒致病机制研究-洞察及研究
- 教育公平量化评估-洞察及研究
- 2025年涂镀产品:镀铝锌项目发展计划
- 计算思维技能水平量表(CTS)-2
- 云南省新型农村合作医疗基本用药目录
- 跆拳道考级打分表
- 南京社区工作者考试题库2023
- 神经外科运用PDCA循环降低患者平均住院日
- 钢城新苑小区景观设计方案说明
- 2021届高考英语887核心词(打印、词频、出处、例句、背诵)
- 高层次人才公寓装修技术标
- 湖南2022长沙银行春季校园招聘线上初面上岸提分题库3套【500题带答案含详解】
- GB/T 10821-1993农业机械用V带尺寸
- 最新3C认证全套程序文件
评论
0/150
提交评论