【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经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ...
随机推荐
- 保存网页到zotero研究
打印长页 打印长页很麻烦,打印加载时间过长,打印后无法选取文字 https://www.zhihu.com/question/52639201?sort=created 插件 浏览器自带直接网页打印p ...
- .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记
目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...
- ES_AutoCheck.sh
#!/bin/bash #@es_check #@date 2019/11/26 #@auth tigergao status=`curl -s GET "http://172.16.71. ...
- 学习Java第11天
今天所做的工作: 敲代码,按照教材进度,我已经"学完了",用引号引起来. 明天工作安排: 敲代码 所遇到的困难及解决方法: 虽然是"学完了",但真正写起来还是有 ...
- 关于Linux安装中NAT模式和桥接模式的区别详解(转载)
1.一般我们在创建一个Linux虚拟机时候,会面临三个网络配置选择: 桥接模式.nat模式.host-only模式(主机模式,这个模式用得少,就不介绍了) 2.NAT模式: 所谓nat模式,就是虚拟系 ...
- Understanding C++ Modules In C++20 (2)
Compiling evironment: linux (ubuntu 16.04)+ gcc-10.2. The post will focus on using export,import,vis ...
- 如何把一个数组中的对象的key值相等的对象合成一个对象
比如这样一个数组:[{category:"中国梦",value:"10000"},{category:"有国才有家",value:" ...
- CAAnimation——简介
- 【Java】equals()与hashCode()方法详解 (转)
java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...
- ubuntu memcached安装与配置
转载请注明来源:https://www.cnblogs.com/hookjc/ 关于Memcache与memcachedMemcache是项目名,memcached是服务名.让很多初接触的人感觉很是莫 ...