【windows 操作系统】什么是窗口?|按钮也是窗口
起因
在看操作系统消息机制的时候,看到一句化:全局消息队列把消息发送到窗口所在的线程消息队列。突然就怀疑起了窗口的意思。于是就有这边基类。
文章来源:https://docs.microsoft.com/zh-cn/windows/win32/learnwin32/what-is-a-window-
正文
看名字( Window )就知道,窗口是 Windows 编程开发的核心,但是什么是窗口?你的大脑中可能浮现如下画面:
这种类型的窗口叫做应用程序窗口(application window)或者主窗口( main window)。典型的主窗口框架通常包括标题栏、最小化按钮和最大化按钮以及一些其它的 UI 组件。这个框架本身叫做窗口的非客户区(non-client area)。
Windows 操作系统负责管理非客户区的响应操作,例如拖拽,改变大小,最大化最小化等等。框架之外剩余的区域,叫做客户区(client area),这部分是由程序自身负责管理的。
下面是另一种类型的窗口:
你可能惊讶于 UI 控件也是一种窗口。UI 控件的类型很多,包括按钮、编辑框、下拉列表等等。 UI 控件一般不能单独存在,大多都是依附于窗口之上。
当你拖拽一个窗口的时候,窗口上的 UI 控件一样会跟随移动,并保持在窗口的相对位置不变。控件和窗口之间是可以互相通讯的(例如,窗口可以接收到按钮的点击事件)。
知道上面的信息后,再次提及窗口的时候,你不应该简单的把窗口想象为典型的主窗口,而是要把它看做一种包含若干特点的数据结构:
- 其占据屏幕的某个部分。
- 在特定的时候可以隐藏。
- 知道如何绘制自身。
- 对来自用户或操作系统的事件能做成响应。
1. 父窗口(Parent Windows)和附属窗口(Owner Windows)
当存在 UI 控件的时候,控件窗口被认为是应用程序窗口的子窗口,应用程序窗口被认为是控件窗口的父窗口。通过父窗口的坐标系可以定位子窗口的位置,并且子窗口的样式等一些属性会受到父窗口的影响。例如,超出父窗口范围的子窗口默认会被裁剪掉。
除了父子关系另一种关系存在于应用程序窗口和模态窗口之间。当一个应用程序显示一个模态窗口,这个应用程序窗口被称为拥有者窗口(owner window),而这个模态窗口叫做被拥有者窗口(owned window),可以把模态窗口叫做应用程序窗口的附属窗口。
被拥有者窗口总是出现在应用窗口之前,当拥有者窗口最小化或者销毁的时候,被拥有者窗口会自动隐藏。
下图显示一个应用程序窗口和一个包含两个按钮的模态对话框窗口。
这个应用程序窗口拥有这个对话框窗口,而对话框窗口是两个按钮的父窗口,整个关系如下图所示:
2. 窗口句柄
窗口句柄
Windows是对象,它们同时具有代码和数据,但它们不是 C++ 类。 相反,程序通过使用名为句柄 的值来引用 窗口。 句柄是不透明类型。 实质上,它只是操作系统用来标识对象的数字。 可以想象Windows创建的所有窗口都有一个大表。 它使用此表按其句柄查找窗口。 (它内部的工作方式是否完全相同都很重要。) 窗口句柄的数据类型是 HWND, 这通常发音为"aitch-wind"。 窗口句柄由创建窗口的函数返回 :CreateWindow 和 CreateWindowEx。
若要对窗口执行运算,通常会调用一些采用 HWND 值作为参数的函数。 例如,若要重新定位屏幕上的窗口,请调用 MoveWindow 函数:
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
第一个参数是要移动的窗口的句柄。 其他参数指定窗口的新位置以及是否应该重新绘制窗口。
请记住,句柄不是指针。 如果 hwnd 是包含句柄的变量,则尝试通过写入取消引用句柄 *hwnd
是一个错误。
3. 屏幕坐标和窗口坐标
坐标是用像素表示的,这里的像素(pixels)一般是独立于设备的,术语用 device-independent pixels 表示,其实说简单一些就是这些像素是抽象的,独立于设备之外的,以后的文章会仔细讨论这部分内容的含义。
根据需求的不同,坐标系可以相对于屏幕建立,也可以相对于窗口(包含框架)建立,还可以相对于窗口客户区建立。对于同一个物体虽然位置不变,但对于不同的坐标系,表示的坐标位置是不同的。
如下图所示,同一个(0,0)点坐标,对于不同坐标系,表示对位置是不同的。
【windows 操作系统】什么是窗口?|按钮也是窗口的更多相关文章
- 【windows 操作系统】窗口指针 和 窗口句柄 有什么区别
句柄是指针的"指针" 指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据.Windows并不希望一般程序修改其内部数据结构,因为这样太不安全.所以Windows给每 ...
- Windows操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
- Windows 操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
- 在windows操作系统中,查询端口占用和清除端口占用的程序
一.在windows操作系统中,查询端口占用和清除端口占用的程序 提升权限后用:netstat -b或用 1.查询端口占用的进程ID 点击"开始"-->"运行&qu ...
- 深入解析Windows操作系统笔记——CH1概念和术语
1.概念和工具 本章主要介绍Windows操作系统的关键概念和术语 1.概念和工具 1.1操作系统版本 1.2基础概念和术语 1.2.1Windows API 1.2.2 服务.函数和例程 1.2.3 ...
- Windows操作系统消费者价值亮点
在讨论Windows操作系统之前,我们先看看消费者是什么. 消费者是产品和服务的最终使用者 ,其购买商品的目的主要是用于个人或家庭需要. 那么消费者的需求是什么,是使用,所以谁能给消费者更好的使用体验 ...
- windows进程/线程创建过程 --- windows操作系统学习
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...
- VS2010 使用时选择代码或双击时出错,点击窗口按钮后VS自动重启问题
VS2010 使用时选择代码或双击时出错崩溃,点击窗口按钮后VS自动重启问题 下载补丁,打上补丁之后,重启电脑,解决了问题. WindowsXP的下载地址:Windows XP 更新程序 (KB971 ...
- windows窗口分析,父窗口,子窗口,所有者窗口
(本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++.Windows编程及MFC经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ...
随机推荐
- X架构键盘选购指南
X架构键盘 联想 JME8002(未知) JME7597(推荐) 据说是ThinkPAD键盘的血统. Thinkapad 小红点键盘,据说腿撑容易坏 明基 明基精钢侠 海湾海贝(键程长,不累手,但不易 ...
- mate10碎屏机当成小电脑使用尝试
1.屏碎了修起来300-400,自己动手至少也要260以上买个屏幕钱. 手机图案锁屏也不知道密码,给我手机的亲戚忘了.当年手机被车压弯了. 对着恢复教程,盲屏幕猜着按还原了. 2.之后一路从8代系统更 ...
- C++普通成员函数的调用形式
#include<iostream> using namespace std; class A { public: int data; void foo(int x) { data = x ...
- golang中的数组
1. 数组的声明 package main import "fmt" func main() { // 数组:定长且元素类型一致的数据集合 // 方式一:先声明在赋值,声明时内存中 ...
- 多选菜单shell脚本
有 很多方法 可以读取Bash脚本中的用户输入. 但是,允许用户键入输入会带来一些问题. 主要问题是输入验证,您必须在其中考虑所有可能的输入. 解决此问题的一种简单方法是为Bash脚本创建一个多选菜单 ...
- python 小兵(4)之文件操作 小问题
1.光标不对就用seek 2.文件操作方面注意不要变修改变删除,会爆出文件正在运行不能操作 3.w模式下只有开始打开的时候会清空 4.文件操作的时候用as 后面的参数进行操作,不能用文件名进行操作 5 ...
- ApacheCN Python 译文集 20211108 更新
Think Python 中文第二版 第一章 编程之路 第二章 变量,表达式,语句 第三章 函数 第四章 案例学习:交互设计 第五章 条件循环 第六章 有返回值的函数 第七章 迭代 第八章 字符串 第 ...
- SP5971 LCMSUM - LCM Sum
一个基于观察不依赖于反演的做法. 首先 \(\rm lcm\) 是不好算的,转化为计算 \(\rm gcd\) 的问题,求: \[\sum\limits_{i = 1} ^ n \frac{in}{\ ...
- SpringBoot前后端数组交互
前端 后端 Gitee地址 https://gitee.com/zhuayng/foundation-study.git 参考 https://blog.csdn.net/qq_34091758/ar ...
- Java线程--CyclicBarrier使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867687.html Java线程--CyclicBarrier使用, 代码里头有详细注释: ...