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

时间:2015-06-26 21:34:49

标签: c++ c winapi dialog modal-dialog

我正在使用DialogBoxIndirect()在内存中创建一个模态对话框。我正在添加到对话框的控件之一具有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?

1 个答案:

答案 0 :(得分:2)

您可以使用GetDlgItemText()使用其ID从编辑控件中获取文本;基本上它的作用是在一个有用的函数调用中GetDlgItem()后跟GetWindowText()

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

解决这个问题的常用方法是在WM_DESTROY中处理DialogProc,并在那里保存控件值(或者,如果你有一个OK和一个Cancel按钮,你可以在相反,WM_COMMAND的{​​{1}}处理程序。