第三章 窗口与消息
3.1 窗口的创建
用户对窗口的输入以‘消息’的形式传递给窗口,而窗口也借助消息来与其他窗口进行通信。例如当用户改变窗口的尺寸时,Windows便向应用程序发送一条携带新窗口尺寸相关的消息,接着应用程序对自身的内容进行调整以反映窗口尺寸的变化。应用程序所创建的每一个窗口都有一个与之相关联的窗口过程。这个窗口过程可以是应用程序中的某一个函数,也可以位于一个动态链接库中。窗口过程则依据这些消息做出相应的处理,然后就将控制权返还给Windows。
窗口过程用于处理传递给窗口的消息。通常这些消息用于将用户的鼠标或键盘输入通知给窗口。例如,当窗口尺寸被调整或窗口表面需要重绘时,也有相应的消息来通知窗口。
当Windows程序开始执行时,Windows首先为该程序创建一个“消息队列”。该消息队列中存放着应用程序可能创建的所有窗口消息。Windows应用程序中一般都包含一小段称为“消息循环”的代码,该代码用于从消息队列中检索消息,并将其分发给相应的窗口过程。其他消息则不经过消息队列直接直接发送给窗口过程。
所以windows系统是基于消息响应的。

3.1.2代码分析

#include<Windows.h>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口过程函数int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,//主函数PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT("HelloWin");HWND hwnd;  //声明一个窗口句柄MSG msg;    //声明一个消息结构体WNDCLASS wndclass;//声明一个窗口类wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass))//注册窗口函数,注册一个自定义的窗口{MessageBox(NULL, TEXT("This is program requires Windows NT"), szAppName, MB_ICONERROR);return 0;}hwnd = CreateWindowW(szAppName,TEXT("The Hello Programe"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,(LPVOID)NULL);
)   ShowWindow(hwnd, iCmdShow);//创建一个自定义的窗口,期间会产生一个WM_CREATE消息UpdateWindow(hwnd);//更新窗口,会产生一个WM_PAINT消息while (GetMessage(&msg,NULL,0,0))//从消息队列中获取消息{TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//窗口过程函数的定义
{HDC hdc;PAINTSTRUCT ps;//该结构体是用来装无效区域矩形的信息的RECT rect;switch (message){case WM_CREATE:return 0;break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);GetClientRect(hwnd, &rect);//获取客户区的大小DrawText(hdc, TEXT("Hello,VS2015"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);//在窗口输出“Hello,VS2015”EndPaint(hwnd, &ps);return 0;break;case WM_DESTROY:PostQuitMessage(0);//当程序关闭时,退出的消息用该函数处理return 0;break;default:break;}return DefWindowProc(hwnd, message, wParam, lParam);//当产生非上述所列的消息时,用这个函数来处理消息
}

我在上面这个程序设了几个断点观察程序的运行顺序。程序会从WinMain()函数进入,初始化好窗口类之后,程序会进行窗口注册,也就是运行到RegisterClass()函数。紧接着函数会进行CreateWindow(),此时会产生一个WM_CREATE消息,此时就会进入到窗口过程函数会进入到switch-case中的WM_CREATE,然后这时会运行到ShowWindow()函数,此时会显示出创建的窗口。接着往下运行到UpdateWindow(),此时窗口无效,会产生WM_PAINT消息,会让窗口过程处理这个消息,把文字显示到窗口上。运行到这里大概的过程就是这样了,程序会把消息从消息队列中取出来,然后由窗口过程处理消息。

Windows程序设计 读书笔记(3)相关推荐

  1. MFC Windows程序设计 读书笔记2

    Windows中负责图形输出的是Graphics Device Interface(图形设备接口),或称GDI.本节主要讲述CDC类和它的继承类,并介绍三种最常用的GDI基本元素,画笔.画刷.和字体, ...

  2. windows程序设计读书笔记一

    用VC MFC有一段时间了,总觉得还没掌握到精髓,项目代码基本是拼凑起来的.总是少点什么.前段时间,看完 快乐鹦鹉 的程序人生, 里面提到 全局变量 的一段.突然想到自己用 vc+opencv的一个小 ...

  3. windows程序设计读书笔记四

    前面的程序碰到刷新时碰到闪烁问题,百度一搜,一堆关于双缓冲解决闪烁的文章. 具体实施方案为: 1.建立一个内存DC hdcMem = CreateCompatibleDC(hdc); 此时,内存DC的 ...

  4. Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据

    Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 7.1 程序数据的命名 PL/SQL要求在给数据结构命名的时候应 ...

  5. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

    Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...

  6. PHP程序设计读书笔记七

    一.比较字符串: 1."=="和"==="的区别: "=="在比较之前会先把非字符串类型的操作数转换成字符串,所以"3" ...

  7. 电子数据取证Windows取证读书笔记

    电子数据取证第六章Windows取证读书笔记 其实Windows的取证可以依靠像美亚的取证大师这类取证软件来进行. 这类软件可以完成大多数的取证需要 用户目录: WindowsXP----Docume ...

  8. Windows程序设计学习笔记(1):一个简单的windows程序

    <Windows程序设计>(第五版)(美Charles Petzold著) 1 #include<windows.h> 2 3 LRESULT CALLBACK WndProc ...

  9. c语言程序设计读书笔记3000字,C语言程序设计读书笔记题目

    读书笔记注意事项: 1. 读书笔记要求至少有六个题目,在一类.二类.三类题目中各选两题,具体题目选择由学生自行选择. 2. 每个题目必须包含所选题目,以及具体题目的程序实现过程,要求每行语句后都需要有 ...

最新文章

  1. MVCWebForm对照学习:传值方式
  2. 两种高性能I/O设计模式(Reactor/Proactor)的比较
  3. mapping 详解1(mapping type)
  4. 8、JDBC入门整理
  5. 结语|日拱一卒无有尽,功不唐捐终入海
  6. Python中多线程和多处理的初学者指南
  7. source insight设置Courier new字体
  8. 维纳滤波python 函数_Wiener维纳滤波基本原理及其算法实现
  9. html5读取umd,UMD、CommonJS、ES Module、AMD、CMD模块的写法
  10. 大型网站技术架构-核心原理与案例分(李智慧 著)第1章-大型网站架构演化
  11. C/C++百题打卡[5/100]——合唱队形
  12. 如何优雅的美化kali,实现双桌面环境
  13. [Migrated]榜样
  14. 白话空间统计十九:热点分析(上)
  15. 嵌入式开发(S5PV210)——u-boot的头文件包含问题
  16. 论文重复查重会有影响吗?
  17. 物联网平台构架系列 (二):Amazon, Microsoft, IBM IoT 解决方案导论 之 设备
  18. 热烈庆祝华为在9月取得鸿蒙,余承东:明年华为智能手机全面支持鸿蒙系统
  19. C# 文件操作,查看所有的文件夹和文件
  20. MyBatis一:关于MyBatis及的搭建过程

热门文章

  1. 【毕业设计】基于单片机的手势识别系统 - 手势识别 单片机 物联网
  2. 【Java】Java中的==
  3. python写一个爬虫、爬取网站漫画信息_python爬取漫画
  4. 告诉你怎样选择虚拟主机!
  5. DGP 论文阅读笔记
  6. 互联网产品经理常用软件及工作平台 (转)
  7. Web前端开发的思考与经验----五年工作经验
  8. go-micro使用etcd作为注册中心
  9. VMware公司希望通过合作关系进一步提升业务态势
  10. java环境安装及java编译