c++ - MFC CEdit 控件添加到加速器后不处理按下的按键

标签 c++ windows mfc treeview editbox

我的 MFC 应用程序中的 del 键出现问题。

我已经定义了一个加速器条目来使用 CTreeView 中的 del 键。

我的应用程序使用分割 View 。 CTreeView 位于左侧面板上,CEdit 控件位于 CFormView 内的右侧面板上。

条目定义如下:

VK_DELETE,      ID_EDIT_DELETE,         VIRTKEY, NOINVERT

ID_EDIT_DELETE 事件在 CTreeView 内部处理。

添加后,del 键在 CEdit 控件内停止工作。

我需要做什么才能恢复 CEdit Control 中的功能? 我是否必须添加类似的内容:

ON_COMMAND(ID_EDIT_DELETE, &StationView::OnDelete)

每个包含CEdit Control的面板?然后手动实现删除字符功能? 或者是否有更简单的方法将 del 键事件传递给 CEdit 控件?

更新:

我重写了 CFormView 类中的 PreTranslateMessage 方法,并且 Del 按键被捕获。但我该如何进一步进行呢?

更新V2:

正如此处询问的拆分器创建代码:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) {

    // create splitter window
    if (!m_wndSplitter.CreateStatic(this, 1, 2)) {
        return FALSE;
    }

    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(250, 1000), pContext) ||
        !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CLineSyncView), CSize(500, 1000), pContext)) {
        m_wndSplitter.DestroyWindow();
        return FALSE;
    }

    return TRUE;
}

最佳答案

From MSDN:

MFC has default implementation for menu handlers and accelerator keys that AppWizard adds to your application to handle these functions. These menu handlers get the accelerator keystrokes instead of your edit control.

解决方案是加载加速器表并将消息发送到编辑控件以备需要。

这是代码:

  1. 在您的 CFormView 派生类中,添加 HACCEL m_hAccelTable 成员。
  2. 在重写的OnInitialUpdate中加载加速器:

    void CFormRight::OnInitialUpdate()
    {
        CFormView::OnInitialUpdate();
    
        m_hAccelTable = ::LoadAccelerators(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
    }
    
  3. 重写 CFormView 派生类中的 PreTranslateMessage 函数。 我们需要检查这是否是关键消息、聚焦窗口是否是编辑控件以及是否有加速器。

    BOOL CFormRight::PreTranslateMessage(MSG* pMsg)
    {
        if (m_hAccelTable)
        {
            // cheaper to check the message range then TranslateAccelerator
            if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
            {
                CWnd* pWnd = GetFocus();
                if (IsEdit(pWnd) && ::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg))
                {
                    pWnd->SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
                    return FALSE;
                }
            }
        }
        return CFormView::PreTranslateMessage(pMsg);    
    }
    
    BOOL CFormRight::IsEdit(CWnd* pWnd)
    {
        ASSERT(pWnd != NULL);
        HWND hWnd = pWnd->GetSafeHwnd();
        if (hWnd == NULL)
            return FALSE;
    
        TCHAR szClassName[6];
        return ::GetClassName(hWnd, szClassName, 6) &&
            _tcsicmp(szClassName, _T("Edit")) == 0;
    }
    
  4. 最后,摧毁加速器。

    void CFormRight::OnDestroy()
    {
        CFormView::OnDestroy();
    
        ::DestroyAcceleratorTable(m_hAccelTable);   
    }
    

关于c++ - MFC CEdit 控件添加到加速器后不处理按下的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58486499/

相关文章:

c++ - 为什么 vector 初始化构造和复制?

python - 如何使 pip 可用于 Windows 上的 git bash 命令行?

c++ - Windows.h 导致 C++ 类出现问题

c++ - C 样式转换和 C++ static_cast 到指针的引用

c++ - mfc++中如何将char*转成char**

c++ - 无匹配功能

c++ - CMake 可以找到一个 Boost 头文件,但找不到另一个

c++ - 在内存映射文件中存储 vector

iphone - 当我使用 COM 以编程方式同步 iphone 时让 iTunes 通知我

c++ - 自定义 CListCtrl