Windows 编程基础:窗口坐标系

专栏导航

上一篇:MM_TEXT 映射模式下的客户区坐标系

回到目录

下一篇:无

本节前言

对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点,请你自行查阅。

我呢,也会提到一部分的参考课节。但是呢,你不应该依赖于我的主动提及。最好呢,你自己能够多去了解和查看本专栏目录。

之前,我们讲解过屏幕坐标系与 MM_TEXT 映射模式之下的客户区坐标系的知识。学习本节,需要你首先已具备这两种坐标系的知识基础。

关于屏幕坐标系与 MM_TEXT 映射模式之下的客户区坐标系的知识,请参考下述两个文章链接。

参考课节:第3章,[标签 Win32] :Windows 坐标系,屏幕坐标系

参考课节:MM_TEXT 映射模式下的客户区坐标系

在你确保已掌握了上述两个参考文章的内容的基础上,你可以往下学习本节内容。

我们开始。

一. 窗口坐标系

屏幕坐标系,是以整个计算机显示屏作为显示区域的。在屏幕坐标系中,原点在显示器的左上角的像素点的位置。屏幕坐标系的原点是(0,0)。

至于窗口坐标系,实话说,我也并不是很熟悉这一坐标系。因为,在学习 Windows API 编程与 MFC 编程基础的时候,几乎不咋用这一坐标系。常用的,还是客户区坐标系。

在这里,我说一说我所认识的窗口坐标系。

在使用 GDI 函数的时候,我们程序员在代码中给出的(x,y)坐标对,叫做逻辑坐标。在窗口坐标系里面,我们程序员给出的逻辑坐标,它与窗口坐标系的物理坐标是一致的。

在窗口坐标系里面,x 坐标值与 y 坐标值的 1 个单位,为 1 个物理像素。

在窗口坐标系里面,坐标系的原点,位于整个窗口的左上角的像素点,此原点的坐标为(0,0)。对于某一个坐标对(x,y),x 值代表此像素点相对于坐标原点,向右边偏移 x 个像素的位置;y 值代表此像素点相对于坐标原点,向下偏移 y 个像素的位置。

注意哦,这里所说的整个窗口,它包括的是整个的窗口,包括客户区、状态栏、工具栏、滚动条、标题栏、菜单栏等等的全部的区域。

当使用客户区坐标系绘制文本与图形的时候,我们只可以将图形与文本绘制在客户区之中。而当我们使用窗口坐标系的时候,我们就可以将绘图范围扩大一些了,我们可以在整个窗口中,除标题栏之外的任意位置绘图。也就是说,通过使用窗口坐标系,我们可以在工具栏、菜单栏等等的位置绘制一条直线,我们也可以依然将这条直线绘制在窗口的客户区之中。当然了,你也可以用窗口坐标系,来绘制一个跨越客户区、工具栏、标题栏等等区域的一个图形。

窗口坐标系的特点是,使用它,你可以在整个窗口的除标题栏之外的任意位置绘图。

我们试着使用窗口坐标系来绘制一条直线。
图1

如图1 所示,我们已经绘制了一条直线。这条竖线,跨越了菜单栏、工具栏、客户区、状态栏。

图1 所示的程序,是我用 MFC 编写的。以后,我们学习到 MFC 的相关章节的时候,我若是没忘记的话,那么,我会领大家画图1 所示的直线的。

有一点需要注意,窗口坐标系的原点(0,0),它是整个窗口的左上角的像素点。也就是,它其实应该是位于标题栏的左上角的。不过呢,在使用窗口坐标系的时候,画图涉及标题栏区域的时候,不会显示出来,但是文本或图形可以在除标题栏之外的其余位置正常显示。

也就是说,使用窗口坐标系的时候,相当于有一个裁剪区域,这个裁剪区域是除标题栏之外的窗口区域。你在绘制图形与文本的时候,可以让绘图对象的一部分位于标题栏之中,但是,位于标题栏的部分不属于裁剪区域,因此,标题栏部分的图形与文本是不显示的,而标题栏之外的部分的图形与文本,是可以正常显示的。

二. 窗口坐标系与屏幕坐标系的区别

其实区别不大。窗口坐标系与屏幕坐标系,最主要的区别是,坐标原点不同。屏幕坐标系的坐标原点,是在整个显示器的显示区域的左上角的像素点的位置。而窗口坐标系的坐标原点,是在程序窗口的左上角的位置,其实也就是位于标题栏里面。

总 结

本节内容,应该是不难。

好好学吧。

专栏导航

上一篇:MM_TEXT 映射模式下的客户区坐标系

回到目录

下一篇:无

相关推荐
进击的小头2 小时前
行为型模式:策略模式的C语言实战指南
c语言·开发语言·策略模式
Aevget2 小时前
MFC扩展库BCGControlBar Pro v37.2新版亮点:控件功能进一步升级
c++·mfc·界面控件
Tansmjs3 小时前
C++与GPU计算(CUDA)
开发语言·c++·算法
爱编码的小八嘎3 小时前
C语言对话-5.通过任何其他名字
c语言
挖矿大亨4 小时前
c++中的函数模版
java·c++·算法
阿基米东4 小时前
基于 C++ 的机器人软件框架(具身智能)开源通信库选型分析
c++·机器人·开源
海天一色y4 小时前
普利姆算法(Prim)和克鲁斯卡尔算法(Kruskal)
windows·算法
偷星星的贼115 小时前
C++中的对象池模式
开发语言·c++·算法
CN-Dust5 小时前
【C++】洛谷P3073 [USACO13FEB] Tractor S
开发语言·c++
2401_829004025 小时前
C++中的适配器模式变体
开发语言·c++·算法