如何得到应用程序的客户区位置与大小?

wpmsoft 2003-11-25 03:06:01
有一个对话框应用程序,有自己的标题栏与菜单,现在想在获得其客户区的坐标(top,left,bottom,right),要求是相对于屏幕的坐标,即屏幕的左上角为(0,0),请问该如何解决此问题?
...全文
227 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
flinming 2003-11-25
  • 打赏
  • 举报
回复
GetClientRect rect

rect.botton,rect.right不就是你客户区的大小

ClientToScreen转换就可得到你的位置。。。。。。。


nonocast 2003-11-25
  • 打赏
  • 举报
回复
首先单单GetClientRect(&rc)是不够的
之后还需要ClientToScreen(&rc)
得到的rc的值才是窗口相对屏幕的相对位置

我想可能你将此段代码放在了初始化中
在还没有显示的时候是得不到正确的相对位置的
你可以在试图中加一个Button,再看看rc的值

如再不行,可将代码一并发给我
我帮你看看,好吗?
o_nono@163.net

-----------------------
May you succeed!
------------------------
wpmsoft 2003-11-25
  • 打赏
  • 举报
回复
都不对呀!!!!!!!

无论我的窗口显示在屏幕的什么位置,GetClientRect()得到的left与top都是0。换言之,经转换后,它们相对于屏幕的坐标也是相同的。 请问, 屏幕是不同位置的一个区域,其相对于屏幕的位置可能一样吗????

烦劳各位大哥仔细研究一下再做回答。
handsomerun 2003-11-25
  • 打赏
  • 举报
回复
真惭愧,就是GetClientRect
tyzam 2003-11-25
  • 打赏
  • 举报
回复
没错,GetClientRect得到的是客户端的rect,ClientToScreen得到的是相对屏幕的坐标
tyzam 2003-11-25
  • 打赏
  • 举报
回复
CRect rect;
GetClientRect(&rect);//top=0,bottom=666,left=0;right=1016
ClientToScreen(rect);//top=64,bottom=730,left=4;right=1020
zhansg 2003-11-25
  • 打赏
  • 举报
回复
呵呵,这么简单的问题。

CRect rect;
//得到客户区区域,相对于应用程序
GetClientRect(rect);
//从客户区坐标转为屏幕坐标
ClientToScreen(rect);
//rect的left,top,right,bottom就是对话框相对于屏幕左上角的坐标了。

千万不能用GetWindowRect,他获得的是应用程序窗口的坐标,其中包含了client、boder等
建议你好好看看msdn.
carbon107 2003-11-25
  • 打赏
  • 举报
回复
ClientToScreen(rect);这个也不行吗??
wpmsoft 2003-11-25
  • 打赏
  • 举报
回复
GetWindowRect获得的尺寸是相对于屏幕左上角的,这个没错!!但是它的尺寸及位置是应用程序的窗口的,而不是它的客户区的!!!请注意,这个是不一样的。

应用程序的窗口永远都要比客户区大。

问题的关键是要得到客户区相对于屏幕左上角的尺寸及大小。
zhyfeng 2003-11-25
  • 打赏
  • 举报
回复
handsomerun(毛毛)说得是对的。
handsomerun 2003-11-25
  • 打赏
  • 举报
回复
好像GetWindowRect获得的尺寸是相对于屏幕左上角的
carbon107 2003-11-25
  • 打赏
  • 举报
回复
GetClientClient(&rect);
//得到了吧,保存起来
kk = rect;

ClientToScreen(rect);
//相对于屏幕的


rect.left-kk.left;
rect.right-kk.right;
rect.bottom-kk.bottom;
rect.top-kk.rect.top;
handsomerun 2003-11-25
  • 打赏
  • 举报
回复
呵呵,是不是高手们都在阴沟里翻船了
 我看了一下msdn,msdn说,rect的left和top值都是0,right和bottom则是宽和高啊!!
wpmsoft 2003-11-25
  • 打赏
  • 举报
回复
没有这样子简单吧,各位老大。GetClientRect得到的客户区的坐标,这个不假。可是它的左上顶点始终为(0,0),而这不是我所要求的。如果把(0,0)转换为屏幕坐标,则肯定在屏幕的最左上角!!!!这显示是错误的呀。

如果用ClientToScreen()进行转换,得到了大小,但是没有得到位置。可能还需要做一个偏移。可是,我无法得到偏移量。这就是本问题的关键所在。

还望高手们指教。
zhucde 2003-11-25
  • 打赏
  • 举报
回复
测试一下不就知道了!
vcforever 2003-11-25
  • 打赏
  • 举报
回复
wpmsoft (红旗下的蛋) 好象很长时间没来了!
忙什么去了?
俺来晚了,就不说了!上面已经说的很清楚了!
handsomerun 2003-11-25
  • 打赏
  • 举报
回复
真的假的啊,用GetClientRect获得rect的left和top值都是0吧
carbon107 2003-11-25
  • 打赏
  • 举报
回复
CRect rect;
GetRectClient(&rect);
rect的top, left, bottom ,right就是相对于屏幕的
用ScreenToClient(rect)就转换为相对于父窗口的了
VCSQLVB 2003-11-25
  • 打赏
  • 举报
回复
简单,接分了。
CRect rect;
GetClientRect(&rect);
rect.TopLeft().y 对应 top
rect.TopLeft().x 对应 left
rect.BottomRight().y 对应 bottom
rect.BottomRight().x 对应 right

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧