我做了一个从CWnd继承的类 CTestWnd,响应两个消息
void CTestWnd::OnLButtonDown(...)
{
SetFocus() ;
}
void CTestWnd::OnChar( UINT nChar, UINT nRepCnt,UINT nFlags )
{
MessageBox("hello") ;
}
在一个对话框中创建他的一个实例,并在OnInitDialog中创建:
BOOL CTestDlg::OnInitDialog()
{
...
m_testWnd.Create( NULL , NULL , WS_CHILD | WS_VISIBLE | WS_TABSTOP ,rc, this , ID_TEST) ;
}当焦点到CTestWnd窗口后,按一个字符键,跟踪时发现根本没有进入CTestWnd::OnChar(),后来试了一下,WM_KEYDOWN和WM_KEYUP都能接受到。
请问是怎么回事,请赐教。
void CTestWnd::OnLButtonDown(...)
{
SetFocus() ;
}
void CTestWnd::OnChar( UINT nChar, UINT nRepCnt,UINT nFlags )
{
MessageBox("hello") ;
}
在一个对话框中创建他的一个实例,并在OnInitDialog中创建:
BOOL CTestDlg::OnInitDialog()
{
...
m_testWnd.Create( NULL , NULL , WS_CHILD | WS_VISIBLE | WS_TABSTOP ,rc, this , ID_TEST) ;
}当焦点到CTestWnd窗口后,按一个字符键,跟踪时发现根本没有进入CTestWnd::OnChar(),后来试了一下,WM_KEYDOWN和WM_KEYUP都能接受到。
请问是怎么回事,请赐教。
另外,确认你是否有输入。因为在类似pocketPC的模拟器下面,输入在一些情况下就被屏蔽掉了。
你可以人为发一个按键事件试试看。
DECLARE_MESSAGE_MAP ()在类定义里有没有
BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
ON_WM_LBUTTONDOWN ()
ON_WM_CHAR()
END_MESSAGE_MAP ()
建议在PreTranslateMessage判断如果是WM_KEYDOWN, WM_KEYUP
重新调用一下TranslateMessage
BOOL CXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
BOOL bRet = CDialog::PreTranslateMessage(pMsg);
if (pMsg->hwnd == m_testWnd.GetSafeHwnd())
return FALSE;
else
return bRet;
}
UINT CTestWnd::OnGetDlgCode()
{
return CWnd::OnGetDlgCode() | DLGC_WANTCHARS ;
}此消息决定了此窗口需要截获那些特殊消息,如TAB键消息。