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

时间:2017-10-17 22:21:04

标签: c winapi dialog items

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

如何复制按钮坐标并将其他按钮坐标设置为复制值?

实施例。可以说我有......

PB_ONE
PB_TWO

如何抓取PB_ONE的坐标并将PB_TWO的坐标设置为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);

当前必须用p.x替换rcButton.left和rcButton.top,并使用rcButton.top的硬值来使按钮在对话框屏幕上定位。

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

1 个答案:

答案 0 :(得分:3)

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

<小时/> 编辑:

RECT rcButton;
HWND hbutton1 = GetDlgItem(hDlg, PB_ONE);
HWND hbutton2 = GetDlgItem(hDlg, PB_TWO);

//if(!hbutton1 || !hbutton2) {error...}

GetWindowRect(hbutton1, &rcButton);

//Test
char buf[50];
sprintf(buf, "%d %d", rcButton.left, rcButton.top);
MessageBoxA(0, buf, "screen coord", 0);

//Note, this will only convert the top-left corner, not right-bottom corner
//but that's okay because we only want top-left corner in this case
ScreenToClient(hDlg, (POINT*)&rcButton);

//Test
sprintf(buf, "%d %d", rcButton.left, rcButton.top);
MessageBoxA(0, buf, "client coord", 0);

ShowWindow(hbutton1, SW_HIDE);
SetWindowPos(hbutton2, 0, rcButton.left, rcButton.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);

<小时/> 一种稍微简单的方法是使用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中使用它。