快速业务通道

WinAPI入门

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
       // 初始y
   int nWidth,          // 窗口宽
   int nHeight,         // 窗口高
   HWND hWndParent,     // 父窗口句柄
   HMENU hMenu,       // 菜单句柄
   HINSTANCE hInstance,   // 实例句柄
   LPVOID lpParam       // 创建参数
);

在 CreateWindow() 调用返回之后,Windows内部已经创建了这窗口。但是窗口并为显示,还需要两个调用,一个是 ShowWindow(hwnd, iCmdShow):第一个参数是刚刚创建的窗口 句柄,第二个参数是传递给WinMain的nCmdShow;另一个是 UpdateWindow(hwnd) ,导致

客户区域被绘制。

接下来,程序通过执行一块被称为“消息循环”的代码从消息队列中取出消息

while (GetMessage(&msg, NULL, 0, 0))
{
   if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
   {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
   }
}

消息循环以 GetMessage 开始,它从消息队列中取出一条消息,只要从消息队列中取出消息的 Message 域不为 WM_QUIT,GetMessage 就返回一个非零值,否则将导致程序退出 消息循环,然后程序中止,返回 msg 结构的 wParam 参数。在循环中,TranslateMessage 将 msg 结构的内容进行修改,而 DispatchMessage 找出准备调用的窗口过程。

上面进行的仅仅是准备性工作:注册窗口类、创建窗口、显示窗口、进入消息循环取出消息而实际的动作都发生在窗口过程中。

LRESULT CALLBACK WndProc(HWND hWnd, //刚刚创建的窗口句柄
   UINT message,           //得到的消息
   WPARAM wParam,
   LPARAM lParam           //消息的进一步详细的参数
)

在程序中窗口过程通常是命名为 WndProc 的函数,其实窗口过程可以任意的命名,一个Windows程序可以包含多个窗口过程,一个窗口过程总是与调用了 RegisterClassEx 注册的 窗口类相关联,CreateWindow 函数根据窗口类来创建窗口,但是一个窗口类可以被用来创 建多个窗口。

消息收到之后,接下来应该根据消息的不同来进行处理

switch(message)
{
  case …:
  …
  …

HelloWin程序只需要处理两条消息,即 WM_PAINT 和 WM_DESTROY。

WM_PAINT 消息在Windows程序中的地位极其重要,当窗口客户区的一部分或者全部变为“无效”,必须进行刷新的时候,将由这条消息通知程序。

为什么客户区域会变得无效呢?在创建窗口的时候,整个客户区都是无效的,因为还没有画任何的东西。第一条 WM_PAINT 消息指示窗口过程在窗口上面画一些东西;还有在用户改 变了窗口的大小之后,客户区域重新变得无效,除此之外最小化窗口之后再还原、窗口的一 部分被覆盖,都会引发这条消息。

WM_DESTROY消息则是当用户按下“关闭”按钮的时候被触发,标准的处理方法是调用PostQuitMessage 将一条 WM_QUIT 消息插入消息队列,这将使得 GetMessage 函数调用 返回0,从而退出消息循环,结束整个程序。

其实,从上面可以看出,Windows程序的这种运行机制并不是很难理解,真正困难的是不知道调用什么函数去完成想要的操作,以及怎样调用那些函数,从而灵活的进行底层API程序 开发,这是一个循序渐进的积累过程,没有捷径可走的。请各位一定要记住。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号