<Win32_1>深入浅出windows消息机制

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


  

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

 

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


本文由BlueCoder编写   转载请说明出处:

http://blog.csdn.net/crocodile__/article/details/9417439



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值