现成的文本输入对话框






4.40/5 (9投票s)
2001 年 7 月 18 日
3分钟阅读

92693

2104
本文提供了一个现成的类,用于通过提示对话框进行简单的用户字符串输入——无需对话框模板!
引言
在编程应用程序时,我曾多次需要用户输入单行文本,例如要创建的新对象的名称。一开始,我为每个实例创建了一个对话框模板,其中包含正确的标题和控件。然后我意识到这在代码、资源和时间方面都非常浪费。所以我创建了一个通用的对话框模板和类,该模板和类将接受用户输入,给定提示和窗口标题。然而,从那时起,我意识到即使这样也不是最理想的——每次你需要使用该类时,你都必须将对话框资源复制到新项目中,因此,受 Chris Maunder 的进度窗口类启发,CTextEntryDlg
类诞生了。
用法
该类使用起来非常简单。首先,在你的 .cpp 文件中,添加一个 #include 指令,如下所示
#include <TextEntryDlg.h>
现在,你需要创建该类的一个实例。这只需声明一个类型为 CTextEntryDlg
的变量,如下所示
CTextEntryDlg dlgTextEntry;
下一步是显示对话框。这可以通过调用 Show(...)
函数来完成。该函数具有以下签名
int Show(CWnd *pParent, LPCTSTR pszTitle, LPCTSTR pszPrompt, LPCTSTR pszDefault = _T(""), bool bPassword = false)
在 pParent 参数中,我们传递一个指向父窗口的指针。这是为了确保对话框的模态循环正常工作。pszTitle 参数应设置为你希望在窗口标题栏中使用的字符串。pszPrompt 参数应设置为你希望用于提示的字符串,该字符串将放置在编辑控件正上方的静态控件中。pszDefault 参数是一个应该开始使用的字符串。如果未提供任何参数,则在创建对话框时编辑框为空。如果 bPassword 参数为 true,则编辑框将使用 ES_PASSWORD
样式创建。
当此函数返回时,你可以确定对话框是否被取消,以及用户输入了什么字符串。以下是可能的返回值
0 | 对话框未成功创建。 |
IDOK | 对话框已通过“确定”按钮关闭,或用户按下了 ENTER 键 |
IDCANCEL | 对话框已通过“取消”按钮关闭,或用户按下了 ESCAPE 键 |
一旦你确定用户点击了“确定”,你可以使用 GetText()
函数获取输入的字符串(即使选择了“取消”,该函数也会返回正确的字符串)。为了简单起见,GetText()
函数返回一个 LPCTSTR
,但你可以直接将其放入一个 CString
中
CString strResult = dlgTextExtry.GetText();
基本上就是这样!
幕后
该类的内部工作原理相对简单。基本上,在 Show()
函数中,构成窗口的控件是动态创建的。这里需要注意的重要几点是编辑控件使用 CreateEx
,否则无法使用“client”边框创建它,以及为每个控件专门设置字体的方式。
然后,该函数调用私有函数 DoModal()
,该函数基本上禁用了父窗口,然后调用 RunModalLoop()
。此后,与 Windows 的交互纯粹基于消息。然而,需要注意的另一个重要点是 PreTranslateMessage
中的附加代码。它用于处理 Escape 和 Tab 键的按下,几乎没有变化地从 MFC 源文件中的 dlgcore.cpp 中提取。
结论
希望你觉得这篇文章及其附带的源代码有用,如果你有任何问题,请随时给我发邮件(点击页面顶部的我的名字)。
更新
- 2002 年 1 月 27 日
- 修复了焦点未返回到 WinME 中父窗口的问题
- 修复了 Windows 2000 和 XP 中的闪烁问题
- 更正了计算对话框高度的例程