我正在尝试在一个CEdit控件中实现select all(通过ctrl-a)。为此,我创建了一个继承CEdit的类并为WM_KEYDOWN添加了一个处理程序,如下所示:
void CEditExtended::OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags )
{
if((nChar == 0x41) && (GetKeyState(VK_CONTROL) & 0x8000) != 0))
SetSel(0, -1);
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
在web上环顾四周,这应该是可行的,但它永远不会同时注册ctrl和a,无论是其中之一。
发布于 2011-11-22 18:00:27
尝试以下代码:
void CEditExtended::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYUP )
{
if ( (LOWORD(pMsg->wParam) & VK_CONTROL) == VK_CONTROL )
{
/// blah
}
}
return CEdit::PreTranslateMessage(pMsg);
}
发布于 2018-06-16 03:41:24
若要为窗口中的所有编辑控件实现Ctrl+A,请重写CWnd::PreTranslateMessage
以检查键序列以及焦点是否在编辑控件上。如果是,请选择其文本。
BOOL CMyWindow::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == 'A' && GetKeyState(VK_CONTROL) < 0) {
if (auto edit = dynamic_cast<CEdit*>(GetFocus())) {
edit->SetSel(0, -1, FALSE);
return TRUE;
}
}
return __super::PreTranslateMessage(pMsg);
}
发布于 2015-11-21 14:53:31
另一种无需扩展CEdit类即可实现CTRL+A的方法。
重写具有编辑控件的对话框的PreTranslateMessage()成员函数。
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 'A')
&& GetKeyState(VK_CONTROL) < 0)
{
CWnd *pWnd = GetFocus();
if (pWnd != NULL)
{
CString className;
GetClassName(pWnd->GetSafeHwnd(), className.GetBuffer(80), 80);
className.ReleaseBuffer();
if (className.CompareNoCase(_T("edit")) == 0)
{
pWnd->SendMessage(EM_SETSEL, 0, -1);
return TRUE;
}
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}
https://stackoverflow.com/questions/8220872
复制相似问题