基本概念

SDK

软件开发工具包(Software Development Kit),一般都是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。

API

Windows操作系统提供给应用程序编程的接口(Application Programming Interface)。

Windows应用程序API函数是通过C语言实现的,所有主要的 Windows 函数都在 Windows.h 头文件中进行了声明。Windows 操作系统提供了 1000 多种 API函数。

窗口和句柄

窗口是屏幕上的一块矩形区域,是 Windows 应用程序与用户进行交互的接口。利用窗口可以接收用户的输入、以及显示输出。

在 Windows 应用程序中, 窗口是通过窗口句柄( HWND) 来标识的。

句柄( HANDLE) 是 Windows 程序中一个重要的概念, 在 Windows 程序中, 有各种各样的资源( 窗口、 图标、光标,画刷等), 系统在创建这些资源时会为它们分配内存, 并返回标识这些资源的标识号, 即句柄。 

消息和消息队列

Windows 程序设计是一种完全不同于传统的 DOS 方式的程序设计方法。它是一种事件驱动方式的程序设计模式,主要是基于消息的。

每一个 Windows 应用程序开始执行后, 系统都会为该程序创建一个消息队列, 这个消息队列用来存放该程序创建的窗口的消息。
例如,当用户在窗口中画图的时候,按下鼠标左键,此时,操作系统会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,等待应用程序的处理。

然后应用程序通过一个消息循环不断地从消息队列中取出消息,并进行响应。

在这个处理过程中,操作系统也会给应用程序“ 发送消息”。所谓“ 发送消息”,实际上是操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程。

WinMain函数

当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数( 实际是由插入到可执行文件中的启动代码调用的)。

WinMain是Windows程序的入口点函数,与DOS程序的入口点函数main的作用相同,当WinMain 函数结束或返回时,Windows应用程序结束。

Windows 编程模型

一个完整的Win32程序(#include <windows.h>),该程序实现的功能是创建一个窗口,并在该窗口中响应键盘及鼠标消息,程序的实现步骤为:

  1. WinMain函数的定义
  2. 创建一个窗口
  3. 进行消息循环
  4. 编写窗口过程函数

项目的创建

#include <windows.h>//6.处理窗口过程
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)//消息所属窗口句柄,具体消息名称,键盘附件消息,鼠标附加消息
{switch (uMsg){case WM_CLOSE://所有xxxWindow为结尾的方法 ,都不会进入到消息队列中,而是直接执行DestroyWindow(hwnd); //DestroyWindow 发送另一个消息 WM_DESTROYbreak;case  WM_DESTROY:PostQuitMessage(0);break;case WM_LBUTTONDOWN: //鼠标左键按下{int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);char buf[1024];wsprintf(buf, TEXT("x = %d,y = %d"), xPos, yPos);MessageBox(hwnd, buf, TEXT("鼠标左键按下"), MB_OK);break;}case WM_KEYDOWN: //键盘MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);break;case WM_PAINT: //绘图{PAINTSTRUCT ps; //绘图结构体HDC hdc = BeginPaint(hwnd, &ps);TextOut(hdc, 100, 100, TEXT("Hello world"), strlen("Hello world"));EndPaint(hwnd, &ps);}break;}return DefWindowProc(hwnd,uMsg,wParam,lParam);
}//WINAPI代表__stdcall 参数传递顺序:从右到左,由此入栈,并且在函数返回前 清空堆栈
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)//应用程序实例句柄;上一个应用程序句柄,在Win32情况下,参数一般为NULL,不起作用;vhar * argv[];显示命令,最大化,最小化,正常
{//1.设计窗口//2.注册窗口//3.创建窗口//4.显示和更新//5.通过循环取消息//6.窗口过程//1.设计窗口WNDCLASS wc;wc.cbClsExtra = 0;//不要额外内存wc.cbWndExtra = 0;//不要窗口额外内春wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wc.hCursor = LoadCursor(NULL,IDC_HAND);//如果第一个为NULL,使用默认的wc.hIcon = LoadIcon(NULL, IDI_ERROR);wc.hInstance = hInstance;//应用程序实例句柄,传入WinMain中的形参即可wc.lpfnWndProc=WindowProc; //回调函数,窗口过程wc.lpszClassName = TEXT("Win");wc.lpszMenuName = NULL;wc.style = 0;//2.注册窗口RegisterClass(&wc);//3.创建窗口/*lpClassName,类名lpWindowName,标题名dwStyle,WS_OVERLAPPEDWINDOWx, y,显示坐标CW_USEDEFAULTnWidth, nHeight, 宽高hWndParent, 父窗口 NULLhMenu, 菜单,nullhInstance, 实例句柄lpParam附加值,鼠标附加值 NULL*/HWND hwnd=CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);//4.显示和更新ShowWindow(hwnd, SW_SHOWNORMAL);//5.通过循环区消息MSG msg;/*HWND        hwnd;主窗口UINT        message;具体消息名称WPARAM      wParam;附加消息,键盘消息LPARAM      lParam;附件消息,鼠标消息DWORD       time;消息产生时间POINT       pt;附加消息,鼠标消息,x, y*/while (1){/*_Out_ LPMSG lpMsg,消息_In_opt_ HWND hWnd,捕获窗口,NULL代表所有窗口_In_ UINT wMsgFilterMin,最小和最大过滤消息 一般填零_In_ UINT wMsgFilterMax);*/if (GetMessage(&msg, NULL, 0, 0) == FALSE){break;}TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}

Windows底层窗口的实现———学习笔记相关推荐

  1. windows下32位汇编语言学习笔记

    windows下32位汇编语言学习笔记 第一章  第一章 背景知识 80x86处理器的存储器 4个数据寄存器 EAX,EBX,ECX,EDX EAX寄存器 所有API函数的返回值都保存在EAX里,注意 ...

  2. Windows驱动开发工具 WDK 学习笔记

    目标:能够把电脑当作一个集成有高性能处理器的开发板用起来,当然,还自带了一个高级的操作系统Windows(必须的).总之,就是在一个带了操作系统的高性能开发板上的驱动程序开发. 性质:纯属业余爱好 1 ...

  3. tkinter message_【莫烦Python】Tkinter 做简单的窗口视窗lt;学习笔记(2)gt;

    接(1) 还有五个苹果:[莫烦Python]Tkinter 做简单的窗口视窗<学习笔记>​zhuanlan.zhihu.com 登录窗口小例子(pickle存取) import

  4. duilib 子窗口位置_Duilib学习笔记《02》— 界面布局

    2. 简单空白窗体界面 此处以创建一个简单的空白的灰色背景窗体为例.对应的XML布局文件对应的也就很简单.如下: 1<?xml version="1.0" encoding= ...

  5. Android底层HAL驱动开发学习笔记

    2017.3.27 1.确定任务:加快摄像头的信息获取速率:缩减驱动程序.减小帧的大小,缩减一个像素点的比特流(6/8/10bit) 2.重点了解函数:camerabuffer *buffer=mPr ...

  6. mfc e将控件置于窗口顶层_PyQt5学习笔记04 - QWidget窗口控件基类

    本来这一篇是想写一下怎么使用Qt Designer去设计一个界面的,但是我现在通常都是用代码去直接写界面很少用设计器.因为Qt Designer并不是为了python而写的,所以用起来不是很方便.很多 ...

  7. 《Windows via C/C++》学习笔记 —— Windows 线程池

    线程池(thread pool),允许有多个线程同时存在,并发执行,并且这些线程受到统一管理. 在Windows Vista中,提供了全新的线程池机制,一般这些线程池中的线程的创建的销毁是由操作系统自 ...

  8. Windows Server 2012:服务器虚拟化 学习笔记

    Hyper-V 扩展比较 Windows Server 2008 Windows Server 2008 R2 Windows Server 2012 HW 逻辑处理器 支持 16 个 LP 64 个 ...

  9. 《Windows via C/C++》学习笔记 —— “线程同步”之“检测死锁”

    本来这篇内容在书中是在"其他线程同步函数"这一节中的.这节中介绍了另外的几个等待函数,比如WaitForInputIdle.MsgWaitForMultipleObjects.Wa ...

最新文章

  1. Kali Linux 64位安装WPS
  2. 网站被k不要慌,看看“老油条”们是怎么解决的吧!
  3. Why Spring Boot
  4. 论文《Attention Is All You Need》及Transformer模型
  5. 1071. Speech Patterns (25)
  6. 干货 | 阿里巴巴HBase高可用8年抗战回忆录
  7. 海康威视主机升级固件_海康威视网络广播主机DSKAM6HG1S
  8. 锁大全与 GDB调试
  9. 【精彩实况】第三届大数据科学与工程国际会议
  10. 公共情报工具automater的基本使用
  11. 温升测试总结setllom解胶剂
  12. 08年新年快乐 :-)
  13. python读usb_使用Python来操作Microchip安全芯片
  14. 【T+】余额表联查明细账,提示未将对象引用设置到对象的实例;参数格式错误,solutionID不能为空。
  15. 倡导非盗版,自己常用的一些软件集锦
  16. 华为外包数据库面试问题分享20211225
  17. linux百度云下载脚本,百度网盘Linux版下载
  18. 开源高手推荐 十大最流行开源软件
  19. Databricks:打造数据国度的“金砖四国”
  20. 使用Python操控手机微信app(最新教程)

热门文章

  1. EntityFramework进阶——继承
  2. 教师使用计算机职责,教师办公室计算机使用制度
  3. keepalived vip mysql_mysql+keepalived高可用集群
  4. python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?
  5. mybatis xml 参数 使用
  6. SpringBoot的AOP是默认开启的,不需要加注解@EnableAspectJAutoProxy____听说SpringAOP 有坑?那就来踩一踩
  7. MySQL的INSERT INTO··· ON DUPLICATE KEY UPDATE使用的几种情况
  8. 学习Spring Boot:(十三)配置 Shiro 权限认证
  9. 计算机专业论文docx,计算机系毕业论文范文-20210606000812.docx-原创力文档
  10. java水泡_JAVA图像处理系列(八)——艺术效果:水泡