WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框

WinAPI Creating a second dialogbox after clicking a button control on the first dialogbox and destroying the first

本文关键字:对话框 第一个 第二个 创建 按钮 单击 WinAPI 控件      更新时间:2023-10-16

我正在尝试让用户在第一个对话框中单击"确定"后使第二个对话框提示用户,同时销毁进程中的第一个对话框。

这是我的第一个对话框,在用户单击主窗口本身上的按钮后弹出。

void displayDialogW(HWND hWnd)
{
HWND hDlg = CreateWindowW(L"myDialogClass", L"Enter Desired Width", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 150, 300, 150, hWnd, NULL, NULL, NULL);
CreateWindowW(L"static", L"Width: ", WS_VISIBLE | WS_CHILD | WS_BORDER, 30, 20, 100, 20, hDlg, NULL, NULL, NULL);
CreateWindowW(L"edit", L"...", WS_VISIBLE | WS_CHILD | WS_BORDER, 80, 20, 180, 20, hDlg, NULL, NULL, NULL);
CreateWindowW(L"button", L"OK", WS_VISIBLE | WS_CHILD, 120, 60, 30, 30, hDlg, (HMENU)5, NULL, NULL);
TCHAR buff[1024];
GetWindowText(hDlg, buff, 1024);
desiredWidth = _wtoi(buff);
EnableWindow(hWnd, false);
}

第二个对话框或多或少与第一个对话框相同,但我不确定如何操作第一个对话框中的按钮以确保它打开第二个对话框并同时销毁第一个窗口。

我找到了一个名为 DestroyWindow 的函数,但它需要一个 hDlg 输入,所以我不能完全把它放在我的 dialogprodecure 命令函数中。所以,我不太确定我会怎么做。

如果要立即销毁第一个对话框,则第二个对话框不能将第一个对话框作为父对话框。相反,您可以打开第二个对话框,将父对话框设置为与第一个对话框相同的父对话框,然后可以安全地销毁第一个对话框。

case IDOK:                                          // assuming hWnd is first dialog
{
createSecondDialog(GetWindow(hWnd, GW_OWNER));  // open second dialog
DestroyWindow(hWnd);                            // close first dialog
}

这是使用GetWindow(hWnd, GW_OWNER)而不是GetParent(hWnd)因为displayDialogW创建一个具有WS_OVERLAPPED样式的窗口,在这种情况下,传递到CreateWindowW调用的内容必须是新窗口的所有者(根据拥有窗口的文档(。

DestroyWindow:

如果指定的窗口是父窗口或所有者窗口,则销毁窗口 在关联的子窗口或拥有的窗口时自动销毁 销毁父窗口或所有者窗口。函数首先销毁子项 或拥有的窗口,然后销毁父窗口或所有者窗口。

打开子窗口后,可以隐藏父窗口,如下所示:

case ID_BUTTON1:
{
displayDialogW(hWnd);
SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_HIDEWINDOW);
}

更新:

从 A 窗口可以有父级或所有者,但不能同时具有两者,

请注意,更改窗口的父级或所有者不是正常的 操作。

但是,如果您必须销毁父窗口,则可以使用SetParent根据ReincontinueMonica的评论实现它。