1、消息

    消息是由MSG结构体来表示的。如下:

  1. typedef struct tagMSG {
  2. HWND hwnd;
  3. UINT message;
  4. WPARAM wParam;
  5. LPARAM lParam;
  6. DWORD time;
  7. POINT pt;
  8. } MSG

2、WinMain函数的定义

WinMain函数的原型声明如下:

  1. int WINAPI WinMain(
  2. HINSTANCE hInstance, // handle to current instance
  3. HINSTANCE hPrevInstance, // handle to previous instance
  4. LPSTR lpCmdLine, // command line
  5. int nCmdShow // show state
  6. );

3、窗口的创建:设计一个窗口类、注册窗口类、创建窗口、显示及更新窗口。

设计一个窗口:WNDCLASS结构体的定义如下:

  1. typedef struct _WNDCLASS {
  2. UINT style;
  3. WNDPROC lpfnWndProc;
  4. int cbClsExtra;
  5. int cbWndExtra;
  6. HINSTANCE hInstance;
  7. HICON hIcon;
  8. HCURSOR hCursor;
  9. HBRUSH hbrBackground;
  10. LPCTSTR lpszMenuName;
  11. LPCTSTR lpszClassName;
  12. } WNDCLASS;

注册窗口类:注册函数的原型声明如下:

  1. ATOM RegisterClass(
  2. CONST WNDCLASS *lpWndClass // class data
  3. );

创建窗口:CreateWindow函数的原型声明如下:

  1. HWND CreateWindow(
  2. LPCTSTR lpClassName, // registered class name
  3. LPCTSTR lpWindowName, // window name
  4. DWORD dwStyle, // window style
  5. int x, // horizontal position of window
  6. int y, // vertical position of window
  7. int nWidth, // window width
  8. int nHeight, // window height
  9. HWND hWndParent, // handle to parent or owner window
  10. HMENU hMenu, // menu handle or child identifier
  11. HINSTANCE hInstance, // handle to application instance
  12. LPVOID lpParam // window-creation data
  13. );

更新及更新窗口:显示窗口ShowWindow函数的原型声明如下:

  1. BOOL ShowWindow(
  2. HWND hWnd, // handle to window
  3. int nCmdShow // show state
  4. );

更新及更新窗口:更新窗口UpdateWindow函数的原型声明如下:

  1. BOOL UpdateWindow(HWND hWnd);

4、消息循环:不断从消息队列中取出消息,并进行响应。

  1. BOOL GetMessage(
  2. LPMSG lpMsg, // message information
  3. HWND hWnd, // handle to window
  4. UINT wMsgFilterMin, // first message
  5. UINT wMsgFilterMax // last message
  6. );

Windows应用程序消息处理机制如下图所示:

  

  1. 操作系统接收到应用程序的窗口消息,将消息投递到应用程序的消息队列中。

  2. 应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。

  3. 应用程序调用DispatchMessage,将消息回传给操作系统。消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函数总能进行正确的传递。

  4. 系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。

5、编写窗口过程函数:窗口过程函数的声明形式如下:

  1. LRESULT CALLBACK WindowProc(
  2. HWND hwnd, // handle to window
  3. UINT uMsg, // message identifier
  4. WPARAM wParam, // first message parameter
  5. LPARAM lParam // second message parameter
  6. );
提示:系统通过窗口过程函数的地址(指针)来调用窗口过程函数,而不是名字。 
 
 
例:WinMain.cpp
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. LRESULT CALLBACK WinSunProc(
  5.                 HWND hwnd, // handle to window
  6.                 UINT uMsg, // message identifier
  7.                 WPARAM wParam, // first message parameter
  8.                 LPARAM lParam // second message parameter
  9.                 );
  10.  
  11. int WINAPI WinMain(
  12.           HINSTANCE hInstance, // handle to current instance
  13.           HINSTANCE hPrevInstance, // handle to previous instance
  14.           LPSTR lpCmdLine, // command line
  15.           int nCmdShow // show state
  16.            )
  17. {
  18. WNDCLASS wndcls;
  19. wndcls.cbClsExtra=;
  20. wndcls.cbWndExtra=;
  21. wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
  22. wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
  23. wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
  24. wndcls.hInstance=hInstance;
  25. wndcls.lpfnWndProc=WinSunProc;
  26. wndcls.lpszClassName="bedrock32";
  27. wndcls.lpszMenuName=NULL;
  28. wndcls.style=CS_HREDRAW | CS_VREDRAW;
  29. RegisterClass(&wndcls);
  30.  
  31. HWND hwnd;
  32. hwnd=CreateWindow("bedrock32","http://www.cnblogs.com/bedrock32",WS_OVERLAPPEDWINDOW,
  33. ,,,,NULL,NULL,hInstance,NULL);
  34.  
  35. ShowWindow(hwnd,SW_SHOWNORMAL);
  36. UpdateWindow(hwnd);
  37.  
  38. MSG msg;
  39. while(GetMessage(&msg,NULL,,))
  40. {
  41. TranslateMessage(&msg);
  42. DispatchMessage(&msg);
  43. }
  44. return msg.wParam;
  45. }
  46.  
  47. LRESULT CALLBACK WinSunProc(
  48.                 HWND hwnd, // handle to window
  49.                 UINT uMsg, // message identifier
  50.                 WPARAM wParam, // first message parameter
  51.                 LPARAM lParam // second message parameter
  52.                 )
  53. {
  54. switch(uMsg)
  55. {
  56. case WM_CHAR:
  57. char szChar[];
  58. sprintf(szChar,"char code is %d",wParam);
  59. MessageBox(hwnd,szChar,"char",);
  60. break;
  61. case WM_LBUTTONDOWN:
  62. MessageBox(hwnd,"mouse clicked","message",);
  63. HDC hdc;
  64. hdc=GetDC(hwnd);
  65. TextOut(hdc,,,"我是高手",strlen("我是高手"));
  66. //ReleaseDC(hwnd,hdc);
  67. break;
  68. case WM_PAINT:
  69. HDC hDC;
  70. PAINTSTRUCT ps;
  71. hDC=BeginPaint(hwnd,&ps);
  72. TextOut(hDC,,,"http://www.cnblogs.com/bedrock32",strlen("http://www.cnblogs.com/bedrock32"));
  73. EndPaint(hwnd,&ps);
  74. break;
  75. case WM_CLOSE:
  76. if(IDYES==MessageBox(hwnd,"是否真的结束?","message",MB_YESNO))
  77. {
  78. DestroyWindow(hwnd);
  79. }
  80. break;
  81. case WM_DESTROY:
  82. PostQuitMessage();
  83. break;
  84. default:
  85. return DefWindowProc(hwnd,uMsg,wParam,lParam);
  86. }
  87. return ;
  88. }

Windows程序消息机制浅析的更多相关文章

  1. windows程序消息机制(Winform界面更新有关)

    windows程序消息机制(Winform界面更新有关) 转自:http://www.cnblogs.com/blosaa/archive/2013/05/31/3109586.html 1. Win ...

  2. windows程序消息机制(Winform界面更新有关)--转

    1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队 ...

  3. Windows 消息机制浅析

    1.       Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以,我的介绍性开场白通常会以一段历 ...

  4. GDI及Windows的消息机制

    什么是GDI? GDI, Graphics Device Interface GDI在以下位置已经被微软列为Legacy Graphics,不建议使用来开发应用程序(http://msdn.micro ...

  5. 【笨嘴拙舌WINDOWS】消息机制

    如果将WINDOWS比做一个人,那么他就是为你提供各种服务的巫师,他手上有各式各样,奇形怪状的奇葩物品.他脑子充满了智慧,能够为你解决你所不能解决的疑难杂症.但是他不认识你! 你从小立志要想考状元,去 ...

  6. C#中的WinForm的消息机制简述,及消息机制下Invoke,和BeginInvoke的使用和区别

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么Control类提供了Invoke和Begin ...

  7. 基础篇-Windows消息机制

    1在介绍Windows 消息运行机制之前,首先介绍一下消息的概念: 消息(Message)指的就是Windows 操作系统发给应用程序的一个通告[5],它告诉应用程序某个特定的事件发生了.比如,用户单 ...

  8. <Win32_1>深入浅出windows消息机制[转自crocodile_]

    上学期学习了Java ,感觉Java写一个窗口真心简单,很易上手,也就难怪很多开发人员选择Java作为自己的开发编程语言.但是由于自身对windows的热爱,让我觉得c.c++语言才是我亲睐的编程语言 ...

  9. 深入Delphi -- Windows 消息机制

    http://www.txsz.net/xs/delphi/3/Windows%20%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.htm Windows 消息机制 by m ...

随机推荐

  1. JavaScript之动画3

    给一个div添加颜色,使其产生渐变效果,我们设置index为变量,使用setInterval函数方法改变rgb颜色值. window.onload = function(){ var boxDom = ...

  2. ubuntu上部署github博客,利用hexo

    安装Node.js三种安装方法,前两种是我安装过的,后一种是 Google 到的. #####①:apt-get 安装在 终端 输入 nodejs 或者 npm ,如果没有安装会提示你进行安装,命令如 ...

  3. C#读写日志文本文件

    日志为文本文件每列以制表符隔开 行以换行符隔开 本次示例简单实现如下相关功能:1.正写日志文本 最新的日志放后面2.倒写日志文本 最新的日志放前面3.读日志文本内容显示在Label4.读日志文本内容到 ...

  4. linux 环境变量的设置【转】

    现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以java环境变量为例介绍三种配置环境变量的方法. 1.修改/etc/profile文件 如果你的计算机仅仅作为开 ...

  5. javascript之面向对象程序设计(对象和继承)

    总结的文章略长,慎点. 知识点预热 引用类型:引用类型的值(对象)是引用类型的一个实例.在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起.在其他面向对象语言中被称为类,虽然 ...

  6. MYSQL基础01(新增,修改,删除)

    首先说明一下,本人之前一直都是用MSSQL,由于工作原因,每天写上百条sql语句,并持续了几年;由于换了工作目前主要接触的MYSQL;所以现在开始学习MYSQL. 我的学习计划很简单,我在MSSQL使 ...

  7. C++ 重载new和delete操作符

    原因: C++标准库提供的new和delete操作符,是一个通用实现,未针对具体对象做具体分析 存在分配器速度慢.小型对象空间浪费严重等问题,不适用于对效率和内存有限制的应用场景   好处: 灵活的内 ...

  8. Linux美化——终端提示符

    1. PS1变量简介[1] PS1是Linux终端用户的一个环境变量,用来说明命令行提示符的设置. 可以使用 man bash命令查看bash手册,找到该变量支持的特殊字符,以及这些特殊字符的意义: ...

  9. yaf运行错误:Class 'Yaf_Application' not found

    提示:致命错误 Yaf_Application 基类没有加载进去 一检查:phpinfo() 里yaf 扩展有没有安装上 扩展也安装进去了 这时在分布式配置文件的重写 也是正确 这时百思不得其解,没办 ...

  10. Java Web动态配置log4j

    导入log4j的jar包, 在web.xml中做如下配置 <!-- Log4j Configuration --> <context-param> <param-name ...