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。
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
- mfc 机制笔记--摘自《把脉vc++》
- 把脉VC++笔记01
- 把脉VC++笔记02
- 把脉vc++ 笔记
- 把脉VC++笔记03、04、05
- 把脉VC++ 学习过程1
- MFC/VC 消息机制
- 总算拿到《把脉VC++》的样书了~
- 总算拿到《把脉VC++》的样书了~
- VC/MFC学习笔记
- VC|MFC学习笔记
- [C++ VC MFC] MFC消息响应机制
- 孙鑫VC++讲座笔记-(2)C++ (摘自CSDN)
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- 好用的日志记录工具,NLog
- 如何在新浪微博中批量取消关注
- 软件程序编写规范 - 下(仅供参考)
- hibernate删除对象失败
- 【考研日记】:专心以及自律
- mfc 机制笔记--摘自《把脉vc++》
- 数字电视复用器中的PCR校正技术
- PsychoPy入门_04_等级评定
- 我眼中的匈牙利命名法
- LeetCode House Robber III
- 屌丝学arm汇编-06-thumb模式下ldr和bl一起使用需要注意的
- linux 配置ip
- Bitmap 高效加载图片
- vi 使用指南