mfc 机制笔记--摘自《把脉vc++》

来源:互联网 发布:c语言经典编程100例 编辑:程序博客网 时间:2024/05/17 01:00
mfc 3类消息
1 windows 消息: WM_开头的. WM_PAINT,WM_TIMER
#define WM_USER_FILE   (WM_USER+4)
2 命令消息: WM_COMMAND.  菜单,工具条按钮,加速键等 (WM_NOTIFY)
3 控件通知消息.


消息映射
不是按照switch (message) 的方式.
MFC采用类似map的方案来解决问题.
OnMessage()根据消息ID获取到应该执行的函数,并自动执行该函数。这是MFC实现消息映射的精髓.
如: BEGIN_MESSAGE_MAP
      ON_WM_PAINT()
      ...
      ON_BN_CLICKED(IDC_BUTTON1,&CMessageMapTestDlg::OnBnClickedButton)
     END_MESSAGE_MAP


消息映射宏
MFC的消息映射宏4种
1 windows消息的宏, "ON_WM_" 
2 用于命令消息的宏ON_COMMAND
ON_COMMAND(ID_FILE_PRINT,&CView::OnFilePrint)
3 用于控件通知消息的宏
ON_BN_CLICKED
4 用户自定义消息的映射宏
ON_MESSAGE 


    
消息和事件之间的关系:
事件是面向人理解的语言,如点击鼠标,onclick事件.
消息是mfc的宏,如button_message.


message 路由
传统的windows消息传递来说,响应消息的实体只可能是某个窗口,如果每个窗口没处理该消息,那么该消息就会被ignore,什么都不会发生。
因此MFC竭其所能改进该机制,它让消息沿着某种路径继续传递,直到找到处理函数为止.如果你的窗口CXXXView没有OnFileOpen(),没关系,
要是你的CXXXApp提供了OnFileOpen(),那么效果是一样的。这种神奇的行为,即消息路由
上图P440  图10-25


消息反射
当父窗口拿到控件的通知消息时,它会先将该消息交给控件去处理,如果它没有处理,则再自行处理


void CMessageReflectionTestDlg::OnBnClickdButton1()


消息泵
BOOL CWinThread::PumpMessage()
{
   //取到WM_QUIT了,直接返回false
   if (!::GetMessage(&m_msgCur,NULL,NULL,NULL))
   {
       return FALSE;
   }
   if (m_msgCur.message!=WM_KICKIDLE&&PreTranslateMessage(m_msgCur))
   {
      ::TranslateMessage(&m_msgCur);//键转换
      ::DispatchMessage(&m_msgCur); //派送消息
   }
}
每个CWinThread都包含一个消息泵,它的Run()函数一直迫使着这个泵不停工作
int CWinThread::Run()
{
   for (;;)
   {
      ...
      do
      {
         //pump message,
         if (!PumpMessage())
            return ...;
      } while(::PeekMessage(...))
   }
}
消息泵的工作非常单调而简单;读取消息GetMessage->翻译消息TranslateMessage->分派消息DispatchMessage。
0 0
原创粉丝点击