如何找到控件相对于其父窗口的位置是最佳方式?

5

据我所知,至少有两种方法可以做到这一点。

如何找到Win32控件/窗口相对于其父窗口的位置?

还有这个:

如何在MFC中获取放置在对话框上的控件的大小和位置?

    htext := GetDlgItem(hDlg, IDI_TEXT);
    GetWindowRect(htext, R);
    // (1)
    // Pt := Point(R.Left, R.Top);
    // ScreenToClient(hDlg, Pt);
    // R := Rect(Pt.X, Pt.Y, Pt.X + R.Right - R.Left, Pt.Y + R.Bottom - R.Top);
    // OR: (2)
    MapWindowPoints(0, {GetParent(htext)} hDlg, R, 2);
    FrameRect(dc, R, brush);

哪种方法更好,为什么?使用 MapWindowPoints 的方法是否适用于多个显示器?
我的主要担忧是 MapWindowPoints 和多显示器,因为将 0 作为 hWndFrom 传递将使用 HWND_DESKTOP

1
MapWindowPoints 考虑了 RTL 读取,而 ScreenToClient 没有。顺便说一句,也许你应该重新表达问题,因为有人投票将其关闭,认为它是基于观点的。 - TLama
1
@TLama,这可能是“基于观点的”,但我需要知道为什么以及证据。您提到了RTL的一个好观点,但我在这里没有看到测试用例。ScreenToClient(1)会失败,而MapWindowPoints(2)不会吗? - kobik
1
如果一个窗口具有 WS_EX_LAYOUTRTL 样式,它的内容会被镜像(您可以尝试一下)。在这种情况下,MapWindowPoints 将正确返回镜像点,而 ScreenToClient 则返回一个好像没有镜像的点。这就是为什么我更喜欢使用 MapWindowPoints 的原因。 - TLama
@TLama,你关于WS_EX_LAYOUTRTL的说法是正确的。ScreenToClient失败了。那么多个显示器呢? - kobik
2
多个显示器都可以,两个都可以。 - Sertac Akyuz
@SertacAkyuz,谢谢你的信息! - kobik
1个回答

3

由于@TLama拒绝接受荣誉并发布答案,我将为他发布一个答案以确定它。(谢谢!:))


使用方法 (1) ScreenToClient 的最明显问题是,如果对话框窗口具有 WS_EX_LAYOUTRTL 样式并且其内容被镜像,则该方法会失败。
在这种情况下,方法 (2) MapWindowPoints 将正确返回镜像点。
我没有发现除了 WS_EX_LAYOUTRTL 之外的其他区别。
两种方法都可以很好地处理多个监视器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接