我的 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;
}
最佳答案
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.
解决方案是加载加速器表并将消息发送到编辑控件以备需要。
这是代码:
- 在您的
CFormView
派生类中,添加HACCEL m_hAccelTable
成员。 在重写的
OnInitialUpdate
中加载加速器:void CFormRight::OnInitialUpdate() { CFormView::OnInitialUpdate(); m_hAccelTable = ::LoadAccelerators(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME)); }
重写
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; }
最后,摧毁加速器。
void CFormRight::OnDestroy() { CFormView::OnDestroy(); ::DestroyAcceleratorTable(m_hAccelTable); }
关于c++ - MFC CEdit 控件添加到加速器后不处理按下的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58486499/