Winforms Textbox - 使用 Ctrl-Backspace 删除整个单词)。在 VS 2019 中,该行为从一开始就可用。
有没有人有一个简单的 MFC 解决方案来更改 CComboBox 等控件的“开箱即用”行为,以删除最近的整个单词,而不是输出字符 127“方块”?我在网上看到一些项目实现了整个自动完成界面,但这对于我需要的一项更改来说太过分了。更糟糕的情况是,我想我可以对控件进行子类化,并在 wnd 消息循环中,每当遇到字符 127 时删除最后一个单词。我想听听你的建议:-)
为了测试,我创建了一个非 MFC Win32 应用程序,显示一个包含标准 Win32 编辑控件的对话框。按 Ctrl + Backspace 插入字符 127 而不是删除最后一个单词,即默认显示“旧”行为。
这可以通过启用编辑控件的自动完成来更改。在源中添加以下行:
// Your MFC project may already be including these
#include <objbase.h>
#include <shlwapi.h>
在您的 InitInstance()
函数(MFC 中的
CWinApp::InitInstance()
)中添加:
CoInitialize(NULL); // The documentation suggests using CoInitializeEx() instead
在对话过程中的WM_INITDIALOG
消息处理块中添加以下行:
SHAutoComplete(GetDlgItem(hDlg, IDC_EDIT1), SHACF_AUTOAPPEND_FORCE_OFF | SHACF_AUTOSUGGEST_FORCE_OFF);
在 MFC 中 OnInitDialog()
这将变成:
SHAutoComplete(::GetDlgItem(m_hWnd IDC_EDIT1), SHACF_AUTOAPPEND_FORCE_OFF | SHACF_AUTOSUGGEST_FORCE_OFF);
我选择了 SHACF_AUTOAPPEND_FORCE_OFF
和
SHACF_AUTOSUGGEST_FORCE_OFF
标志,以便禁用尽可能多的自动完成操作。这会导致编辑框按需要工作,因为它似乎是控件的子类。使用Spy++实用程序检查该控件,发现调用后它具有与记事本中的编辑控件相同的窗口过程,而以前不是这样的! 一个缺点是每个编辑控件(您希望为其启用该功能)都必须进行子类化 - 找不到为整个对话框或整个应用程序启用它的方法。如果您要使用许多此类控件,则定义一个新的 C++(并使用类向导对控件进行子类化)可能是有意义的,
注意: 如果您遇到 SHAutoComplete() 未解决的外部错误,则必须将 Shlwapi.lib 添加到您的项目库中。
现在,如果值得将其添加到您的项目中还是自己处理键盘输入,这只是一个选择问题,因为这两种情况所需的工作都不是很多。一个标准可能是不必弄乱自动完成功能。