我正在尝试在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);
}
在网上浏览,这应该可行,但它从不同时注册ctrl和a,无论是一个还是另一个。
答案 0 :(得分:2)
试试这段代码:
void CEditExtended::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYUP )
{
if ( (LOWORD(pMsg->wParam) & VK_CONTROL) == VK_CONTROL )
{
/// blah
}
}
return CEdit::PreTranslateMessage(pMsg);
}
答案 1 :(得分:0)
在不扩展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);
}
答案 2 :(得分:0)
要对窗口中的所有编辑控件实施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);
}