<Win32_1>深入浅出windows消息机制[转自crocodile_]
上学期学习了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),不过里面包含了我自己的东西,你一看就知道了:
- //windows程序的基础代码
- #include<windows.h>
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//回调函数声明
- int WINAPI WinMain(HINSTANCE hInstance, // 程序的当前实例句柄
- HINSTANCE hPrevInstance, // 程序的上一个实例句柄 , 在win32程序中 , 它始终是NULL
- PSTR szCmdLine, // 命令行
- int iCmdShow) // 窗口显示状态
- {
- static TCHAR szAppName[] = TEXT("HelloWin"); //以'\0'字符结尾的字符串 , 这里是程序的名称(实际用作后面的窗口类的名字)
- HWND hwnd; //窗口句柄
- MSG msg; //消息结构体
- WNDCLASS wndclass; //窗口类
- wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口类的风格
- wndclass.lpfnWndProc = WndProc; //窗口类绑定的回调函数(也称为窗口过程)
- wndclass.cbClsExtra = 0; //窗口类额外参数(默认为0)
- wndclass.cbWndExtra = 0;//窗口类额外参数(默认为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 program requires Windows NT!"),
- szAppName, MB_ICONERROR);
- return 0;
- }
- //这里创建的是一段内存 , 用于存储创建窗口的信息 , 同时返回该窗口的一个句柄(窗口的标示)
- hwnd = CreateWindow(szAppName, //窗口类的名字
- TEXT("The Hello Program"), //窗口名称(标题栏显示的内容)
- WS_OVERLAPPEDWINDOW, //窗口的风格
- CW_USEDEFAULT, //窗口x坐标
- CW_USEDEFAULT, //窗口y坐标
- CW_USEDEFAULT, //窗口宽度
- CW_USEDEFAULT, //窗口长度
- NULL, //父窗口句柄
- NULL, //菜单句柄
- hInstance, //程序的当前实例
- NULL); //窗口创建数据
- /* 程序运行完CreateWindow , 还没运行ShowWindow时 ,
- windows向窗口的WndProc发送了第一条消息: WM_Create */
- ShowWindow(hwnd, iCmdShow); //显示窗口
- UpdateWindow(hwnd); //更新窗口
- /* 运行完UpdateWindow后 , windows向窗口的WndProc
- 发送了第二条消息: WM_PAINT . 如果ShowWindow没有调用或是调用失败 , WM_PAINT消息是不会发送的*/
- //消息循环
- while(GetMessage(&msg, NULL, 0, 0))//这里的NULL不能写成hwnd , 否则程序不能正常运行
- {
- TranslateMessage(&msg);//转换键盘消息
- DispatchMessage(&msg);//将消息传送给windows(os) , 由windows来回调
- }
- 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:
- //PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;//播音
- return 0 ;
- //窗口客户区重绘消息
- case WM_PAINT:
- PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;//播音
- hdc = BeginPaint(hwnd, &ps);//获取设备句柄 , 开始重绘
- GetClientRect(hwnd, &rect);//获取客户区的大小
- DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect,
- DT_SINGLELINE | DT_CENTER | DT_VCENTER);//绘制一个字符串
- EndPaint(hwnd, &ps);//结束重绘
- return 0;
- //窗口退出消息
- case WM_DESTROY:
- PostQuitMessage(0);//发送退出消息
- return 0;
- }
- return DefWindowProc(hwnd, message, wParam, lParam);
- //windows对于消息的默认处理
- //(注意: 第三个和第四个参数不能传递错误!!!)
- }
没错,我逐行注释了,这样我觉得很好,对于掌握和理解是很有帮助的,ni不放试试……
好了,今天到此为止吧,下次继续了^_^
<Win32_1>深入浅出windows消息机制[转自crocodile_]的更多相关文章
- 我对windows消息机制的理解(参考深入浅出MFC,欢迎批评指正!!)
以消息为基础,以事件驱动之 程序的进行依靠外部消息来驱动,即:程序不断等待任何可能的输入,然后做判断,然后再做适当的处理. 消息输入:操作系统捕获,以消息形式进入程序.(操作系统通过其USERS模块中 ...
- Windows消息机制
Windows的消息系统是由3个部分组成的: · 消息队列.Windows能够为所有的应用程序维护一个消息队列.应用程序必须从消息队列中获取消息,然后分派给某个窗口.· 消息循环.通过这个循环机制应用 ...
- 深入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 ...
- 收藏:Windows消息机制
百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视 ...
- 转:Windows消息机制要点
Windows消息机制要点 1. 窗口过程 每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ...
- windows消息机制(转)
1. 引言Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛.Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序员不 ...
- 深入理解windows 消息机制
深入理解Windows消息机制 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们需要打开一个文件时,我们可以调用fopen()函数,这个函数最后又会调用操作系统提供的函数以 ...
- windows消息机制框架原理【简单版本】
windows消息机制框架原理 结合两张图理解 窗口和窗口类 Windows UI 应用程序 (e) 具有一个主线程 (g).一个或多个窗口 (a) 和一个或多个子线程 (k) [工作线程或 UI 线 ...
- windows消息机制(MFC)
消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...
随机推荐
- SecurityManager一:理解AccessController.doPrivileged()
AccessController.checkPermission()检测模型: 从VM Stack的current stack frame起逐个检测stack frome所指class的protect ...
- ExtJS MVC学习手记
开始学习ExtJS的MVC了.这篇文章仅是用来做一个目录,为自己这个阶段的学习内容做个索引. 手记涉及的文章: EXTJS MVC结构(译自ExtJS4.0文档中的<MVC Architectu ...
- C++ STL中Map的按Key排序和按Value排序
map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...
- c++ _beginthread
c++多线程编程 #include <windows.h> #include <process.h> /* _beginthread, _endthread */ #inclu ...
- Leetcode Variant-Plus N
Given a non-negative number represented as an array of digits, plus N to the number. The digits are ...
- 团队开发——第一篇scrum报告
一.角色介绍 产品负责人(兼项目经理PM):王雪青 scrum master: 陆宇 开发团队:赵建松.张文冬.徐擎天 二.product backlog 1.买家登录后,显示各个小吃摊的信息,主要是 ...
- ASP.Net MVC利用NPOI导入导出Excel
因近期项目遇到所以记录一下: 首先导出Excel: 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// <s ...
- LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- Vim配置文件(Vimrc)
嘛……后面的比赛基本都是在NOI Linux下进行了,windows下的开发环境基本都不能用了>_>果断转了vim,记录一下vim的配置文件- set nu syntax on filet ...
- mingw fbx sdk /浮点数精度
接下来要做一个linux下的程序了. 下载linux version fbx sdk tar zxvf ...gz 按照安装说明 提升权限并没什么用 还是,cannot execute bin ...