工作中对CScrollView生成的滑动条添加额外的响应,于是用重载的PreTranslateMessage捕获WM_HSCROLL和WM_VSCROLL消息时,发现毫无卵用:根本不会执行PreTranslateMessage。
“只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。”原来WM_HSCROLL和WM_VSCROLL哥俩不用排队会直接到达窗口。
可以通过为WM_HSCROLL添加消息响应OnHScroll 或 重载虚函数WindowProc来实现,实现举例如下:
void CWndMessageProcDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default if(*pScrollBar == m_scrollbarV) MessageBox(L"Hi, I'm from OnVScroll"); CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar); } LRESULT CWndMessageProcDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class if(message == WM_VSCROLL) MessageBox(L"Hi, I'm form WindowProc"); return CDialogEx::WindowProc(message, wParam, lParam); } 若两个函数都添加了,会先执行哪一个呢?会先执行WindowProc