使用 DialogBoxIndirect 时,如何获取用户在对话框关闭时输入的文本?

When using DialogBoxIndirect, how do I get text the user entered when the dialog closes?

我正在使用 DialogBoxIndirect() 在内存中创建模式对话框。我添加到对话框中的控件之一具有 EDIT class,因此用户可以在对话框中键入信息。当对话框关闭时,我如何找出用户在 EDIT 字段中输入的内容?我没有 EDIT 字段或对话框本身的 HWND,我只有 ID。我知道的唯一方法是 GetWindowText(),但这需要 HWND。

代码片段:

//-----------------------
// Define Edit Input
//-----------------------
lpw = lpwAlign(lpw);    // Align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE)lpw;
lpdit->x = 10; lpdit->y = 10;
lpdit->cx = 150; lpdit->cy = 25;
lpdit->id = ID_TEXT2;       // Text input
lpdit->dwExtendedStyle = WS_EX_CLIENTEDGE;
lpdit->style = WS_CHILD | WS_VISIBLE;
lpw = (LPWORD)(lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0081;        // Edit class
lpwsz = (LPWSTR)lpw;
nchar = MultiByteToWideChar(CP_ACP, 0, lpszMessage, -1, lpwsz, 50);
lpw += nchar;
*lpw++ = 0;             // No creation data

//-----------------------
// Define an OK button.
//-----------------------
lpw = lpwAlign(lpw);    // Align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE)lpw;
lpdit->x = 10; lpdit->y = 40;
lpdit->cx = 35; lpdit->cy = 13;
lpdit->id = IDOK;       // OK button identifier
lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
lpw = (LPWORD)(lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080;        // Button class
lpwsz = (LPWSTR)lpw;
nchar = MultiByteToWideChar(CP_ACP, 0, "OK", -1, lpwsz, 50);
lpw += nchar;
*lpw++ = 0;             // No creation data

GlobalUnlock(hgbl);
ret = DialogBoxIndirect(hinst, (LPDLGTEMPLATE)hgbl, GetFocus(), (DLGPROC)GenericDlgProc);
// How do I get the text here, that the user entered into control id ID_TEXT2?

您可以使用 GetDlgItemText() 通过编辑控件的 ID 从编辑控件中获取文本;基本上,它所做的是一个 GetDlgItem() 后跟一个 GetWindowText() 全部在一个有用的函数调用中。

然而,当您的 DialogBoxIndirect() 调用返回时,为时已晚 - 对话框消失了,控件也随之消失了。一旦控件被销毁,您将无法读取控件的值。

处理此问题的通常方法是在 DialogProc 中处理 WM_DESTROY,并在其中保存控件值(或者,如果您有一个“确定”按钮和一个“取消”按钮,您可以这样做这在 WM_COMMAND 处理程序中用于 IDOK