【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经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ...
随机推荐
- unity3d,java,c#,python,rospy的socket通信测试
1.C#在与其他人通信时,最好不要用tcpclient来承接其他语言,会收不到用户名,最好都用socket. 2.unity3d在与java通信时,对方返回我unity3d发的数据流会打印收到一个类, ...
- hbase region, store, storefile和列簇,的关系
先来一张大图. Hbase上Regionserver的内存分为两个部分,一部分作为Memstore,主要用来写:另外一部分作为BlockCache,主要用于读数据:这里主要介绍写数据的部分,即Mems ...
- golang中接口对象的转型
接口对象的转型有两种方式: 1. 方式一:instance,ok:=接口对象.(实际类型) 如果该接口对象是对应的实际类型,那么instance就是转型之后对象,ok的值为true 配合if...el ...
- 集合框架-Map集合-LinkedHashMap及关联源码操作
1 package cn.itcast.p9.linkedhashmap.demo; 2 3 import java.util.HashMap; 4 import java.util.Iterator ...
- Photoshop如何快速扣取图标
由于图标往往与背景色区别很大,因此首先使用魔棒工具快速选择出图标 有时候选择出来是图标,有时候是背景色 可以通过选择反向来调节(右键即可) ctrl + J 提取出选择的区域 这时进行等分裁剪即可 点 ...
- javascript 判断对像是否相等
在Javascript中相等运算包括"==","==="全等,两者不同之处,不必多数,本篇文章我们将来讲述如何判断两个对象是否相等? 你可能会认为,如果两个对象 ...
- 创建一个python类 ,self init相关参数的简单介绍
一 创建 ''' 一 使用python 语法 创建一个类, 探究self 是干啥的 1 创建一个对象 car 2 写入两个行参 3 定义两个方法 ''' class Car(): ''' 二 init ...
- 计算机电子书 2016 BiliDrive 备份
下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 Go入门指南.epub (1.87 MB) ...
- Nginx配置转发
nginx location proxy_pass 后面的url 加与不加/的区别 在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把locat ...
- JVM学习十二 - (复习)JVM内存结构
JVM 内存结构 Java 虚拟机的内存空间分为 5 个部分: 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代.元 ...