鱼C论坛

 找回密码
 立即注册
查看: 586|回复: 1

[已解决]GetClientRect和GetWindowRect

[复制链接]
发表于 2023-4-27 12:41:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        HWND hWnd = GetSafeHwnd();//获取代码所在顶级窗口的句柄
        CWnd* pWnd = CWnd::FromHandlePermanent(hWnd); //HWND转化为CWND

        CWnd* pWnd1 = GetDlgItem(IDC_LIST1);//列表视图控件1的句柄
        HWND hWnd1 = pWnd1->GetSafeHwnd();
        
        pWnd1->GetClientRect(&rect);//获取窗口客户区的坐标
        int width = rect.right;  //控件宽
        int height = rect.bottom;  //控件高

        ::GetWindowRect(hWnd1, &rect1);//列表视图控件1相对于屏幕坐标
        pWnd->ScreenToClient(&rect1);//屏幕坐标转换为客户区坐标


我的问题:我用GetClientRect和GetWindowRect两个函数分别获取 列表视图控件的坐标,可是两个函数获取的宽高不相同,差4个像素   ??
最佳答案
2023-4-27 12:43:47
`GetClientRect`和`GetWindowRect`两个函数之所以返回的宽度和高度不同,是因为它们获取的区域不同。`GetClientRect`函数获取的是窗口的客户区坐标,而`GetWindowRect`获取的是窗口的整个区域(包括边框、标题栏等)。

在你的例子中,你使用`GetClientRect`函数获取的是列表视图控件的客户区大小,而使用`GetWindowRect`获取的是列表视图控件的整个区域大小。这就是为什么两个函数返回的宽度和高度会有4个像素的差距。

如果你只关心列表视图控件的客户区大小(例如,你想知道可以显示多少内容),你应该使用`GetClientRect`。如果你关心整个控件的大小,包括边框等,则应该使用`GetWindowRect`。在这种情况下,你可能需要将获取到的屏幕坐标转换为客户区坐标,就像你在代码中所做的那样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-27 12:43:47 | 显示全部楼层    本楼为最佳答案   
`GetClientRect`和`GetWindowRect`两个函数之所以返回的宽度和高度不同,是因为它们获取的区域不同。`GetClientRect`函数获取的是窗口的客户区坐标,而`GetWindowRect`获取的是窗口的整个区域(包括边框、标题栏等)。

在你的例子中,你使用`GetClientRect`函数获取的是列表视图控件的客户区大小,而使用`GetWindowRect`获取的是列表视图控件的整个区域大小。这就是为什么两个函数返回的宽度和高度会有4个像素的差距。

如果你只关心列表视图控件的客户区大小(例如,你想知道可以显示多少内容),你应该使用`GetClientRect`。如果你关心整个控件的大小,包括边框等,则应该使用`GetWindowRect`。在这种情况下,你可能需要将获取到的屏幕坐标转换为客户区坐标,就像你在代码中所做的那样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 21:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表