文档章节

WINDOWS窗口坐标

zhangyujsj
 zhangyujsj
发布于 2014/12/09 13:41
字数 822
阅读 154
收藏 1
不只是有最大最小关闭按钮的那个矩形东西被称为窗口,

所有控件是窗口。窗口中的子窗口是窗口。



【窗口的组成】

外部边框。窗口Border属性为 Thin, Resizing时,有3个像素宽的边框。

系统区:窗口上部蓝色部分,有最大最小关闭按钮的那一个部分。

客户区:除去外部边框和系统区的部分。系统区有统一的机制处理,客户区

     是由客户程序员定义外观和行为的部分。



【坐标系】

屏幕坐标系:定义屏幕左上角为(0,0)原点

窗口安放在二维平面上,一般为电脑显示器所在的视觉平面上。

坐标单位为“像素”。假设显示器分辨率为(800*600),那么

屏幕右下角坐标为(800,600)。



客户区坐标系:以窗口客户区的左上角为(0,0)原点。向右为X轴正方向。

向下为Y轴正方向。



【常用函数】

GetWindowRect

取得窗口(包括边框和系统区)位于屏幕坐标系中的位置信息。

如果“窗口”是按钮等控件,就是控件的整体(包括边框)位于屏幕坐标系中位置。



GetClientRect

获得窗口位于客户坐标系中的位置信息。



CRect rc;

对话框->GetClientRect(&rc); //获得对话框客户区尺寸信息。

返回的rc永远是(0,0,width,height),其中width是客户区宽度(单位像素)

height是客户区高度。



CRect rc;

控件->GetClientRect(&rc); //获得控件客户区尺寸信息。

返回的rc永远是(0,0,width,height),其中width是控件宽度(单位像素)

height是控件的高度。



ClientToScreen

将客户区坐标系翻译成屏幕坐标系。



描述惯例 CRect=(左,顶,右,底)



例子1:

CRect rect;

控件->GetClientRect(&rect); //rect = (0,0,20,10)

CRect rect2 = rect;

控件->ClientToScreen(&rect2); //rect2 = (a,b,a+20,b+10)

其中a,b为控件某点(左上角的那个点)在屏幕坐标系的坐标。



例子2:

CRect rect;

对话框->GetClientRect(&rect); //rect = (0,0,20,10)

CRect rect2 = rect;

对话框->ClientToScreen(&rect2); //rect2 = (a,b,a+20,b+10)

其中a,b为对话框某点(左上角的那个点)在屏幕坐标系的坐标。



ScreenToClient

将屏幕坐标系翻译成客户区坐标系。



例子3:

CRect rect;

控件->GetWindowRect(&rect);  //rect = (l,t,r,b)

CRect rect2 = rect;

控件->ScreenToClient(&rect2); //rect2 = (0,0,r-l,b-t)



例子4:

CRect rect;

对话框->GetWindowRect(&rect); //rect = (l,t,r,b)

CRect rect2 = rect;

对话框->ScreenToClient(&rect2); //rect2 =
(-e,-(e+h),(r-l)-e,(b-t)-(e+h))

其中:e代表窗口的边框宽度,一般是3个像素。

    h代表系统区的title-bar的高度,一般是26个像素。

    负数是从何而来呢?GetWindowRect是取整个窗口全体(包括系统区和边框)

    因此变换到客户区坐标系时,对话框左边位于客户区坐标系原点右侧(负方向)

    因此左边的坐标就是-3。



(矩形的几何面积没有变化,变化的是位置值。坐标变换属于刚体运动变换)



例子5:

CRect rect;

控件->GetWindowRect(&rect);

CRect rect2 = rect;

对话框->ScreenToClient(&rect2); //控件的父窗口是对话框



这个比较有用,可以计算某控件相对位于父窗口客户区坐标系中的坐标。

本文转载自:http://blog.sina.com.cn/s/blog_4e776a5c0100xid1.html

上一篇: error MSB3073
下一篇: 图解YUV420
zhangyujsj
粉丝 24
博文 358
码字总数 224241
作品 0
广州
私信 提问
世界坐标系空间,页面空间,设备空间,物理设备空间

一、坐标空间 1、Win32应用程序设计接口(API)使用四种坐标空间:世界坐标系空间、页面空间、设备空间和物理设备空间。应用程序运用世界坐标系空间对图形输出进行旋转,斜切或者反射。 2、Win...

Git_Android
2012/09/06
0
0
理解Windows坐标系

附件:http://down.51cto.com/data/2355021 本文转自 xchsp 51CTO博客,原文链接:http://blog.51cto.com/freebird/269061,如需转载请自行联系原作者...

余二五
2017/11/15
0
0
GetWindowRect

函数功能:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。 函数原型:BOOL GetWindowRect(HWND hWnd,LPRECTlpRect); 参数: hWnd:窗口句柄。 lpRe...

云栖希望。
2017/12/04
0
0
CREATESTRUCT 结构

typedef struct tag CREATESTRUCT { LPVOID lpCreateParams; HANDLE hInstance; HMENU hMenu; HWND hwndParent; int cy; int cx; int y; int x; LONG style; LPCSTR lpszName; LPCSTR lpszCl......

mjrao
2012/04/10
0
0
窗口坐标,逻辑坐标与视口坐标,设备坐标的区别

应该说 窗口坐标 是相对于 视口坐标 而言 逻辑坐标 是相对于 设备坐标 而言 补充: 窗口坐标是基于逻辑坐标的. 视口坐标是基于设备坐标. 上面这两话是抄自百度百科的,我的理解是: 窗口坐标...

长平狐
2012/09/03
313
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql免安装版,服务无法启动没有抱任何错误

1.解压 2.新建my.ini [mysqld]# Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70% of total RAM for dedicated server, e......

榴莲黑芝麻糊
42分钟前
0
0
Qt编写安防视频监控系统3-通道交换

一、前言 最开始写通道交换的功能的时候,走了很多弯路,比如最开始用最初级的办法,触发交换的时候,先关闭视频,然后设置新的url重新打开视频,这样处理非常低级而且耗内存还卡还很慢,毕竟...

飞扬青云
42分钟前
0
0
如何远程调试部署在CloudFoundry平台上的nodejs应用

网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等。 在实际情况中,我们可能遇到本地运行良好,但是部署到C...

JerryWang_SAP
今天
5
0
微信扫码访问网站调用默认浏览器打开如何实现?

我们在微信内分享链接或二维码的时候,我们会发现我们的网站是可以在浏览器里正常打开的,但就是不能在微信里打开,提示 “ 已停止访问该网页 ”,无论是聊天框也一样。说是系统检测到您的网...

明尼苏达哈士奇
今天
4
0
一份Java程序员进阶架构师的秘籍,你离架构师还差多远

一、如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并...

我最喜欢三大框架
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部