What Is a Window??
显然地,windows是Windows的核心。windows如此重要,以至于操作系统以它们命名。但什么是window?当你想象一个window时,你可是想到的是如下的样子:
这种类型的window称为一个application window或者main window。它通常有一个带有标题栏(title bar)、最小化和最大化按钮(button)以及其他标准UI元素的框架(frame)。该frame被称为window的非客户端区域,如此被称呼,是因为操作系统管理window的那个部分。frame之内的区域为客户端区域。这部分window由你编写的程序管理。
下图是另一种类型的window:
如果你是Windows编程新手,你可能会惊讶于UI控件(如按钮和编辑框)本身就是window。UI控件和application window之间的主要区别是控件本身不能独立存在。相反,控件被摆放在application window的某个位置。当你拖动application window时,控件也会如你所期待的那样伴随着application window移动。控件与application window也能相互交流。(例:application window接受了一个按钮的点击通知)。
因此,当你想window时,不要简单地只想成application window。相反,把window想成一种编程结构(programming construct),这种编程结构能:
- Occupies a certain portion of the screen.
占据屏幕的一部分 - May or may not be visible at a given moment.
在指定时刻可见或不可见 - Knows how to draw itself.
画它自身 - Responds to events from the user or the operating system.
对事件(用户或系统)做出响应
父窗口和所有者窗口
在UI控件的情况下,控件窗口是应用窗口的子窗口。反之,应用窗口是控件窗口的父窗口。父窗口提供坐标系统用于定位子窗口。拥有父窗口会影响子窗口外观的某些方面:例如,子窗口被裁剪,以便子窗口的任何部分都不会出现在其父窗口的边框之外。
另一种关系是application window和modal dialog window之间的关系。当应用程序显示modal dialog时,application window是owner window,而对话框是一个owned window。一个owned window总是出现在它的owner window的前面。当所有者最小化时,它被隐藏,并与所有者同时被销毁。
下图显示了一个应用程序,该应用程序显示一个带有两个按钮的对话框
应用程序窗口拥有对话框窗口,对话框窗口是两个按钮窗口的父窗口。下图显示了这些关系:
窗口句柄
Windows是对象——它们既有代码又有数据,但它们不是C++类。相反,程序通过使用一个名为句柄(handle)的值来引用窗口。句柄是不透明的类型。本质上,它只是操作系统用来识别对象的一个数字。您可以将Windows想象成拥有一个包含所有已创建窗口的大表。它使用这个表通过它们的句柄查找窗口。(这是否正是它在内部的运作方式并不重要。) 窗口句柄的数据类型是HWND,通常读作“aitch-wind”。 窗口句柄由创建窗口的函数返回: CreateWindow和CreateWindowEx。
要在窗口上执行操作,您通常会调用一些以HWND值作为参数的函数。例如,要重新定位屏幕上的窗口,调用MoveWindow函数:
C++
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
第一个参数是要移动的窗口的句柄。其他参数指定窗口的新位置以及是否应该重新绘制窗口。
记住句柄不是指针!!!如果hwnd是一个包含句柄的变量,那么试图通过写入*hwnd来取消引用句柄就是一个错误。
屏幕和窗口坐标
坐标是用与设备无关的像素测量的。当我们讨论graphics时,我们将有更多关于设备独立像素的内容。
根据任务的不同,您可以度量相对于屏幕、相对于窗口(包括框架)或相对于窗口的客户端区域的坐标。例如,您可以使用屏幕坐标(screen coordinates)在屏幕上放置一个窗口,但是您可以使用客户端坐标(client coordinates)在窗口中绘制。在每种情况下,原点(0,0)总是区域的左上角。
来源:https://docs.microsoft.com/zh-cn/windows/desktop/learnwin32/what-is-a-window-