C 如何将一个对话框的位置坐标复制到另一个对话框中?

C 如何将一个对话框的位置坐标复制到另一个对话框中?,c,winapi,dialog,items,C,Winapi,Dialog,Items,我有几个独特的按钮,我只想一次显示其中一个。我希望它们居中,所以我有第一个按钮在对话框的中心。如果我想显示第三个按钮,我想给它第一个按钮的坐标,并隐藏第一个按钮 如何复制一个按钮坐标并将另一个按钮坐标设置为复制的值 假设我有 PB_ONE PB_TWO 如何获取PB_ONE的坐标并将PB_ONE的坐标设置为PB_ONE RECT rcButton; GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton); 上面的代码捕获了我要从中复制坐

我有几个独特的按钮,我只想一次显示其中一个。我希望它们居中,所以我有第一个按钮在对话框的中心。如果我想显示第三个按钮,我想给它第一个按钮的坐标,并隐藏第一个按钮

如何复制一个按钮坐标并将另一个按钮坐标设置为复制的值

假设我有

PB_ONE
PB_TWO
如何获取PB_ONE的坐标并将PB_ONE的坐标设置为PB_ONE

RECT rcButton;

GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton);
上面的代码捕获了我要从中复制坐标的对话框项。是否有一个简单的命令将另一个对话框按钮设置为此对话框坐标

类似SetDlgItem()的内容

更新了我根据答案尝试的新代码

GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton);
ClientToScreen(hDlg, &p);
OffsetRect(&rcButton, -p.x, -p.y);
SetWindowPos(GetDlgItem(hDlg, PB_TWO), 0, rcButton.left, rcButton.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
ShowWindow(GetDlgItem(hDlg, PB_TWO), SW_SHOW);
必须将当前的rcButton.left和rcButton.top替换为p.x和rcButton.top的硬值,以使按钮在对话框屏幕上定位


这会在SetWindowPos中返回一个错误,其中参数3无法将LONG*转换为INT。

GetWindowRect
以屏幕坐标给出矩形。您可以使用
ScreenToClient(HWND-HWND,LPPOINT-LPPOINT)
将其转换为客户端坐标


编辑:


一种稍微简单的方法是使用
ClientToScreen(HWND-HWND,LPPOINT-LPPOINT)
,如下所示:

RECT rcButton;
GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton);

POINT p{ 0 };
ClientToScreen(hDlg, &p);
//p is now (0,0) of parent window in screen coordinates
OffsetRect(&rcButton, -p.x, -p.y);

rcButton
现在是相对于父窗口左上角的坐标。您可以在
SetWindowPos
中使用它

这给了我SetWindowPos调用的一个错误-Param 3无法将LONG*设置为INTMy故障-我使用了&-代码工作正常。但是按钮不在屏幕上,我假设它位于位置0,0?请尝试编辑部分。您应该使用调试断点或
OutputDebugString
查看您得到的值。如果可能,将对话框移到桌面屏幕的左上角,使屏幕和客户端坐标大致相同(这仅适用于测试)。尝试按原样复制/粘贴“编辑”部分中的代码。我添加了一些
MessageBox
来检查这些值,但是您可以使用debug断点或OutputDebugString来查看这些值;p、 y=0ClientToScreen之前进行编码>。同时隐藏
PB\u ONE
。您说您已经将
&rcButton.left
更改为
rcButton.left
?是的,我更改了。但是,这些坐标始终不在屏幕上。我必须使用p.x而不是rcButton.left来获得正确的按钮位置
RECT rcButton;
GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton);

POINT p{ 0 };
ClientToScreen(hDlg, &p);
//p is now (0,0) of parent window in screen coordinates
OffsetRect(&rcButton, -p.x, -p.y);