CWnd::WindowProc的理解

先帖一段源代码

[cpp]  view plain  copy
 print ?
  1. LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     // OnWndMsg does most of the work, except for DefWindowProc call  
  4.     LRESULT lResult = 0;  
  5.     if (!OnWndMsg(message, wParam, lParam, &lResult))  
  6.         lResult = DefWindowProc(message, wParam, lParam);  
  7.     return lResult;  
  8. }  

新建一对话框程序CTestDlg,在其中添加 class CMyButton  : public CButton{};

[cpp]  view plain  copy
 print ?
  1. #include "stdafx.h"  
  2. #include "TestCom.h"  
  3. #include "MyButton.h"  
  4.   
  5. // CMyButton  
  6.   
  7. IMPLEMENT_DYNAMIC(CMyButton, CButton)  
  8.   
  9. CMyButton::CMyButton()  
  10. {  
  11. }  
  12.   
  13. CMyButton::~CMyButton()  
  14. {  
  15. }  
  16.   
  17. BEGIN_MESSAGE_MAP(CMyButton, CButton)  
  18.     ON_WM_MOUSEMOVE()  
  19. END_MESSAGE_MAP()  
  20.   
  21. // CMyButton message handlers  
  22.   
  23. void CMyButton::OnMouseMove(UINT nFlags, CPoint point)  
  24. {  
  25.     // TODO: Add your message handler code here and/or call default  
  26.     TRACE(L"CMyButton::OnMouseMove\n");  
  27.   
  28.     CButton::OnMouseMove(nFlags, point);  
  29. }  
  30.   
  31. BOOL CMyButton::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)  
  32. {  
  33.     // TODO: Add your specialized code here and/or call the base class  
  34.     if (message == WM_MOUSEMOVE) {  
  35.         int a = 20;  
  36.     }  
  37.     return CButton::OnWndMsg(message, wParam, lParam, pResult);  
  38. }  

此时,因为你重载了OnMouseMove,修改了消息映射地图,那么在CMyButton接收MouseMove消息的时候,会映射到

CMyButton::OnMouseMove,但是CMyButton::OnMouseMove由CButton::OnMouseMove默认处理。然后CWnd::OnWndMsg 

直接返回TRUE;那么CWnd::WndProc下面的
[cpp]  view plain  copy
 print ?
  1. lResult = DefWindowProc(message, wParam, lParam);  

便不会再执行了
反之,倘若你没重载WM_MOUSEMOVE消息(只要注释ON_WM_MOUSEMOVE()即可)。那么OnWndMsg会返回FALSE,表明用户

没有修改消息映射,然后
[cpp]  view plain  copy
 print ?
  1. lResult = DefWindowProc(message, wParam, lParam);  

会被执行,设定按钮状态。

但是请注意:CButton::OnMouseMove最终还是会调用CWnd::DefWindowProc这个函数,这个函数的实现如下:

[cpp]  view plain  copy
 print ?
  1. LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     if (m_pfnSuper != NULL)  
  4.         return ::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);  
  5.   
  6.     WNDPROC pfnWndProc;  
  7.     if ((pfnWndProc = *GetSuperWndProcAddr()) == NULL)  
  8.         return ::DefWindowProc(m_hWnd, nMsg, wParam, lParam);  
  9.     else  
  10.         return ::CallWindowProc(pfnWndProc, m_hWnd, nMsg, wParam, lParam);  
  11. }  

看到没,::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);
这个API最终来设定按钮在鼠标移动上去该显示的状态。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值