lm68140318 发表于 2023-4-27 12:41:52

GetClientRect和GetWindowRect


        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个像素   ??

isdkz 发表于 2023-4-27 12:43:47

`GetClientRect`和`GetWindowRect`两个函数之所以返回的宽度和高度不同,是因为它们获取的区域不同。`GetClientRect`函数获取的是窗口的客户区坐标,而`GetWindowRect`获取的是窗口的整个区域(包括边框、标题栏等)。

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

如果你只关心列表视图控件的客户区大小(例如,你想知道可以显示多少内容),你应该使用`GetClientRect`。如果你关心整个控件的大小,包括边框等,则应该使用`GetWindowRect`。在这种情况下,你可能需要将获取到的屏幕坐标转换为客户区坐标,就像你在代码中所做的那样。
页: [1]
查看完整版本: GetClientRect和GetWindowRect