天天加油 - 助您成才
Win32编程基础知识
您正在看的经验技巧是:Win32编程基础知识。
Windows应用程序可以接收以各种形式输入的信息,这包括键盘、鼠标动作 、记时器产生的消息,也可以是其它应用程序发来的消息等等。Windows系统自动监控所有的输入设备,并将其消息放入该应用程序的消息队列中。

GetMessage()函数则是用来从应用程序的消息队列中按照先进先出的原则将这些消息一个个的取出来,放进一个MSG结构中去。GetMessage()函数原型如下:

BOOL GetMessage(

LPMSG lpMsg, //指向一个MSG结构的指针,用来保存消息

HWND hWnd, //指定哪个窗口的消息将被获取

UINT wMsgFilterMin, //指定获取的主消息值的最小值

UINT wMsgFilterMax //指定获取的主消息值的最大值

);

GetMessage()将获取的消息复制到一个MSG结构中。如果队列中没有任何消息,GetMessage()函数将一直空闲直到队列中又有消息时再返回。如果队列中已有消息,它将取出一个后返回。MSG结构包含了一条Windows消息的完整信息,其定义如下:

typedef struct tagMSG {

HWND hwnd; //接收消息的窗口句柄

UINT message; //主消息值

WPARAM wParam; //副消息值,其具体含义依赖于主消息值

LPARAM lParam; //副消息值,其具体含义依赖于主消息值

Dword time; //消息被投递的时间

POINT pt; //鼠标的位置

} MSG;

该结构中的主消息表明了消息的类型,例如是键盘消息还是鼠标消息等,副消息的含义则依赖于主消息值,例如:如果主消息是键盘消息,那么副消息中则存储了是键盘的哪个具体键的信息。

GetMessage()函数还可以过滤消息,它的第二个参数是用来指定从哪个窗口的消息队列中获取消息,其它窗口的消息将被过滤掉。如果该参数为NULL,则GetMessage()从该应用程序线程的所有窗口的消息队列中获取消息。

第三个和第四个参数是用来过滤MSG结构中主消息值的,主消息值在wMsgFilterMin和wMsgFilterMax之外的消息将被过滤掉。如果这两个参数为0,则表示接收所有消息。

当且仅当GetMessage()函数在获取到WM_QUIT消息后,将返回0值,于是程序退出消息循环。

TranslateMessage()函数的作用是把虚拟键消息转换到字符消息,以满足键盘输入的需要。DispatchMessage()函数所完成的工作是把当前的消息发送到对应的窗口过程中去。

开启消息循环其实是很简单的一个步骤,几乎所有的程序都是按照EasyWin的这个方法。你完全不必去深究这些函数的作用,只是简单的照抄就可以了。

消息处理函数

消息处理函数又叫窗口过程,在这个函数中,不同的消息将用switch语句分配到不同的处理程序中去。Windows的消息处理函数都有一个确定的样式,即这种函数的参数个数和类型以及其返回值的类型都有明确的规定。在VC的说明书中,消息处理函数的原型是这样定义的:

LRESULT CALLBACK WindowProc(

HWND hwnd, //接收消息窗口的句柄

UINT uMsg, //主消息值

WPARAM wParam, //副消息值

LPARAM lParam //副消息值

);

如果你的程序中还有其它的消息处理函数,也都必须按照上面的这个样式来定义,但函数名称可以随便取。EasyWin中的WinProc()函数就是这样一个典型的消息处理函数。

消息处理函数的四个参数是由GetMessage()函数从消息队列中获得MSG结构,然后分解后得到的。第二个参数uMsg和MSG结构中的message值是一致的,代表了主消息值。程序中用switch语句来将不同类型的消息分配到不同的处理程序中去。

WinProc()函数明确的处理了4个消息,分别是WM_KEYDOWN(击键消息)、WM_RBUTTONDOWN(鼠标右键按下消息)、WM_PAINT(窗口重画消息)、WM_DESTROY(销毁窗口消息)。

值得注意的是,应用程序发送到窗口的消息远远不止以上这几条,象WM_SIZE、WM_MINIMIZE、WM_CREATE、WM_MOVE等这样频频使用的消息就有几十条。为了减轻编程的负担,Windows的API提供了DefWindowProc()函数来处理这些最常用的消息,调用了这个函数后,这些消息将按照系统默认的方式得到处理。

因此,在switch_case语句中,只须明确的处理那些有必要进行特别响应的消息,把其余的消息交给DefWindowProc()函数来处理,是一种明智的选择,也是你必须做的一件事。

结束消息循环

当用户按Alt+F4或单击窗口右上角的退出按钮,系统就向应用程序发送一条WM_DESTROY的消息。在处理此消息时,调用了PostQuitMessage()函数,该函数会给窗口的消息队列中发送一条WM_QUIT的消息。在消息循环中,GetMessage()函数一旦检索到这条消息,就会返回FALSE,从而结束消息循环,随后,程序也结束。

小结

本章介绍的是Win32编程的基础知识,在进行DirectX编程之前,掌握它们是十分必要的。

通过本文的学习,你应该学到以下知识:

如何创建一个Win32应用程序工程

用RegisterClass()函数注册一个窗口类,再立即调用CreateWindow()函数创建一个窗口的实例

设置窗口的类型以及将一个消息处理函数与窗口联系上

用一固定的模式开

上一页  1 2 3 4 5 6 下一页

排行

  1. Windows Vista SP1截图曝光
  2. Windows Vista:透视未来桌面远景
  3. 不同:Windows Vista的关机组合快
  4. 如何恢复Windows Vista/XP双启动
  5. Vista系列技巧:Vista侧边栏安装
  6. Vista解惑之防火墙10个注意事项
  7. 官方谈Vista OEM盗版激活 承认破
  8. 仅需三分钟 便可轻松破解Vista登
  9. 浅述单核CPU跑Vista 占用率高的原
  10. Vista Areo界面全攻略
  11. 从1.01到Vista Windows启动画面图
  12. 新手不用慌:Vista官方驱动程序大
  13. 切勿病急乱投医Vista疑难杂症诊解
  14. 再谈WindowVista如何调整硬盘分区
  15. 找回WindowsVista系统自带的游戏
  16. 低配置电脑安装WindowsVista后优
  1. Winodws下Apache+PHP+MySQL的安装
  2. 快照 RegSnap
  3. HKEY_USER 根键(一)
  4. 20:8!超宽屏Vista截图抢鲜
  5. Vista服务优化攻略
  6. Windows Vista:透视未来桌面远景
  7. 不同:Windows Vista的关机组合快
  8. 如何恢复Windows Vista/XP双启动
  9. 用Vista工具箱手动优化WindowsVi
  10. Vista系列技巧:Vista下输入法的
  11. Vista系列技巧:Vista侧边栏安装
  12. 在Vista的多重启动中设置默认系统
  13. 高效管理时间 用好Vista系统日历
  14. Vista解惑之防火墙10个注意事项
  15. 官方谈Vista OEM盗版激活 承认破
  16. 轻松玩Vista!常用FTP工具兼容测
  1. Winodws下Apache+PHP+MySQL的安装
  2. 20:8!超宽屏Vista截图抢鲜
  3. Vista服务优化攻略
  4. 妙用Windows9x的Desktop.ini文件
  5. Windows Vista:透视未来桌面远景
  6. 不同:Windows Vista的关机组合快
  7. 如何恢复Windows Vista/XP双启动
  8. Vista系列技巧:常遇系统故障解决
  9. Vista系列技巧:Vista侧边栏安装
  10. Vista解惑之防火墙10个注意事项
  11. 官方谈Vista OEM盗版激活 承认破
  12. 仅需三分钟 便可轻松破解Vista登
  13. 浅述单核CPU跑Vista 占用率高的原
  14. Vista Areo界面全攻略
  15. 从1.01到Vista Windows启动画面图
  16. 新手不用慌:Vista官方驱动程序大

最近更新

  • 推荐阅读
  • 经验技巧《Win32编程基础知识》Win32编程基础知识
    关于我们 | 版权申明 | 广告服务 | 友情链接 | 网站地图 | 使用帮助 | ©2006-2008 TTADD.COM