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=0在调用ClientToScreen
之前进行编码>。同时隐藏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);