GetClientRect(HWND, RECT*) ---得到窗口的客户区大小,left,top总是0,bottom是客户区高度,right是客户区宽度

GetWindowRect(HWND, RECT*) ---得到窗口相对屏幕左上角(0,0)的坐标,即窗口左上角(left,top)和右下角(right,bottom)的坐标


ScreenToClient(HWND, POINT*) ---将一屏幕坐标转为相对于窗口客户区左上角的坐标。假设客户区屏幕坐标(110,120,400,400)
                                                       若p(100,100),则转换后p(-10, -20)
                                                       若p(150,150),则转换后p(40, 30)

ClientToScreen(HWND, POINT*) ---将一相对于窗口客户区左上角(始终假设)的坐标转为屏幕坐标。假设客户区屏幕坐标(110,120,400,400)
                                                       若p(5, 5),则转换后p(115,125)
                                                       若p(10, -20),则转换后p(120,100);

Windows并没有提供直接转换客户区RECT坐标/屏幕RECT坐标的函数,但是MFC中的CWindow类提供了ClientToScreen(RECT*) 和 ScreenToClient(RECT*)函数。
比如,当使用ClientToScreen(RECT *prc)时,传入的RECT坐标是假定为相对客户区左上角的,假设客户区屏幕坐标(110,120,400,400)
                                                若rc(2,2,4,4),则转换后rc(112,122,114,124)
                                                若rc(-5,-5,0,0),则转换后rc(105,115,110,120)
                                                若rc(0,0,290,280),则转换后rc(110,120,400,400)  >--->------->------->此例常用来获取客户区相对屏幕原点的坐标:

RECT rcClient;
GetClientRect(&rcClient); //0 0 宽 高
ClientToScreen(&rcClient); //客户区左上点和右下点的屏幕坐标
/*很常用,但不要误认为ClientToScreen的作用仅限于此*/

同理,当使用ScreenToClient(RECT *prc)时,传入的RECT坐标假定为屏幕坐标,假设客户区屏幕坐标(110,120,400,400)
                                                若rc(150,150,160,160),则转换后rc(40,30,50,40)
                                                若rc(100,100,120,120),则转换后rc(-10,-20,10,0)
                                                若rc(110,120,400,400),则转换后rc(0,0,290,280)


OffsetRect(RECT*, int dx, int dy)  ---移动矩形,从感官上:dx为正,右移,为负,则左移;dy为正,下移,为负,上移。若rc(100,100,150,150)
                                                         dx=0,dy=1,则转换后rc(100,101,150,151)
                                                         dx=-50,dy=-10,则转换后rc(50,90,100,140)
  使用1:将窗口相对屏幕坐标转为相对窗口左上角坐标(即0 0 宽 高)

RECT rc;
::GetWindowRect(hwnd, &rc);
::OffsetRect(&rc, -rc.left, -rc.top);
/*当然也可以
rc.right -= rc.left;
rc.bottom -= rc.top;
rc.left = rc.top = 0;
*/

  使用2:计算客户区相对窗口左上角的坐标

//MFC下
RECT rc, rcClient; GetWindowRect(&rc);//窗口的屏幕坐标 GetClientRect(&rcClient);
ClientToScreen(&rcClient);//客户区的屏幕坐标 ::OffsetRect(&rcClient, -rc.left, -rc.top);//客户区相对与窗口左上角的坐标

BOOL PtInRect(const RECT*lprc, POINT pt); 判断pt点是否在RECT内,是则返回非0;注意客户区和屏幕坐标使用时的转换。

BOOL AdjustWindowRect(RECT *prc /*in/out*/, DWORD dwStyle, BOOL bMenu)  --假设传入的RECT为客户区的屏幕坐标,然后返回计算后的窗口坐标
                                       --适用于需要客户区大小为固定的情况,比如扫雷游戏客户区宽高应为方块的倍数
                                      --因为MoveWindow或SetWindowPos需要的是窗口坐标,它们常结合起来用
                                    --参数没有窗口句柄,因此坐标是根据窗口风格来计算的。第2个参数应指定恰当的风格。
                                  --第3个参数:窗口是否有MENU,就是[文件-编辑-查看..]那条菜单栏

//一对话框程序
RECT rcc = {, , , };
::AdjustWindowRect(&rcc, GetWindowLong(hwnd, GWL_STYLE), FALSE);//rcc(-8, -30, 388, 268)
::SetWindowPos(hwnd, HWND_TOP, , , rcc.right-rcc.left, rcc.bottom-rcc.top, SWP_SHOWWINDOW);//客户区宽高依然为380 260
//或::MoveWindow(hwnd, 10, 10, rcc.right-rcc.left, rcc.bottom-rcc.top, TRUE);

还有AdjustWindowRectEx,多了第4个参数DWORD dwExStyle,例如创建窗口时指定了WS_EX_TOOLWINDOW扩展风格(该风格使标题栏更小),那你就应该使用AdjustWindowRectEx来指定该扩展风格以正确计算出窗口大小!

FrameRect(HDC, const RECT*, HBRUSH) --画1逻辑单位宽度的边框,坐标由RECT指定
FillRect(HDC, const RECT*, HBRUSH)--填充矩形

----------因为画刷句柄直接传给第三个参数了,因此,用CreateSolidBrush等创建的画刷是不需要SelectObject的。当然还是需要DeleteObject删除该句柄的--------

 

Client Window坐标 RECT相关函数的更多相关文章

  1. canvas中window坐标转换为canvas坐标

    function getMousePos(canvas, evt) { var rect = canvas.getBoundingClientRect(); return { x: evt.clien ...

  2. VNCServer,SSH Secure Shell Client,window远程控制linux

    1.VNC远程连接linux图形化桌面 2.SSH Secure Shell Client连接linux终端 3.设置FTP与linux传输文件 1.VNC远程连接linux图形化桌面 在centos ...

  3. X Window 程式设计

    X Window 程式设计 转   http://www.cppblog.com/zmj/archive/2007/05/18/24331.html X Window 程式设计 X Window 程式 ...

  4. 一个view相对于屏幕或者另外一个view 的坐标

    如果想知道一个view相对于屏幕或者另外一个view 的坐标,那么可以通过如下的方法得到: UIWindow * window=[[[UIApplication sharedApplication] ...

  5. unity3d创建window

    unity3d创建windwo的方法如下: GUILayout.Window (, new Rect (50, 50, 200, 100), Func1, "窗口1"); 第一个参 ...

  6. Unity3D 一个较常见的错误信息“rect[2] == rt->GetGLWidth() && rect[3] == rt->GetGLHeight()”

    rect[2] == rt->GetGLWidth() && rect[3] == rt->GetGLHeight() 这个错误信息的具体含义我还不太清楚.它出现以后会不停 ...

  7. X Window 设定介绍

    在 Unix Like 上面的图形用户接口 (GUI) 被称为 X 或 X11 X11 是一个『软件』而不是一个操作系统: X11 是利用网络架构来进行图形接口的执行与绘制: 最著名的 X 版本为 X ...

  8. nuxt Window 或 Document未定义解决方案

    概述 在用nuxt开发服务端渲染项目并引入第三方库的时候,经常会遇到window或document未定义的情况,原因是这个第三方库里面用到了window或者document,然后在服务端打包的时候,n ...

  9. u3d中 rect[2] == rt->GetGLWidth() && rect[3] == rt->GetGLHeight()错误的原因及解决方法

    原文:http://blog.csdn.net/wolf96/article/details/38363161 官方是这么解释的 http://issuetracker.unity3d.com/iss ...

随机推荐

  1. 《Linux内核分析》第八周 进程的切换和系统的一般执行过程

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK EIGHT ...

  2. EntityFramework优缺点

    高层视图: 改变在现有系统使用EntityFramework的优势是什么? • All -in-1框架的类映射表,需要编写映射代码, 并且是很难维护的. • 可维护性,易于理解的代码,无需创造大的数据 ...

  3. 一篇文章让Oracle程序猿学会MySql【未完待续】

    一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...

  4. wp8.1 VS2013部署手机发生 DEP6100 6200错误

    wp8.1 VS2013部署手机发生 DEP6100 6200错误 ,提示未发现手机. 可能是数据线有问题 建议更换 本人的电脑有很多次,提示DEP6100 6200错误,每一次都需要重做系统.. 然 ...

  5. PHP会话管理:cookie和session

    PHP会话管理1.cookie数据存储在浏览器端方便与JavaScript交换数据方便获取用户信息风险-浏览器可能会禁用cookie替代方案-URL参数 2.session数据存储在服务器高效.安全. ...

  6. SpringSecurity操作指南-基于Spring、SpringMVC和MyBatis自定义SpringSecurity权限认证规则

  7. Git过滤文件和文夹

    今天是2016年10月份的最后一天,感觉时间过得真的是飞快呢,此刻天下着小雨,天气灰蒙如天每个人的心情一样.在此把这个月的项目上传到git上,就需要过滤一些项目自动生成的不必要的文件,如:bin,ob ...

  8. Android OnTouchListener 导致 OnClickListener 接收不到消息 无反应

    原因是onTouch返回了true把消息给消耗掉了,所以OnClickListener接收不到消息. 解决办法:onTouch返回false

  9. C# 文件重命名

    记得C# File类中是没有rename这个方法 所以网上很多都用的是move moveTo copy+delete等这些方法 其实以上的方法 虽然可以实现功能 但看起来总觉得很蛋疼 今天百度 突然发 ...

  10. TortoiseGit 连接oschina不用每次输入用户名和密码的方法

    每次git clone 和push 都要输入用户名和密码.虽然安全,但在本机上每次都输有些麻烦,如何记住用户名和密码呢? 在网上看了各种方法,太杂,很多可能环境不一样,一直行不通.最后找到一种有效的方 ...