先帖一段源代码
- LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
- // OnWndMsg does most of the work, except for DefWindowProc call
- LRESULT lResult = 0;
- if (!OnWndMsg(message, wParam, lParam, &lResult))
- lResult = DefWindowProc(message, wParam, lParam);
- return lResult;
- }
新建一对话框程序CTestDlg,在其中添加 class CMyButton : public CButton{};
- #include "stdafx.h"
- #include "TestCom.h"
- #include "MyButton.h"
- // CMyButton
- IMPLEMENT_DYNAMIC(CMyButton, CButton)
- CMyButton::CMyButton()
- {
- }
- CMyButton::~CMyButton()
- {
- }
- BEGIN_MESSAGE_MAP(CMyButton, CButton)
- ON_WM_MOUSEMOVE()
- END_MESSAGE_MAP()
- // CMyButton message handlers
- void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
- TRACE(L"CMyButton::OnMouseMove\n");
- CButton::OnMouseMove(nFlags, point);
- }
- BOOL CMyButton::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
- {
- // TODO: Add your specialized code here and/or call the base class
- if (message == WM_MOUSEMOVE) {
- int a = 20;
- }
- return CButton::OnWndMsg(message, wParam, lParam, pResult);
- }
此时,因为你重载了OnMouseMove,修改了消息映射地图,那么在CMyButton接收MouseMove消息的时候,会映射到
CMyButton::OnMouseMove,但是CMyButton::OnMouseMove由CButton::OnMouseMove默认处理。然后CWnd::OnWndMsg
直接返回TRUE;那么CWnd::WndProc下面的
- lResult = DefWindowProc(message, wParam, lParam);
便不会再执行了
反之,倘若你没重载WM_MOUSEMOVE消息(只要注释ON_WM_MOUSEMOVE()即可)。那么OnWndMsg会返回FALSE,表明用户
没有修改消息映射,然后
- lResult = DefWindowProc(message, wParam, lParam);
会被执行,设定按钮状态。
但是请注意:CButton::OnMouseMove最终还是会调用CWnd::DefWindowProc这个函数,这个函数的实现如下:
- LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
- {
- if (m_pfnSuper != NULL)
- return ::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);
- WNDPROC pfnWndProc;
- if ((pfnWndProc = *GetSuperWndProcAddr()) == NULL)
- return ::DefWindowProc(m_hWnd, nMsg, wParam, lParam);
- else
- return ::CallWindowProc(pfnWndProc, m_hWnd, nMsg, wParam, lParam);
- }
看到没,::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);
这个API最终来设定按钮在鼠标移动上去该显示的状态。