上学期学习了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. 说明一下JNI 与AIDL

    代码在评论中. JNI: 为什么需要JNI: 因为android是由[JAVA & C/C++]组成.Java运行在Dalvik虚拟机中. 没有办法直接访问底层硬件.底层HW相关目前技术一般都 ...

  2. hdu 5104 Primes Problem

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5104 Primes Problem Description Given a number n, ple ...

  3. Windows 10 IoT Core Samples

    Windows 10 IoT Core Samples Welcome to the Windows 10 IoT Core Samples These samples have been valid ...

  4. wpa_supplicant 使用

    (1)通过adb命令行,可以直接打开supplicant,从而运行wpa_cli,可以解决客户没有显示屏而无法操作WIFI的问题,还可以避免UI的问题带到driver.进一步来说,可以用在很多没有键盘 ...

  5. Go语言的类型转化

    Go语言要求不同的类型之间必须做显示的转换.转化分为类型转换和接口转化. 类型转换的思路是: X类型需要转换为Y类型,语法是T(x). 如果对于某些地方的优先级拿不准可以自己加()约束,变成(T)(X ...

  6. linux调整分区大小

    查看一下当前分区情况 1 2 3 4 5 6 7 8 [root@localhost ~]# df -h Filesystem            Size  Used Avail Use% Mou ...

  7. 推荐:一个个人开发者搞app赚钱之后的总结!有图有真相。

    2011年已经过去了,回顾2011有收获,更有许多不足.收获就是了却了一件人生大事(女儿出生),还有就是算入门了android并利用它开发 了一 款还算有些许收获的应用.不足的地方是单位工作上没有太好 ...

  8. R统计图

    主题:R统计图 作者:luomg 关键字:统计,R,ggplot2 1.什么是统计图? 统计图:统计图是从数据到几何对象的图形属性的一个映射 砖石重量对价格的散点图 qplot(carat,price ...

  9. 最近对python颇有兴趣

    因为最近租的房子到期了,于是在豆瓣小组找房子,萌生利用python爬虫去抓取小组的房源信息. 最近2个小玩意准备做一下,mark 一下 1.豆瓣租房小组Python爬虫抓取 2.51job 职位抓取

  10. JAVA内部类(转)

    源出处:JAVA内部类 在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部.内部类作为其外部类的一个成员,与其他成员一样, ...