WinAPI详解程序

#include <Windows.h>//窗口回调函数声明
//LRESULT表明函数返回值类型被宏定义为LONG
//CALLBACK说明的是函数蚕食的进栈顺序(从左到右)
//四个函数参数为message结构体中的前四个参数
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//windows程序入口函数,返回值为int
//WINAPI与CALLBACK作用相同,声明进栈顺序
//HINSTANCE定义执行实体(程序自身)句柄变量(句柄不是指针,句柄是一个数值)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR SZcMDlINE, INT iCmdShow)
{static TCHAR szAppName[] = TEXT("HelloWin");//定义窗口名称HWND hwnd;                                  //定义窗口句柄MSG msg;                                    //定义消息结构体变量WNDCLASS wndclass;                           //定义窗口类结构体变量//在WNDCLASS 结构中最重要的两个字段是第二个和最后一个//第二个字段(lpfnWndProc) 是依据这个类别来建立的所有窗口所使用的窗口消息处理程序的地址。在此程序中,这个是WndProc 函数。//最后一个字段是窗口类别的文字名称。程序写作者可以随意定义其名称。在只建立一个窗口的程序中,窗口类别名称通常设定为程序名称。wndclass.style = CS_HREDRAW | CS_VREDRAW;                     //设置窗口风格,CS_HREDRAW 为垂直重画 CS_VREDRAW为水平重画,如果你水平或竖直拖动窗口,他将重新显示窗口,即调用WM_PAINT消息! wndclass.lpfnWndProc = WndProc;                                  //将回调函数的首地址赋值给窗口类中的lpfnWndProc参数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;                                    //设置菜单,NULL表示此程序无菜单wndclass.lpszClassName = szAppName;                              //设置程序窗口名称if (!RegisterClass(&wndclass))                                    //向操作系统注册窗口类{//如果注册失败,弹出错误提示框,并就结束程序MessageBox(NULL, TEXT("程序注册失败"), szAppName, MB_ICONERROR);return 0;}//创建窗口hwnd = CreateWindow(szAppName,               //应用程序在操作系统注册表中的名称TEXT("Hello"),          //应用程序标题栏名称WS_OVERLAPPEDWINDOW, //窗口风格CW_USEDEFAULT,            //显示时窗口左上角相对于对于屏幕左上角x坐标CW_USEDEFAULT,           //显示时窗口左上角相对于对于屏幕左上角y坐标CW_USEDEFAULT,           //窗口宽度CW_USEDEFAULT,            //窗口高度NULL,                 //父窗口句柄,此程序没有父窗口NULL,                    //菜单句柄hInstance,                //程序实例句柄NULL);                  //创建参数指针//CreateWindow 传回被建立的窗口的句柄,该句柄存放在变量hwnd 中,后者被定义为HWND 型态(「窗口句柄型态」)。//Windows 中的每个窗口都有一个句柄,程序用句柄来使用窗口。许多Windows 函数需要使用hwnd 作为参数,这样,Windows 才能知道函数是针对哪个窗口的。//如果一个程序建立了许多窗口,则每个窗口均有一个句柄。窗口句柄是Windows 程序所处理最重要的句柄之一//在CreateWindow()之后,ShowWindow()之前,操作系统第一次调用回调函数WndProc//此处产生程序的第一个消息,WM_CREATE消息//显示窗口ShowWindow(hwnd, iCmdShow);//刷新窗口UpdateWindow(hwnd);//消息循环while (GetMessage(&msg, NULL, 0, 0))        //从程序消息队列中获取消息,第一个参数为MSG消息结构变量,Windows 用从消息队列中取出的下一个消息来填充消息结构的各个字段//第二、第三和第四个参数设定为NULL 或者0,表示程序接收它自己建立的所有窗口的所有消息。{TranslateMessage(&msg);                  //翻译键盘消息DispatchMessage(&msg);                  //将消息发送给操作系统,然后由操作系统调用WinProc函数}return msg.wParam;
}//窗口回调函数,由操作系统调用,只需要将函数的地址赋值给WNDCLASS中的lpfnWndProc参数即可
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc;           //定义设备内容句柄PAINTSTRUCT ps;       //定义绘图结构体变量RECT rect;           //定义矩形结构变量switch (message)//判断消息类型{case WM_CREATE://此消息是应用程序发送的第一个消息,在生命周期内只有一次,表示应用程序创建MessageBox(NULL, TEXT("触发WM_CREATE消息"), "HelloWin", MB_OK);return 0;case WM_PAINT://窗口重绘函数,将窗口重新绘制。当窗口显示区域的一部分显示内容或者全部变为「无效」,以致于必须「更新画面」时,将由这个消息通知程序。//开始绘制hdc = BeginPaint(hwnd, &ps);//获取窗口显示区域大小GetClientRect(hwnd, &rect);//在客户区绘制文字,内容为Hello WinDrawText(hdc, TEXT("Hello Win"), -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消息机制特点呢:主动激励,被动响应
所有的消息先传至操作系统,然后由操作系统分配至应用程序
给一个对象发消息等价于调用一个对象的函数
*/

关于Windows消息的相关知识:

消息能够被分为「队列化的」和「非队列化的」。队列化的消息是由Windows 放入程序消息队列中的。在程序的消息循环中,重新传回并分配给窗口消息处理程序。非队列化的消息在Windows 呼叫窗口时直接送给窗口消息处理程序。也就是说,队列化的消息被「发送」给消息队列,而非队列化的消息则「发送」给窗口消息处理程序。任何情况下,窗口消息处理程序都将获得窗口所有的消息--包括队列化的和非队列化的。窗口消息处理程序是窗口的「消息中心」。

队列化消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN 和WM_KEYUP 消息)、击键产生的字符
(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。队列化消息还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)。

非队列化消息则是其它消息。在许多情况下,非队列化消息来自呼叫特定的Windows 函数。例如,当WinMain呼叫CreateWindow 时,Windows 将建立窗口并在处理中给窗口消息处理程序发送一个WM_CREATE 消息。当WinMain 呼叫ShowWindow 时,Windows 将给窗口消息处理程序发送WM_SIZE 和WM_SHOWWINDOW 消息。当WinMain 呼叫UpdateWindow 时,Windows 将给窗口消息处理程序发送WM_PAINT 消息。键盘或鼠标输入时发出的队列化消息信号,也能在非队列化消息中出现。例如,用键盘或鼠标选择了一个菜单项时,键盘或鼠标消息就是队列化的,而说明菜单项已选中的WM_COMMAND 消息则可能就是非队列化的。这一过程显然很复杂,但幸运的是,其中的大部分是由Windows 解决的,不关我们的程序的事。从窗口消息处理程序的角度来看,这些消息是以一种有序的、同步的方式进出的。窗口消息处理程序可以处理它们,也可以不处理。

摘录于《Windows程序设计》

Windows程序设计之WinAPI详解程序相关推荐

  1. windows USB读卡器驱动详解

    目标 在windows 2000及以上版本的操作系统中,开发usb读卡器驱动.实现数据批量传输功能,同时需要根据特定的协议(协议可自定义)进行通信.实现一个基于此usb驱动的动态库(统一接口),供上层 ...

  2. C# Windows 窗体编程入门详解

    C# Windows 窗体编程入门详解 基于Web的B/S架构应用程序近年来确实非常流行,B/S易于部署.易于维护的特点使Web应用程序开发得到了前所未有的发展.但是,Web应用程序的缺点是,它们有时 ...

  3. Windows 7防火墙设置详解(三)

    Windows 7防火墙设置详解(三) 一.如何禁用或启用规则 方法:只需要在需要禁用或启动的规则上,鼠标右键选择启用或禁止规则即可,或点击右侧的操作栏进行规则启用或禁止. 二.入站规则和出站规则 由 ...

  4. 15、Windows驱动开发技术详解笔记(11) 基本概念

    9.Windows驱动程序的入口函数规定为_DriverEntry@8,所以用C++编写时要用extern. 驱动程序中,不能使用编译器运行时函数,甚至C语言中的malloc,C++的new函数都不能 ...

  5. mfc编程vc6.0实现进程的创建和通信_免费送书:windows黑客编程技术详解

    01 书怎么送 点赞并留言,关注在下面的公众号后台回复「抽奖」,弹出小程序后点击参与. 开奖时间是 7 月 7 号 20:00 ,一定要留意微信消息,如果你中奖了,请尽快在中奖页面提交收件人信息并备注 ...

  6. Windows WMIC命令使用详解

    Windows WMIC命令使用详解 第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符.在WMIC命令行提示符上,命令以交互的方式执行. 执行"w ...

  7. 《Windows驱动开发技术详解》学习笔记

    Abstract   如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...

  8. Windows 7防火墙设置详解(一)

    Windows 7防火墙设置详解(一) 本文介绍Windows 7防火墙的设置方法,自从Vista开始,Windows的防火墙功能已经是越加臻于完善.今非昔比了,系统防火墙已经成为系统的一个不可或缺的 ...

  9. c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]

    Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...

  10. linux 访问windows 端口,Linux和Windows下查看端口详解

    Linux和Windows下查看端口详解 我们常会在计算机上安装很多软件,如果喜欢冲浪的话,必然就会用的软件的通信,当然包括web开发的,应用多了,难免会要不小心占用端口的问题,这时候用命令来处理是最 ...

最新文章

  1. 【CTSC2017】【BZOJ4903】吉夫特 卢卡斯定理 DP
  2. 《巴伦周刊》评选出全球最佳30位CEO:马化腾再次上榜
  3. linux卸载tar安装的erlang包,linux - 从tar安装erlang导致错误,想知道如何指定文件夹 - 堆栈内存溢出...
  4. 一次性掌握机器学习基础知识脉络
  5. 【运动学】基于matlab Singer模型算法机动目标跟踪【含Matlab源码 1157期】
  6. 8首次登陆与线上求助
  7. python线程池如何调度,python线程池控制
  8. Unity,Socket发送消息字符串问题
  9. 【杂项】vmware fusion 流畅度设置
  10. 如果iis的配置文件 applicationHost.config坏掉了, 会在 C:\inetpub\history\ 中存储历史备份。复制过去还原就可以了-摘自网络...
  11. C# Excel插入Object
  12. AndroidStudio:The number of method references in a .dex file cannot exceed 64K错误
  13. Swagger报错:missed comma between flow collection entries
  14. 恋爱纪念日(日期问题)
  15. 微信又双叒更新了!这次的隐藏功能,又一大型集体游街示众的 “社死“ 现场......!
  16. 线性系统粗浅认识——第七次作业
  17. rknn3399pro 2小时入门指南(八)详细教程指导你一步到位训练得到yolov3 rknn模型
  18. 如何备份整个硬盘为镜像文件?
  19. 算法设计与分析—分支限界法应用(头歌实验)
  20. 2.数据类型--数值类型

热门文章

  1. 金蝶K3案例教程库存报表
  2. AutoCad二次开发-插入DWG参照 Teigha库
  3. HTML+CSS+JavaScript七夕情人节表白网页【樱花雨3D相册】超好看
  4. 小米手机的专用计算机连接软件,详细教您小米手机怎么连接电脑
  5. Trime同文输入法
  6. php扩展 ioncube组件的安装方法_安装IonCube Loader扩展方法
  7. 如何选择安全可靠的即时通讯软件
  8. 平均值绝对偏差最大c语言,请教平均值和最大偏差值得使用
  9. 江苏长江水位告警 南京明城墙再现“龙吐水”
  10. 从HTTP的安全问题到HTTPS