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

Posted

技术标签:

【中文标题】使用 DialogBoxIndirect 时,如何在对话框关闭时获取用户输入的文本?【英文标题】:When using DialogBoxIndirect, how do I get text the user entered when the dialog closes? 【发布时间】:2015-06-26 21:34:48 【问题描述】:

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

代码sn-p:

//-----------------------
// 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】:

您可以使用GetDlgItemText() 使用其 ID 从编辑控件中获取文本;基本上,这是一个GetDlgItem(),然后是一个GetWindowText(),所有这些都在一个有用的函数调用中。

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

处理这个问题的常用方法是在DialogProc 中处理WM_DESTROY,并将控制值保存在那里(或者,如果您有一个确定和一个取消按钮,您可以在WM_COMMAND 中执行此操作IDOK 的处理程序)。

【讨论】:

以上是关于使用 DialogBoxIndirect 时,如何在对话框关闭时获取用户输入的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 observable 更新数组时更新 *ngFor 以及如何在网站加载时初始化 observable?

按下标签栏项目时如何显示警报视图以及在其他目标中使用时如何忽略它?

在使用 jupyter notebook 时如何在 pandas 中使用 Dataframe 时查看完整数据? [复制]

使用`FALLBACK`时如何知道是不是返回左值?

使用google可视化api时,使用dashboard时如何使用getChartLayoutInterface()

使用自定义列表视图时如何使用意图