Windows底层窗口的实现———学习笔记

基本概念

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;
}

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据链路层差错检验循环冗余码过程图示

计算机网络数据链路层差错检验循环冗余码过程

如何把项目改成微服务项目_【日记】148微服务项目第18天

没有人天生就强、就弱或意志坚定。是后来才变强&#xff0c;后来才意志坚定。命运不在人身上&#xff0c;而在人四周。01一句话日记2020/9/702Day148每日总结关于图片上传&#xff0c;这个太常见了朋友圈&#xff0c;微头条都涉及到图片的上传以前我们也编写过对应的demo-当前项…

启动马达接线实物图_电工外出接单从事配电柜接线、调试工作的三个要领

点击上方电工电气学习&#xff0c;关注并星标专业的电工电气领域自媒体&#xff0c;不容错过欢迎转发朋友圈&#xff0c;欢迎文末留言电工朋友在时间允许在情况下外出接单&#xff0c;一来可以提高自己的收入&#xff0c;再者还可以练练手艺。同时&#xff0c;外部环境不是我们…

anaconda3 tensorflow安装踩坑记(WIN10+tensorflow带gpu版本)

我看的网课讲解的视频用的是带gpu版本的tensorflow1.4.0&#xff0c;使用pip install tensorflow-gpu1.4.0&#xff0c;但是如果想直接用之前那个命令的话要使用anaconda老一些的版本&#xff0c;最新的版本不支持&#xff0c;点击这里下载anaconda 5.2.0最新的版本的会报错&am…

萤石云设备下线是什么导致的_什么原因导致化工设备腐蚀?腐蚀防护措施有哪些?...

关键词&#xff1a;化工设备腐蚀&#xff0c;化工设备腐蚀原因&#xff0c;化工设备腐蚀防护在化工行业中腐蚀破坏到处可见&#xff0c;腐蚀事故频频发生。这除了因腐蚀本身所具有的自发性质外&#xff0c;很大程度上是因为人们对腐蚀的危害性认识不足&#xff0c;对腐蚀防护的…

记一次win10下pycharm用tensorboard可视化不显示的问题解决

路径中有中文导致无法访问 使用pycharm中的Terminal命令行 tensorboard --logdir所在的目录 出现了 然后发现说是路径中不能存中文 于是 cmd命令行中因为没切换硬盘 我的数据存在d盘&#xff0c;但是我的cmd在c盘 localhost:6006不行 因为主机名本身就不是localhost…

如何安装tensorflowGPU环境搭建(不报AVX2的警告)

TensorflowGPU版本无报错的安装安装pycharm安装Anaconda5.2.0装Visual Studio下载tensorflow&#xff0c;更新包&#xff0c;然后安装下载tensorflow更新一些包&#xff0c;不然会报错安装tensorflow gpu版本的包CUDA的下载和安装下载CUDA9.1安装pycharm 官网版本教育版本即可…

一道简单却易混淆的高等数学求极限题目

lim⁡x→∞(11x)x2ex\lim_{x \to \infty}\frac{(1\frac{1}{x})^{x^2}}{e^x} x→∞lim​ex(1x1​)x2​ 正确的解法&#xff1a; 一种错误的解法&#xff1a; 这是同学问我的&#xff0c;错在了哪里&#xff1f; lim⁡x→∞(11x)x2是否可以等于lim⁡x→∞ex?\lim_{x \to \in…

8086汇编求一组正整数{0x1223,0x1234,0x1434,0x2345,0x3412,0x1712}中的最大数并存在变量MAX中

编程求一组正整数{0x1223,0x1234,0x1434,0x2345,0x3412,0x1712}中的最大数并存在变量MAX中 DATAS SEGMENT X DW 1254H,1234H,1434H,2345H,3412H,1712H MAX DW ? DATAS ENDS STACKS SEGMENT;此处输入堆栈段代码 STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS ST…

html内容封装为一个对象_技术赋能还是内容为王,哪一个才是短视频创作的关键?...

12月23日&#xff0c;广东高校“校园发光者工作坊”计划宣讲活动走进华南师范大学&#xff0c;与同学们交流短视频创作的经验与心得。南方都市报N视频内容总监陈成效向同学们介绍了视频制作的“守破离”&#xff0c;以新闻报道为例&#xff0c;讲述如何通过预判和设计&#xff…

Java毕业设计—springboot健身房管理系统

一、项目背景介绍&#xff1a; 随着人们生活水平的提高和健康意识的增强&#xff0c;健身行业逐渐兴起并迅速发展。而现代化的健身房管理系统已经成为健身房发展的必备工具之一。传统的健身房管理方式已经无法满足现代化健身房的需求&#xff0c;需要一种更加高效、智能、安全…

C/C++二叉树前序遍历,中序遍历,后序遍历

二叉树的先序遍历&#xff0c;中序遍历&#xff0c;后序遍历 #include <iostream>using namespace std;typedef struct BTNode {char data;struct BTNode* lchild;struct BTNode* rchild; }BTNode;void preorder(BTNode* p) {if(p!NULL){cout<<p->data;preord…

osm数据下载 python_GIS Experience (十):OSM数据获取

参考资料 1 OSM OpenStreetMap 获取城市路网数据及转为ESRI shp数据的方法 2 OSM获取路网数据 &#xff08;数据转换方法对比&#xff09;1 前言OpenStreetMap&#xff08;OSM&#xff09;意在创造一个内容自由且能让所有人编辑的世界地图&#xff0c;详见官网。2 数据获取2.1 …

两个字符串的最长公共子序列长度_程序员编程算法,解决文本相似度问题的最长公共子序列算法!...

在前面我讲解了如何通过最长公共子串来求解两个文本的相似度问题&#xff0c;但它有一定缺陷&#xff0c;举个例子&#xff0c;看下面的两个字符串我爱吃小青菜和各种鲜水果。我很爱吃青菜与各样水果。上面两个字符串&#xff0c;如果通过计算子串来求相似度&#xff0c;会发现…

VOC2007xml转YOLO的txt格式代码

使用方法&#xff08;二选一即可&#xff09;&#xff1a; python 这个文件名.py --xml_dir xml文件路径 --image_dir 图片所在路径 --out_dir 输出文件夹放在和VOC2007同级路径下运行即可 import os import xml.etree.ElementTree as ET import cv2 import argparse from tqd…

ctf up怎么写 write_??零基础写网络爬虫的思路??

网络爬虫&#xff0c;用一句话简单总结&#xff0c;就是一种按照一定的规则&#xff0c;自动的抓取万维网信息的程序或者脚本。写这篇文章的初衷是有个知友私信我说&#xff0c;模仿了很多网上用Python写爬虫的例子&#xff0c;但到了需要自己动手写爬虫的时候又不知道怎么写了…

VMwarestation环境下的centos7(Minimal)静态ip配置(桥接模式)

笔者本来是为了用三台centos7&#xff08;最小化安装版本&#xff09;的虚拟机搭建一个Zookeeper的环境&#xff0c;但是在搭建的过程中遇到了一些问题&#xff0c;遂记录之。 为了便捷&#xff0c;除了希望三台配置了静态ip的虚拟机可以和宿主机之间互相ping通之外&#xff0…

技术系统进化法则包括_技术系统进化论,模式五、技术集成以增加系统功能

阿奇舒勒TRIZ理论三个核心思想&#xff1a;1、无论是一个简单产品还是复杂的技术系统&#xff0c;其核心技术的发展都是遵循着客观的规律发展演变的&#xff0c;即具有客观的进化规律和模式&#xff1b;2、各种技术难题和矛盾的不断解决是推动这种进化过程的动力&#xff1b;3、…

zookeeper一键启动关闭JAVA_HOME在PATH中找不到报错踩坑记

最近看了尚硅谷的zookeeper教程&#xff0c;在集群环境搭建中&#xff0c; 有这么一个脚本zk.sh用来一键启动和查询 #!/bin/bash case $1 in "start"){ for i in zknode2 zknode3 zknode4 doecho ---------- zookeeper $i 启动 ------------ ssh $i "/opt/modu…