全部博文(2005)
分类: C/C++
2007-08-30 10:55:33
μC/GUI-v3.90a学习笔记6
"控件窗体消息回调处理函数"和"用户自定义的消息回调处理函数"
1.当定义了"用户自定义的消息回调处理函数"之后,"控件窗体消息回调处理函数"在处理完毕消息之后,会自动调用之,
如果没有定义"用户自定义的消息回调处理函数",那么"控件窗体消息回调处理函数"在处理完毕消息之后,
将调用WM_DefaultProc();当然frame控件"标题栏和框架回调函数"中不提供"用户自定义的消息回调处理函数",
但是提供了"钩子Hook函数","钩子Hook函数"会先于frame控件"标题栏和框架回调函数"执行,对于FRAMEWIN_Create()
创建函数提供的"cb用户自定义回调函数",是在frame控件"客户区回调函数"的最后部分被调用的;
2.函数WM_SetCallback()将置入用户定义的"控件窗体消息回调处理函数",
置出原来的"控件窗体消息回调处理函数",所以WM_SetCallback()设置的是"控件窗体消息回调处理函数",
而不是"用户自定义的消息回调处理函数";
3.函数WM_CreateWindow()传递的cb回调函数是"控件窗体消息回调处理函数";
4.如下代码将使"用户自定义的消息回调处理函数"先于"控件窗体消息回调处理函数"处理消息:
_hWinControl = WM_GetClientWindow(_hWinControl);//获取客户区句柄
//置换出原来的消息回调函数到_pfcbFrameWin
_pfcbFrameWin = WM_SetCallback(_hWinControl, &_cbWinControl);
然后在_cbWinControl"用户自定义的消息回调处理函数"的最后调用_pfcbFrameWin,
static void _cbWinControl(WM_MESSAGE* pMsg) {
switch (pMsg->MsgId) {
case WM_PAINT://"控件窗体消息回调处理函数"不用处理WM_PAINT消息,由用户自己处理
GUI_SetBkColor(GUI_GRAY);
GUI_Clear();
break;
default:
//除WM_PAINT之外的消息交由默认处理函数处理
if (_pfcbFrameWin) {
(*_pfcbFrameWin)(pMsg);
}
}
}
//这样那些用户不打算让默认"控件窗体消息回调处理函数"处理的消息将统统不会传递到"控件窗体消息回调处理函数"
//------------------------------------------------------------------------------------------------------
所以综上可知,
<1>如果打算继承控件的大部分消息处理能力,仅仅对某几个消息做独立处理,那么就可以使用
_pfcbFrameWin = WM_SetCallback(_hWinControl, &_cbWinControl)方式
<2>如果打算对控件消息进行重写,那么直接使用WM_SetCallback取代原"控件窗体消息回调处理函数"即可
<3>如果不想屏蔽"控件窗体消息回调处理函数"对消息的处理,用户自己也打算获取相应消息,那么
就直接使用"用户自定义的消息回调处理函数"