Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15498585
  • 博文数量: 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-28 10:31:26

μC/GUI-v3.90a中一个巧妙的递归函数理解

文章来源:http://gliethttp.cublog.cn

//一直觉得递归函数是一种比较高级的东西,可以实现很多微妙的功能
//下面就是μC/GUI中一个递归函数,通过该递归函数调用,遍历hWin下的所有孩子以及孩子的孩子--窗体控件
//找到孩子们当中id号匹配者,返回该孩子的hwin句柄.
//但是因为递归的原因,所以每一次递归函数的进入,都会占用一部分堆栈空间,
//当子控件很多时,堆栈容易溢出,尤其使用μC/OS-II线程堆栈的时候,因为每个task都有一个
//属于自己的进程堆栈,所以更需要小心堆栈溢出.

static WM_HWIN _GetDialogItem(WM_HWIN hWin, int Id) {
  WM_HWIN hi;
  WM_HWIN r =0;
  WM_Obj* pWin = WM_H2P(hWin);
  hi = pWin->hFirstChild;
  while (hi) {
    if (WM_GetId(hi) == Id) {
      return hi;//找到了id对应的hwin
    }
    if ((r = _GetDialogItem(hi, Id)) != 0) {
//一直递归下去,直到孩子的孩子的孩子的孩子的...没有孩子为止,才返回到上一个孩子的sibling,看看
//sibling的孩子的孩子的孩子的...怎么样,就这样一个不落的遍历了hWin下的所有孩子,找到id匹配的窗体控件之后
//递归调用将一路不带停歇的返回
      break;
    }
    hi = WM_HANDLE2PTR(hi)->hNext;
  }
  return r;
}

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