前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >屏幕坐标与客户坐标的区别

屏幕坐标与客户坐标的区别

作者头像
gaigai
发布2019-09-29 10:58:55
2K0
发布2019-09-29 10:58:55
举报
文章被收录于专栏:Windows开发Windows开发

屏幕坐标是相对于屏幕左上角(0,0)位置的坐标,客户坐标是相对于某个窗口客户区左上角的坐标,当谈到客户坐标时需要说明是相对哪个窗口的客户坐标。

如上图,点A(屏幕左上角),点B(应用主窗口客户区左上角),控件1的C点的屏幕坐标和客户坐标是不同的,屏幕坐标是相对于A点坐标(50,100),客户坐标(相对于父窗口)是相对于B点坐标(20,50)。

Windows有五个API跟屏幕坐标、客户坐标有关,要注意区分。

第一,GetWindowRect(HWND, LPRECT) 获取指定窗口在屏幕的位置,要特别注意该窗口不区分POPUP窗口还是子窗口(子控件)。

第二,GetClientRect(HWND, LPRECT) 获取指定窗口的客户区(不包含标题栏)。

第三,ScreenToClient(HWND, LPPOINT) 将屏幕坐标转换为相对于指定窗口的客户坐标。

第四,ClientToScreen(HWND, LPPOINT) 将相对于指定窗口的客户坐标转换为屏幕坐标。

第五,CreateWindow() 创建窗口,其中窗口位置的坐标跟窗口类型有关,如果窗口是POPUP或OVERLAPPED(也就是指定WS_POPUP或WS_OVERLAPPED)时为屏幕坐标,如果窗口是子窗口(子控件)时为相对于父窗口的客户坐标。

通过控件1的位置向右平移计算控件2的位置并创建,步骤如下:

第一,调GetWindowRect()指定控件1的句柄,获取控件1的屏幕坐标。

第二,调ScreenToClient()指定父窗口句柄,获取控件1在父窗口的客户坐标。

第三,调OffsetRect()将客户坐标向右平移

第四,调CreateWindow()指定平移后的坐标,就是控件2的窗口位置。

笔者开发过程中误以为GetWindowRect()返回的坐标跟窗口类型有关,如果窗口是子窗口(控件)时是客户坐标,缺少调用ScreenToClient()接口,导致位置不对。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Windows开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档