Windows程序设计 读书笔记(3)
来源:互联网 发布:sai mac没压感 编辑:程序博客网 时间:2024/05/24 07:12
第三章 窗口与消息
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)
- Windows程序设计 读书笔记(3)
- windows程序设计读书笔记(3_1)
- windows程序设计读书笔记(1)
- windows程序设计读书笔记(2)
- Windows程序设计读书笔记(1)
- windows程序设计读书笔记----------(计时器)
- Windows程序设计 读书笔记(1)
- Windows程序设计 读书笔记(2)
- windows程序设计读书笔记(一)typ…
- 《Windows程序设计》读书笔记之一
- MFC Windows程序设计读书笔记
- Windows程序设计读书笔记-开始
- 《Windows程序设计》读书笔记之一
- windows程序设计 读书笔记一
- windows程序设计读书笔记--------资源
- 《Windows程序设计》读书笔记
- 《Windows程序设计》读书笔记
- win10 anacoda2 cuda theano安装笔记
- 1.1亿创业“红包” !“双11”创业节等你来打Call
- Python脚本分析CPU使用情况
- 细数2017年网络安全事件
- ZooKeeper示例 实时更新server列表
- Windows程序设计 读书笔记(3)
- 无人驾驶汽车系统入门(六)——基于传统计算机视觉的车道线检测(1)
- centos ftp 安装
- JavaWeb之 JSP:自定义标签
- 二分查找法
- Python之路【第3天】
- Android业务组件化之URL Scheme使用
- 炫龙毁灭者DDPro笔记本bios设置u盘启动教程
- mysql 5.5升级5.6以上版本