Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15498595
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: 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>如果不想屏蔽"控件窗体消息回调处理函数"对消息的处理,用户自己也打算获取相应消息,那么
   就直接使用"用户自定义的消息回调处理函数"

阅读(2708) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~