在某个对话框中,当用户按下回车键作为“应用”button时, 到目前为止,我已经至less能够通过覆盖CWnd :: PreTranslateMessage按下input对话框不closures,所以目前它只是什么都不做,我不知道如何从那里发送应用命令。
每个对话框都应该有一个且只有一个带有BS_DEFPUSHBUTTON
风格的按钮,它向对话框指出这是用Enter键激活的按钮。 通常这是OK按钮,但是如果你愿意的话,你可以把它设为Apply按钮。
正如Mark指出的那样,对话管理器已经拥有了所有内置的逻辑来调用与默认按钮相关的命令来处理Enter键。 您可以静态分配BS_DEFPUSHBUTTON
样式或处理DM_GETDEFID
消息。
前者非常简单,后者实现相当简单。 确保将对话框上的所有按钮的“ 默认按钮”属性设置为“ False ”。 现在为DM_GETDEFID
消息添加一个消息处理程序。 这个消息没有专用的宏,所以你必须使用通用的处理程序:
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) ... ON_MESSAGE(DM_GETDEFID, OnGetDefId) END_MESSAGE_MAP()
消息处理程序同样简单,并使用默认的消息处理程序签名:
LRESULT CMyDialog::OnGetDefId(WPARAM wParam, LPARAM lParam) { return MAKELRESULT(ID_APPLY, DC_HASDEFID); }
消息处理程序必须返回其高位字包含DC_HASDEFID
的值,而低位字包含控制ID。
如果您浏览对话框的控件,将会看到“ 应用”按钮具有典型的默认按钮视觉提示,而焦点不在另一个命令按钮上。 当非按钮控件具有输入焦点时,按Enter键调用默认按钮的命令处理程序。 不需要额外的代码。
如果你的目的是在不关闭对话框的情况下处理Enter键,那么你可能会错误地解决这个问题。 请看看这个 MSDN文章。 虽然使用PreTranslateMessage应该可行,但这不是处理这些类型事件的最佳方法。
您需要处理OnKeyDown消息,并处理该函数中的VK_RETURN字符。
void MyCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { if(nChar == VK_RETURN) { // Do Stuff return; } CWnd::OnKeyDown(nChar, nRepCnt, nFlags); }
Another way to overwrite the message. BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN) { switch (pMsg->wParam) { case VK_RETURN: { UINT nID = ::GetDlgCtrlID(pMsg->hwnd); if (nID == ID_APPLY) { //DO YOUR STUFF HERE } } break; default: break; } } return CDialog::PreTranslateMessage(pMsg); }
另外,如果使用:: OnKeyDown,则不需要使用PreTranslateMessage