65.9K
CodeProject 正在变化。 阅读更多。
Home

现成的文本输入对话框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (9投票s)

2001 年 7 月 18 日

3分钟阅读

viewsIcon

92693

downloadIcon

2104

本文提供了一个现成的类,用于通过提示对话框进行简单的用户字符串输入——无需对话框模板!

Text entry dialog

Demo application

引言

在编程应用程序时,我曾多次需要用户输入单行文本,例如要创建的新对象的名称。一开始,我为每个实例创建了一个对话框模板,其中包含正确的标题和控件。然后我意识到这在代码、资源和时间方面都非常浪费。所以我创建了一个通用的对话框模板和类,该模板和类将接受用户输入,给定提示和窗口标题。然而,从那时起,我意识到即使这样也不是最理想的——每次你需要使用该类时,你都必须将对话框资源复制到新项目中,因此,受 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 中的闪烁问题
    • 更正了计算对话框高度的例程
© . All rights reserved.