gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:43:03 25 4
gpt4 key购买 nike

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

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

我的应用程序使用 Split View。 CTreeView 位于左侧面板中,CEdit 控件位于右侧面板中的 CFormView 中。

条目定义如下:

VK_DELETE,      ID_EDIT_DELETE,         VIRTKEY, NOINVERT

ID_EDIT_DELETE 事件在 CTreeView 中处理。

在我添加它之后,del 键在 CEdit 控件中停止工作。

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

ON_COMMAND(ID_EDIT_DELETE, &StationView::OnDelete)

到包含CEdit 控件 的每个面板?然后手动实现删除字符功能?或者是否有更简单的方法将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com