【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经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ...
随机推荐
- cocos2dx 入口函数分析
以下是main函数最开始的两段,也是cocos2d一开始执行的地方: AppDelegate app; return Application::getInstance()->run(); 接下来 ...
- Apple历代Mac系统汇总
编号 系统名 版本号 名称 发布时间 01 macOS 11.0 Big Sur(大惊喜) 2020年6月 02 macOS 10.15 Catalina(卡特琳娜) 2019年9月 03 macOS ...
- hostnamectl主机名
hostnamectl 可用于查询与修改系统主机名以及其他相关设置. 所谓"主机名",其实有三种不同的含义: "pretty"主机名,仅供人类阅读,可以包含各种 ...
- 【数据结构】K-D Tree
K-D Tree 这东西是我入坑 ICPC 不久就听说过的数据结构,但是一直没去学 QAQ,终于在昨天去学了它.还是挺好理解的,而且也有用武之地. 目录 简介 建树过程 性质 操作 例题 简介 K-D ...
- Kubernetes集群PV和PVC详解
Kubernetes集群高级存储资源PV及PVC 文章目录 Kubernetes集群高级存储资源PV及PVC 1.高级存储PV和PVC概念部分 2.PV和PVC资源的生命周期 3.PV资源介绍与案例配 ...
- stram流char[]保存,支持中文,Filestram需要先转byte[]才能使用,但是性能更好《转载》
学习流的使用时(stream类),逐步遇到新的理解,记录一下 1.FileStream流是处理byte[],默认UTF8类型 当你使用wirte方法时将非byte类型的输入内容,先将内容通过转换为字节 ...
- redis中scan和keys的区别
scan和keys的区别 redis的keys命令,通来在用来删除相关的key时使用,但这个命令有一个弊端,在redis拥有数百万及以上的keys的时候,会执行的比较慢,更为致命的是,这个命令会阻塞r ...
- UIView属性的讲解
1.父控件和子控件的理解在storyboard中只有UIView是可以在里面拖入子控件的,其他控件不可以(必须通过代码添加)拖入一个UIView控件,在里面添加一些子控件(UIView控件是控制器的V ...
- Redis 哨兵模式
主从切换技术的方法是:当主服务器宕机了,需要手动将一台从服务器切换为主服务器,这就需要人工干预,这可能会造成一段时间的服务不可用. 一.哨兵模式的概述: 哨兵是一个独立的进程,作为一个进程,他会独立地 ...
- Java和Js编码(encodeUrl)解码(decodeUrl)对空格的差异问题
今天解决一个问题的时候遇到了一个编码解码问题,记录一下. 1. Js用的是encodeURIComponent()方法编码,后面的都以该编码方式处理出来的数据为准. 2. Java用的是URLDeco ...