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。
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
main ()
{
int* ip=new int;
return 0;
}
new属于堆。任何进程分配后,必须释放。否则就是泄露。
已经分配的不会自动回收。必须手动回收。
进程退出,也不会被别的进程分配了(因为已经有内容,是被分配的内存了)
dynamic_cast 支持多态而存在,它主要用于类之间的转换
用于父类,子类的转换。向下转换和向上转换.
operator将A类转成B类。用于不同类之间的转换.
指针和引用的区别
4.2.3节。父类是基类引用,引用不能改变指向。指向不同类型的子类。而父类指针则可以,随便指
cstring.format 和sprinf是一样
copy构造函数,赋值构造函数,就是初始化和赋值的区别.
初始化是变量的诞生,如static的初始化,不属于函数,属于类,所以在函数外诞生
===========================================
第10章和第13章
windows 消息机制
举个例子
什么是事件, onacive
什么是消息, wm_active_...
begin_message
.......
end_message
map机制 。发送。接收.存储
mfc 机制
10-2例子:
thread1: GatherMessages--postmessage(msgQueue)
thread2: main---GetMessage(msgQueue)--TranslateMessage---DispatchMessage---onchar/onclose
图10-10
typedef void (*Messageproc)(int Message,int Parameter)
MessageProc _MessageHandler;
函数指针定义:
http://baike.baidu.com/link?url=M3Trku_kCLpWSdxhDrkMGXprAVH6T8MS3VoyeVyfZLoHBYJZL5Io4c3Jzsh_cZm4xhf5IXFKcM2nlTfgMU_c0_
typedef 这种定义函数指针的格式,不同于定义变量。属于为复杂的声明定义一个新的简单的别名。
http://wenku.baidu.com/link?url=VktxbN-T56khzty1cD9e_ZvU2rs2ayjbtZeHtV9Ij6E7jKZMqX-o_B186cxuVyOUyscOQKrRHEZM23gKrYs5VSCYA3f9KwvGucy3Nvi3WTi
使用函数指针与使用函数调用的区别
http://www.cnblogs.com/gmh915/archive/2010/06/11/1756067.html
函数指针可以作为入参,可以变更指向,指向同一类的不同函数。参数可以变成不同函数。类似于参数都是int类型,传值是1,3,5等不同.
消息泵和window消息系统关系??
一样.同10-2
===============
一个窗口是一个class吗?窗口与class。进程,线程关系/
onInitDialg和InitInstance 什么关系