c++ - MFC 自定义 Tab 键事件处理程序

标签 c++ visual-c++ mfc

问题:

有没有办法 catch <Tab> MFC CEdit 中的字符/事件,以便我可以覆盖默认的 Tab 键顺序行为?换句话说:有没有办法以编程方式注册和注销 <Tab>处理程序?

上下文:

我知道 MFC 的 Tab 键排序机制,您可以在编译时指定一个顺序,以 Tab 键浏览可见控件。我想做的是 CEdit 的子类,以便按 <Tab>而在此 CEdit 中,相邻标签(只读 CEdit)通过预设的字符串列表循环,列表完成后,按 <Tab>再次将焦点移出并让 MFC 的默认 Tab 键排序再次接管。

我的直觉告诉我这应该是可能的,但我找不到任何有用的文档。如果 MFC 有办法动态注册和注销 <Tab>事件(或任意键事件)那么这真的很容易,但我还没有找到它。

总结

基本上,假设我有 4 个编辑框 e1、e2、e3、e4;和 3 个字符串的列表; str1、str2、str3 进入对话框中其他地方的标签。如果我们从 e1 中的光标开始,我希望 Tab 键顺序如下:

  • e1
  • e2
  • e3
  • e3, str1
  • e3, str2
  • e3, str3
  • e4

这可能吗?是否有其他方法可以获得相同的行为?

最佳答案

可能还有其他“优雅”的方法可以做到这一点,但是,如果我理解您的描述,我认为这会起作用。您可以像这样使用 PreTranslateMessage 来完成您想要的。

enter image description here

BOOL CMFCApplication6Dlg::PreTranslateMessage(MSG* pMsg)
    {
    static int i = 0;

    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB)
            {
            CWnd* pFocusControl = GetFocus();
            if (pFocusControl->GetDlgCtrlID() == IDC_EDIT3)
                {
                if (i < 3)
                    {
                    CString msg;
                    msg.Format("Test %d", i++);
                    GetDlgItem(IDC_EDIT4)->SetWindowText(msg);
                    return TRUE;
                    }
                }
            }

        return CDialog::PreTranslateMessage(pMsg);
        }

在上面的示例代码中,我使用了 5 个水平放置在对话框中的编辑框。该选项卡从左侧的第一个编辑开始,然后将选项卡直到它到达禁用编辑框之前的编辑控件。再次点击选项卡将在禁用的编辑框中显示 3 条文本消息(一次一条)。第三条消息后,下一个标签将移动到右边的第五个编辑框。

关于c++ - MFC 自定义 Tab 键事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29758687/

相关文章:

c++ - 我怎样才能让 VS 调试器吐出派生类商品?

c++ - 错误的 DLL 调用约定

C++异常裸抛

mfc - 在 MFC 中将应用程序移动到第二个显示器

c++ - 如何使用 range-v3 创建 view_facade

c++ - 如何在 Linux 中编译 ISPC 代码并将其与普通的 cpp 文件链接?

c++ - 没有 mutex.h 的 VC++ 中的自旋锁同步

c++ - 从 unsigned const char * 类型转换为 char const *

.net - 在非 .NET 应用程序中抛出 SEHException

c++ - 启动项目的最佳方式 : OpenCV + GUI (C++)