WinAPI入门
// 初始y int nWidth, // 窗口宽 int nHeight, // 窗口高 HWND hWndParent, // 父窗口句柄 HMENU hMenu, // 菜单句柄 HINSTANCE hInstance, // 实例句柄 LPVOID lpParam // 创建参数 ); 在 CreateWindow() 调用返回之后,Windows内部已经创建了这窗口。但是窗口并为显示,还需要两个调用,一个是 ShowWindow(hwnd, iCmdShow):第一个参数是刚刚创建的窗口 句柄,第二个参数是传递给WinMain的nCmdShow;另一个是 UpdateWindow(hwnd) ,导致 客户区域被绘制。 接下来,程序通过执行一块被称为“消息循环”的代码从消息队列中取出消息
消息循环以 GetMessage 开始,它从消息队列中取出一条消息,只要从消息队列中取出消息的 Message 域不为 WM_QUIT,GetMessage 就返回一个非零值,否则将导致程序退出 消息循环,然后程序中止,返回 msg 结构的 wParam 参数。在循环中,TranslateMessage 将 msg 结构的内容进行修改,而 DispatchMessage 找出准备调用的窗口过程。 上面进行的仅仅是准备性工作:注册窗口类、创建窗口、显示窗口、进入消息循环取出消息而实际的动作都发生在窗口过程中。
在程序中窗口过程通常是命名为 WndProc 的函数,其实窗口过程可以任意的命名,一个Windows程序可以包含多个窗口过程,一个窗口过程总是与调用了 RegisterClassEx 注册的 窗口类相关联,CreateWindow 函数根据窗口类来创建窗口,但是一个窗口类可以被用来创 建多个窗口。 消息收到之后,接下来应该根据消息的不同来进行处理
HelloWin程序只需要处理两条消息,即 WM_PAINT 和 WM_DESTROY。 WM_PAINT 消息在Windows程序中的地位极其重要,当窗口客户区的一部分或者全部变为“无效”,必须进行刷新的时候,将由这条消息通知程序。 为什么客户区域会变得无效呢?在创建窗口的时候,整个客户区都是无效的,因为还没有画任何的东西。第一条 WM_PAINT 消息指示窗口过程在窗口上面画一些东西;还有在用户改 变了窗口的大小之后,客户区域重新变得无效,除此之外最小化窗口之后再还原、窗口的一 部分被覆盖,都会引发这条消息。 WM_DESTROY消息则是当用户按下“关闭”按钮的时候被触发,标准的处理方法是调用PostQuitMessage 将一条 WM_QUIT 消息插入消息队列,这将使得 GetMessage 函数调用 返回0,从而退出消息循环,结束整个程序。 其实,从上面可以看出,Windows程序的这种运行机制并不是很难理解,真正困难的是不知道调用什么函数去完成想要的操作,以及怎样调用那些函数,从而灵活的进行底层API程序 开发,这是一个循序渐进的积累过程,没有捷径可走的。请各位一定要记住。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |