上学期学习了Java ,感觉Java写一个窗口真心简单,很易上手,也就难怪很多开发人员选择Java作为自己的开发编程语言。但是由于自身对windows的热爱,让我觉得c、c++语言才是我亲睐的编程语言,虽然难度大些,但是这才能体现能力所在。其实之前一直想自学一下win32,但是由于时间的显示和种种原因而耽搁了,于是今年暑假决心深入学习win32。

在学习过程中呢,我会在此留下自己的学习心得,当做自己的笔记。初学者可以借鉴,高手可以多多指教,呵呵……

好了,今天开始做第一课的笔记吧:

学习Win32最好是对windows操作系统有较为深入的理解,这样才能学得深入、扎实。因此学习Win32的第一步就是了解windows

操作系统的消息机制,这个可是重中之重

首先上一张自己亲手绘制的图,能很清晰地表示windows消息机制的工作原理

也许你初次看到这张图,感觉密密麻麻的,不是很懂,别担心,我将逐步讲解:

(1)   数字1箭头:  表示windows(os)将消息传递到应用程序的消息队列中

(2)   数字2箭头:  表示应用程序通过消息循环在消息队列中读取消息

(3)   数字3箭头:  表示应用程序的消息循环将读取到的消息告诉给windows(os)

(4)   数字4箭头:  表示windows(os)通过应用程序传递的消息来调用应用程序绑定的回调函数(WndProc) , 根据回调函数 , 来确定是否做出响应

到这里,想必你能从本质上了解到windows的消息机制了吧

讲程序终究和代码脱不了关系,下面我借用一下P先生(Charles Petzold)的第一个例子(HelloWin.c),不过里面包含了我自己的东西,你一看就知道了:

  1. //windows程序的基础代码
  2. #include<windows.h>
  3. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//回调函数声明
  4. int WINAPI WinMain(HINSTANCE hInstance,     // 程序的当前实例句柄
  5. HINSTANCE hPrevInstance, // 程序的上一个实例句柄 , 在win32程序中 , 它始终是NULL
  6. PSTR szCmdLine,          // 命令行
  7. int iCmdShow)            // 窗口显示状态
  8. {
  9. static  TCHAR   szAppName[] = TEXT("HelloWin"); //以'\0'字符结尾的字符串 , 这里是程序的名称(实际用作后面的窗口类的名字)
  10. HWND            hwnd;                           //窗口句柄
  11. MSG             msg;                            //消息结构体
  12. WNDCLASS        wndclass;                       //窗口类
  13. wndclass.style          = CS_HREDRAW | CS_VREDRAW;              //窗口类的风格
  14. wndclass.lpfnWndProc    = WndProc;                              //窗口类绑定的回调函数(也称为窗口过程)
  15. wndclass.cbClsExtra     = 0;                                    //窗口类额外参数(默认为0)
  16. wndclass.cbWndExtra     = 0;//窗口类额外参数(默认为0)
  17. wndclass.hInstance      = hInstance;                            //程序的当前实例句柄 , 绑定到窗口类中
  18. wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);      //加载程序图标
  19. wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);          //加载光标
  20. wndclass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);  //背景刷
  21. wndclass.lpszMenuName   = NULL;                                 //菜单名指针
  22. wndclass.lpszClassName  = szAppName;                            //窗口类的名字
  23. if(!RegisterClass(&wndclass))//注册窗口类
  24. {
  25. MessageBox(NULL, TEXT("This program requires Windows NT!"),
  26. szAppName, MB_ICONERROR);
  27. return 0;
  28. }
  29. //这里创建的是一段内存 , 用于存储创建窗口的信息 , 同时返回该窗口的一个句柄(窗口的标示)
  30. hwnd = CreateWindow(szAppName,                  //窗口类的名字
  31. TEXT("The Hello Program"),  //窗口名称(标题栏显示的内容)
  32. WS_OVERLAPPEDWINDOW,        //窗口的风格
  33. CW_USEDEFAULT,              //窗口x坐标
  34. CW_USEDEFAULT,              //窗口y坐标
  35. CW_USEDEFAULT,              //窗口宽度
  36. CW_USEDEFAULT,              //窗口长度
  37. NULL,                       //父窗口句柄
  38. NULL,                       //菜单句柄
  39. hInstance,                  //程序的当前实例
  40. NULL);                      //窗口创建数据
  41. /* 程序运行完CreateWindow , 还没运行ShowWindow时 ,
  42. windows向窗口的WndProc发送了第一条消息: WM_Create */
  43. ShowWindow(hwnd, iCmdShow); //显示窗口
  44. UpdateWindow(hwnd);         //更新窗口
  45. /* 运行完UpdateWindow后 , windows向窗口的WndProc
  46. 发送了第二条消息: WM_PAINT . 如果ShowWindow没有调用或是调用失败 , WM_PAINT消息是不会发送的*/
  47. //消息循环
  48. while(GetMessage(&msg, NULL, 0, 0))//这里的NULL不能写成hwnd , 否则程序不能正常运行
  49. {
  50. TranslateMessage(&msg);//转换键盘消息
  51. DispatchMessage(&msg);//将消息传送给windows(os) , 由windows来回调
  52. }
  53. return msg.wParam;//结束返回
  54. }
  55. //窗口过程(回调函数)
  56. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  57. {
  58. HDC         hdc;    //设备句柄
  59. PAINTSTRUCT ps;     //包含窗口客户区绘制的信息  是一个结构体
  60. RECT        rect;   //矩形(两个点)
  61. //这里是消息处理
  62. switch(message)
  63. {
  64. //窗口创建消息
  65. case WM_CREATE:
  66. //PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;//播音
  67. return 0 ;
  68. //窗口客户区重绘消息
  69. case WM_PAINT:
  70. PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;//播音
  71. hdc = BeginPaint(hwnd, &ps);//获取设备句柄 , 开始重绘
  72. GetClientRect(hwnd, &rect);//获取客户区的大小
  73. DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect,
  74. DT_SINGLELINE | DT_CENTER | DT_VCENTER);//绘制一个字符串
  75. EndPaint(hwnd, &ps);//结束重绘
  76. return 0;
  77. //窗口退出消息
  78. case WM_DESTROY:
  79. PostQuitMessage(0);//发送退出消息
  80. return 0;
  81. }
  82. return DefWindowProc(hwnd, message, wParam, lParam);
  83. //windows对于消息的默认处理
  84. //(注意: 第三个和第四个参数不能传递错误!!!)
  85. }

没错,我逐行注释了,这样我觉得很好,对于掌握和理解是很有帮助的,ni不放试试……

好了,今天到此为止吧,下次继续了^_^

<Win32_1>深入浅出windows消息机制[转自crocodile_]的更多相关文章

  1. 我对windows消息机制的理解(参考深入浅出MFC,欢迎批评指正!!)

    以消息为基础,以事件驱动之 程序的进行依靠外部消息来驱动,即:程序不断等待任何可能的输入,然后做判断,然后再做适当的处理. 消息输入:操作系统捕获,以消息形式进入程序.(操作系统通过其USERS模块中 ...

  2. Windows消息机制

    Windows的消息系统是由3个部分组成的: · 消息队列.Windows能够为所有的应用程序维护一个消息队列.应用程序必须从消息队列中获取消息,然后分派给某个窗口.· 消息循环.通过这个循环机制应用 ...

  3. 深入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 ...

  4. 收藏:Windows消息机制

    百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视 ...

  5. 转:Windows消息机制要点

    Windows消息机制要点 1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ...

  6. windows消息机制(转)

    1. 引言Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛.Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序员不 ...

  7. 深入理解windows 消息机制

    深入理解Windows消息机制 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们需要打开一个文件时,我们可以调用fopen()函数,这个函数最后又会调用操作系统提供的函数以 ...

  8. windows消息机制框架原理【简单版本】

    windows消息机制框架原理 结合两张图理解 窗口和窗口类 Windows UI 应用程序 (e) 具有一个主线程 (g).一个或多个窗口 (a) 和一个或多个子线程 (k) [工作线程或 UI 线 ...

  9. windows消息机制(MFC)

    消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...

随机推荐

  1. adb 安装失败

    打开Terminal终端:Ctrl + Alt + T 按顺序执行以下三条命令:                   sudo add-apt-repository ppa:nilarrimogard ...

  2. mysql查看日志

    工具:mysqlbinlog, 在bin目录中日志在data目录中 日志过滤:mysqlbinlog mysql-bin.000011 | less mysqlbinlog mysql-bin.000 ...

  3. 010--VS2013 C++ 平面地图贴图

    先准备好地图的小图片: //全局变量HDC mdc;HBITMAP fullmap;const int rows = 8, cols = 8; //-------------------------- ...

  4. P3384: [Usaco2004 Nov]Apple Catching 接苹果

    一道DP题, f[i,j,k] 表示 第 k 时刻 由 1 位置 变换 j 次 到达 当前 i 棵树 注意也要维护 变换 0 次的情况. var i,j,k,t,w,now:longint; tree ...

  5. cocos中常用到的单例模式

    单例:即只有一个类对象,且提供全局的访问权限 特点: 1.构造函数私有 2.私有的静态成员指针,标识是否已产生了单例实例 3.提供一个getInstance()方法来获取单例对象 下面已打飞机中的子弹 ...

  6. 团队项目——特定功能NABC

    我们要做的项目是截屏软件,目前决定做电脑端的应用 我觉得这个软件应该具有随意截屏的功能,就是可以用鼠标拖动线条,只要形成闭合图形就可以将线条内的图像截取出来: NABC模型: N(Need): 许多人 ...

  7. Java实现 Base64、MD5、MAC、HMAC加密

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...

  8. 增强学习贪心算法与Softmax算法

    (一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...

  9. 对git的初步认识

    虽然经常听说博客,但是却是第一次用.就像,虽然经常见电脑,但是却第一次接触软件.对于git也是一样,从来没听过,更不了解. 因为自己私下也没有去过多的了解,所以对于git只有一些有关书面资料的很片面的 ...

  10. ExtJS登陆页面涉及到的几个问题

    1.如何在文本框中增加提示信息      输入框中无法直接使用tooltip,需要使用单独的代码 var tip = Ext.create('Ext.tip.ToolTip', { target : ...