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

时间:2015-04-20 21:24:59

标签: c++ visual-c++ mfc

问题:

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

上下文

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

我的直觉告诉我这应该是可能的,但我找不到任何有用的文档。如果MFC有一种动态注册和注销<Tab>事件(或任意键事件)的方法,那么这将非常简单,但我还没有找到它。

摘要

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

  • E1
  • E2
  • E3
  • e3,str1
  • e3,str2
  • e3,str3
  • E4

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

2 个答案:

答案 0 :(得分:1)

可能还有其他优雅的&#39;这样做的方法,但是,如果我理解你的描述,我认为这将有效。您可以像这样使用 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条短信(每次一条)。在第三条消息之后,下一个选项卡将移动到右侧的第五个编辑框。

答案 1 :(得分:0)

假设您有4个编辑控件e1,e2,e3,e4。您希望它们按此顺序标记:3,2,4,1

覆盖OnInitDialog()并像这样移动它们:

e3.SetWindowPos(&CWnd::wndTop,   0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
e2.SetWindowPos(&e3, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
e4.SetWindowPos(&e2, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
e1.SetWindowPos(&e4, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

如果您按反向Tab顺序移动它们也有效:

e1.SetWindowPos(0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
e4.SetWindowPos(0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
e2.SetWindowPos(0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
e3.SetWindowPos(0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

如果您稍后必须移动/调整控件大小,请添加SWP_NOZORDER标记以防止更改Tab键顺序。