μ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; }
|