千张笔记

Email:rain_qian830@163.com
posts - 28, comments - 42, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

 

基本上是从书上摘录的。

第三章 窗口和消息
一个窗口就是屏幕上的一个矩形区域,它接受用户的输入,并以文本或图形的格式显示输出内容。

其实,所谓"Windows给程序发送消息",是指Windows调用程序中的一个函数,该函数的参数描述了这个特定消息。这种位于Windows程序中的函数被称为"窗口过程"。程序窗口的每一个窗口都有相关的窗口过程。这个窗口过程就是一个函数,既可以在程序中,也可以在动态链接库中。

Windows通过调用窗口过程来给窗口发送消息。窗口过程根据此消息进行处理,然后将控制返回给Windows。

Windows程序开始执行后,Windows为该程序创建一个"消息队列"。这个消息队列用来存放该程序可能创建的各种不同窗口的消息。程序中有一小段代码,叫做"消息循环",用来从队列中取出消息,并且将它们发送给相应的窗口过程。有些消息直接发送给窗口过程,不用放入消息队列中。

WndProc函数返回一个类型为LRESULT的值,该值简单地被定义为一个LONG。WinMain函数被指定为一个WINAPI类型,而WndProc函数被指定为一个CALLBACK类型。这两个标识符都被定义为__stdcall,指在Windows本身和用户的应用程序之间发生的函数调用的特殊调用序列。

句柄是一个数,它代表一个对象。程序几乎总是通过Windows函数获取句柄。程序在其他Windows函数中使用这个句柄,以引用它代表的对象。

wndclass.lpfnWndProc=WndProc;一句中,像这样在语句中使用函数名时,实际引用提供的是指向函数的指针。

在32位的Windows中,hPrevInstance总是NULL。

创建窗口:
CreateWindow返回被创建的窗口的句柄,该句柄存放在变量hwnd中,后者被定义为HWND类型。Windows中的每个窗口都有一个句柄,程序用句柄
来引用窗口。许多Windows函数需要使用hwnd作为参数,这样,Windows才能知道函数是针对哪个窗口的。如果一个程序创建了许多窗口,则每个窗口均有一个句柄。窗口句柄是Windows程序处理的最重要的句柄之一。

显示窗口:
ShowWindow函数在显示器上显示窗口。
UpdateWindow函数导致客户区域被绘制,它通过给窗口过程发送一个WM_PAINT消息来做到这一点。

消息循环:
MSG结构体中,wParam是一个32位的"message parameter(消息参数)",其含义和数值根据消息的不同而不同。lParam是一个32位的消息参数,
其值与消息有关。

只要从消息队列中取出消息的message域不为WM_QUITGetMessage就返回一个非0值。WM_QUIT消息将导致GetMessage返回0.

语句TranslateMesage(&msg)将msg结构传给Windows,进行一些键盘转换。
语句DispatchMessage(&msg)又将msg结构回传给Windows。然后Windows将该消息发送给适当的窗口过程,让它进行处理。处理完消息之后,

WndProc返回到Windows。此时,Windows还停留在DispatchMessage调用中。在结束DispatchMessage调用的处理后,Windows回到WinMain,并且接着从下一个GetMessage开始消息循环。

窗口过程:
实际的动作发生在窗口过程中。窗口过程确定了在窗口的客户区域中显示些什么,以及在窗口怎样响应用户输入。
程序通常不直接调用窗口过程。窗口过程通常由Windows本身调用。通过调用SendMessage函数,程序能够直接调用它自己的窗口过程。

WM_CREATE消息:
窗口过程接受的第一个消息-也是WndProc选择处理的第一个消息-是WM_CREATE。当Windows在WinMain中处理CreateWindow函数时,WndProc接受
这个消息。通常,窗口过程在WM_CREATE处理期间进行一次窗口初始化

WM_PAINT消息:
WndProc处理的第二个消息为WM_PAINT。这个消息在Windows程序设计中是很重要的。当窗口客户区域的一部分或者全部变为"无效",以至于必
须"刷新"时,将由这个消息通知程序。在最初创建窗口的时候,整个客户区域都是无效的,因为程序还没有在窗口上画什么东西。第一个WM_PAINT消息(通常发生在WinMain中调用UpdateWindow时)指示窗口过程在客户区域上画一些东西

对WM_PAINT的处理几乎总是从一个BeginPaint调用开始:hdc=BeginPaint(hwnd,&ps);而以一个EndPaint结束:EndPaint(hwnd,&ps);ps是一个指向类型为PAINTSTRUCT的结构指针。PAINTSTRUCT结构中包含一些窗口过程,可以用来刷新客户区域的内容。

BeginPaint调用使整个客户区域有效,并返回一个"设备描述表句柄"。设备描述表是指物理输出设备(如视频显示器)及其设备驱动程序。在窗口的客户区域显示文本和图形需要设备描述表句柄。但是不能用从BeginPaint返回的设备描述表句柄在客户区域之外绘图。EndPaint释放设备描述表句柄,使之不再有效。

一旦客户区域变得无效,WndProc就接受一个新的WM_PAINT消息。

WM_DESTROY消息:
WM_DESTROY消息指示Windows正在根据用户输入的命令来清除窗口。该消息是用户单击Close按钮或者在程序的系统菜单上选择Close时发生的。

可通过调用PostQuitMessage以标准方式响应WM_DESTROY消息,该函数在程序的消息队列中插入一个WM_QUIT消息。当GetMessage取到一个WM_QUIT消息时,它返回0.这将导致WinMain退出消息循环,并终止程序。

WM_SIZE消息:
一旦窗口的客户区域大小发生了改变,Windows就调用窗口的窗口过程。窗口过程的hwnd参数就是改变大小的窗口的句柄。参数message是
WM_SIZE。消息WM_SIZE的参数wParam表明窗口是非最小化还是非最大化,是最小化,最大化,还是隐藏。lParam参数包含了新窗口的大小。

消息循环和窗口过程不是并发运行的。当一个消息循环从其消息队列中接受一个消息,然后调用DispatchMessage将消息发送给窗口过程时,直到窗口过程将控制返回给Windows,DispatchMessage才能返回。

窗口过程必须是可重入的,也就是窗口过程能调用给窗口过程发送另一个消息的函数。


第三章出现重要函数
GetStockObject:获取一个图形对象,如刷子,画笔。
GetClientRect:获取窗口客户区的尺寸。
DrawText:显示文本串。
BeginPaint,EndPaint:只能用于WM_PAINT消息中,且成对使用。

结构:
MSG               消息结构
WNDCLASS          窗口类结构
PAINTSTRUCT       绘图结构
RECT              矩形结构

句柄:
HINSTANCE         实例句柄
HWND              窗口句柄
HDC               设备描述表句柄


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理