PreTranslateMessage方法没有被调用,以便实现C + +中的Ctrl + A
我试图在note注释编辑控件中实现ctrl + A:m_editNoteTypeView这是类NoteDialog中cEdit的实例。 我的注释编辑像下面一样创建。PreTranslateMessage方法没有被调用,以便实现C + +中的Ctrl + A
NoteDialog::initDialog()
{
m_editNoteTypeView.CreateEx(::GetWindowLong(m_editSubject.m_hWnd, GWL_EXSTYLE), "edit", "", dwStyle | ES_READONLY, CRect(0, 0, 0, 0), this, 0);
m_editNoteTypeView.SetSel(0,-1,TRUE);
}
NoteDialog类是从名为Sdialog另一类最后从CDialog
得出的。
我在SDialog定义PreTranslateMessage(MSG* pMsg)
但控制不会的PreTranslateMessage,因此我的我无法核对的关键我当时正在按键板上在笔记上打字编辑。
bool Sdialog::PreTranslateMessage(MSG* pMsg)
{
if (GetFocus() == this)
{
if (pMsg->message == WM_CHAR)
{
if ((LOWORD(pMsg->wParam) & VK_CONTROL) == VK_CONTROL)
{
//SetSel(0, -1);
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
return
类型PreTranslateMessage
应该是BOOL
,否则你在MFC中得到一个编译错误。
if (pMsg->message == WM_CHAR)
if ((LOWORD(pMsg->wParam) & VK_CONTROL) == VK_CONTROL)
{...}
WM_CHAR
消息不wParam
携带VK_CONTROL
。
要拦截Ctrl键 + 甲:
- 等待
WM_KEYDOWN
消息 - 检查甲键
- 检查Ctrl键键被按下
这样:
BOOL Sdialog::PreTranslateMessage(MSG* pMsg)
{
static int i = 0;
CString s;
if(pMsg->message == WM_KEYDOWN)
{
if(GetKeyState(VK_CONTROL) & 0x8000)
{
if(pMsg->wParam == 'A')
{
...
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
此外,你可以添加这些辅助宏:
// Handy functions
#define IsCTRLpressed() (GetKeyState(VK_CONTROL) & 0x8000)
#define IsSHIFTpressed() (GetKeyState(VK_SHIFT) & 0x8000)
//15 = sizeof(SHORT) * 8 - 1
//0000 0000 0000 0001 = 1
//1000 0000 0000 0000 = 15 << 1
然后,它可以是简单的:
if (IsCTRLpressed() &&
pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('A')))
{
// Do whatever
// Eat it.
bNoDispatch = TRUE;
bDealtWith = TRUE;
}
请记住,你必须决定是否你仍然想运行基本实现。如果你自己实际处理这个消息并处理它,那么你应该返回TRUE
。否则,让基类处理它。
例子:
BOOL Sdialog::PreTranslateMessage(MSG* pMsg)
{
BOOL bNoDispatch, bDealtWith;
bDealtWith = FALSE;
if (IsCTRLpressed() &&
pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('A')))
{
// Deal with it
// Eat it.
bNoDispatch = TRUE;
bDealtWith = TRUE;
}
if (!bDealtWith)
bNoDispatch = CDialogEx::PreTranslateMessage(pMsg);
return bNoDispatch;
}
@AndrewTruckle我认为这应该是'0x8000 = 15
代码是由Chris Maunder从CodeProject的CGridCtrl类数据文件中提取的。 –
@AndrewTruckle即使在编辑中我也再次写错了。我打算编写'(GetKeyState(VK_CONTROL)&(15
如果编辑控件具有焦点时,会不会是处理按键?你尝试过'WM_KEYDOWN'吗? –