MFC CEdit 和 CCombobox - 想要 Ctrl+ Backspace 删除整个单词而不是输出“Square”127 个字符

问题描述 投票:0回答:1
传统上,在 Win32 文本控件(例如 Edit 或 ComboBox)中按 Ctrl+ Backspace 将生成对应于 ASCII 代码 127 的删除控制字符。在许多 Windows 应用程序中,例如 Windows 10 版本(及之前版本)的记事本,ctrl+ Backspace 将生成一个“方形”字符。见下图:

CEdit

MFC 和早期版本的 .Net 包装的 Win32 WinForm 控件在按下 ctrl+ 退格键时表现出这种“方形”字符行为。然而,在较新版本的 .Net 中,开箱即用的行为发生了变化,因此对于每个 ctrl+退格键,控件中最新的整个单词将被删除。这与许多其他文本控件(例如网页上的文本控件)一致。对于 .Net 控件(最早的版本),在这种行为方面,控件的工作方式与 MFC 对应控件类似。然后,随着“自动完成”的到来,该行为可用,但不是默认情况下(请参阅此链接

Winforms Textbox - 使用 Ctrl-Backspace 删除整个单词)。在 VS 2019 中,该行为从一开始就可用。

有没有人有一个简单的 MFC 解决方案来更改 CComboBox 等控件的“开箱即用”行为,以删除最近的整个单词,而不是输出字符 127“方块”?我在网上看到一些项目实现了整个自动完成界面,但这对于我需要的一项更改来说太过分了。更糟糕的情况是,我想我可以对控件进行子类化,并在 wnd 消息循环中,每当遇到字符 127 时删除最后一个单词。

我想听听你的建议:-)

winapi visual-c++ autocomplete mfc
1个回答
0
投票
我什至不知道这些功能的存在,但这激起了我的好奇心。上网搜索了一下,发现了类似的问题和报告,发现这确实与Windows自动完成功能有关。

为了测试,我创建了一个非 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 添加到您的项目库中。

现在,如果值得将其添加到您的项目中还是自己处理键盘输入,这只是一个选择问题,因为这两种情况所需的工作都不是很多。一个标准可能是不必弄乱自动完成功能。

© www.soinside.com 2019 - 2024. All rights reserved.