昨天碰到一个问题,如果一个dialog上有一个Edit控件,这时候对Edit输入文字是Edit先得到的按键消息还是父窗口先得到?
如果要拦截一个Edit的回车消息,在没有为Edit派生新的类的情况下,网上大部分的做法是重载父窗口的PreTranlateMessage(),在这里对按键消息进行拦截,但是大部分对这个都没有说明原因。
找了下资料大致的情况就是子窗口与父窗口共用一个消息队列。在按键的时候,GetMessage() 中msg里的hwnd指向的是子窗口,在下面的代码中看到(MFC消息循环),在消息从队列中取出后,在没有分发前,先调用了AfxPreTranslateMessage,在这里面会调到各窗口的PreTranslateMessage(),如果返回TRUE则不分发,如果返回FALSE则交由相应的消息处理函数。(描述粗燥,仅做记录)
BOOL CWinThread::PumpMessage()
{
_AFX_THREAD_STATE *pState = AfxGetThreadState();
::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL))
if (!AfxPreTranslateMessage(&(pState->m_msgCur)))
{
::TranslateMessage(&(pState->m_msgCur));
::DispatchMessage(&(pState->m_msgCur));
}
return TRUE;
}