硬汉嵌入式论坛

 找回密码
 立即注册
查看: 10090|回复: 8
收起左侧

[μCGUI] uC/GUI动态内存管理句柄分配及使用的问题

[复制链接]

4

主题

12

回帖

4

积分

新手上路

我的世界没有末日。

积分
4
QQ
发表于 2013-11-17 20:02:52 | 显示全部楼层 |阅读模式
创建一个BUTTON,BUTTON_Obj结构体下包括WM_Obj及WIDGET结构体等,首先要分配内存,通过WM_CreateWindowAsChild(hWin,...)分配内存的时候就会产生一个句柄(Handle):hWin。
然后通过WM_Obj* pWin=(WM_Obj*)Handle2Ptr(hWin);这句找到WM_Obj结构的地址,然后就可以初始化这个结构了。
WM_Obj结构初始化完成之后,BUTTON_Obj和WIDGET结构就根据之前得到的句柄hWin,
通过BUTTON_Obj* pObj=(BUTTON_Obj*)Handle2Ptr(hWin);这句找到BUTTON_Obj结构的地址,然后就对其进行初始化。
我的疑惑就在:要初始化BUTTON_Obj结构下的WM_Obj的结构体(假如是win)变量,
(1)正常的话难道不是这样:pObj->win->x=x0这样类似的语句?
(2)而是像上面直接通过WM_Obj* pWin=(WM_Obj*)Handle2Ptr(hWin);然后pWin->x=x0;
难道同一个句柄在Handle2Ptr(hWin)前加一个强制类型转换(WM_Obj*)就是对应WM_Obj变量的地址,而加一个(BUTTON_Obj*)就是BUTTON_Obj变量的地址?可能表述有不当、不专业之处,还请试着理解。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107452
QQ
发表于 2013-11-17 20:30:59 | 显示全部楼层
楼主研究的比较深入,我现在是停留在使用的阶段
回复

使用道具 举报

4

主题

12

回帖

4

积分

新手上路

我的世界没有末日。

积分
4
QQ
 楼主| 发表于 2013-11-17 20:57:59 | 显示全部楼层

回 eric2013 的帖子

eric2013:楼主研究的比较深入,我现在是停留在使用的阶段 (2013-11-17 20:30) 
[s:130]我理解的比较浅显
回复

使用道具 举报

17

主题

34

回帖

17

积分

初级会员

积分
17
发表于 2013-11-17 21:48:06 | 显示全部楼层
这个是一个地址转换过程
WM_HWIN结构(你的那个Button的handle其实也是一个WH_HWIN)其实是一个内存的handle,本来的变量名为GUI_HMEM。
至于说为什么需要Handle2Ptr,
GUI_HMEM只是一个堆地址的编号,并不是实际的内存地址,所以需要转换。
说的更多点,为何不把内存实际地址给我们,而给我们一个堆地址的编号GUI_HMEM呢?
因为UCGUI支持auto defragment,内存碎片自动整理,某些情况下分配给你的实际内存地址是会变化的,所以给堆地址的编号更合适。
回复

使用道具 举报

4

主题

12

回帖

4

积分

新手上路

我的世界没有末日。

积分
4
QQ
 楼主| 发表于 2013-11-17 23:05:45 | 显示全部楼层

回 kyokof 的帖子

kyokof:这个是一个地址转换过程
WM_HWIN结构(你的那个Button的handle其实也是一个WH_HWIN)其实是一个内存的handle,本来的变量名为GUI_HMEM。
至于说为什么需要Handle2Ptr,
GUI_HMEM只是一个堆地址的编号,并不是实际的内存地址,所以需要转换。
说的更多点,为何不把内存实际地址给我 .. (2013-11-17 21:48) 
嗯 是的  虽然你说的不是我想问的重点,还是谢谢。。
回复

使用道具 举报

4

主题

12

回帖

4

积分

新手上路

我的世界没有末日。

积分
4
QQ
 楼主| 发表于 2013-11-17 23:11:31 | 显示全部楼层
再谈一下对这个的理解

比如说一个结构(直接从ucgui--copy过来)
typedef struct {
  WIDGET Widget;
  BUTTON_PROPS Props;
  WM_HMEM hpText;
  WM_HMEM ahDrawObj[3];
} BUTTON_Obj;
结构中内嵌结构WIDGET:
typedef struct {
  WM_Obj      Win;
  const WIDGET_EFFECT* pEffect;
  I16 Id;
  U16 State;
} WIDGET;
结构WIDGET也内嵌结构:
struct WM_Obj {
  GUI_RECT Rect;        /* Outer dimensions of window */
  GUI_RECT InvalidRect; /* Invalid rectangle */
  WM_CALLBACK* cb;      /* Ptr to notification callback */
  WM_HWIN hNextLin;     /* Next window in linear list */
  WM_HWIN hParent;
  WM_HWIN hFirstChild;
  WM_HWIN hNext;
  U16 Status;              /* Some status flags */
};
创建窗口是与WM_Obj有关,创建成功会返回一个句柄hWin,同时也就是BUTTON的句柄
通过句柄hWin可以找到对应结构变量的内存地址
因为创建窗口时,分配的内存大小是整个BUTTON_Obj结构的大小,所以BUTTON_Obj* pObj=(BUTTON_Obj*)Handle2Ptr(hWin)就是为BUTTON_Obj结构变量的首地址。
但是疑惑就在:WM_Obj* pWin=(WM_Obj*)Handle2Ptr(hWin);与(BUTTON_Obj*)Handle2Ptr(hWin)就仅仅是括号中不同,难道强制类型转换变为(WM_Obj*),那么地址就变为从pObj开始偏移到pWin这个地址?
难道是地址是什么类型,就自动去找符合这个类型的地址///
所以从上面看,我告诉他,地址是WM_Obj*类型的,他就从pObj开始,直到找到符合这样的地址,才把首地址赋给pWin.

-----------我似乎大概理解了
因为对整个结构变量分配了内存,然后要找结构中变量的地址,如果在前面进行强制类型转换,那么地址就会自动与这个类型去对齐。
打个比方:笔{1铅笔、2钢笔、3圆珠笔}顺序摆放,都是笔,如果说我想找圆珠笔,那我就告诉他:(圆珠笔*)笔;那我就拿着圆珠笔去比对,发现1不是,2也不是,发现3跟圆珠笔一样的,于是就返回3.

如果不是这样,还请各位提出见解,如果是的,希望对大家有所帮助!!
我暂时姑且认为是这样了,因为这样说得通。
回复

使用道具 举报

4

主题

12

回帖

4

积分

新手上路

我的世界没有末日。

积分
4
QQ
 楼主| 发表于 2013-11-20 09:27:21 | 显示全部楼层

回 lily 的帖子

lily:再谈一下对这个的理解

比如说一个结构(直接从ucgui--copy过来)
typedef struct {
  WIDGET Widget;
....... (2013-11-17 23:11) 
终于搞懂了,上面的认识和理解是不对的,纯粹是主观认为。虽然没人回答,不过自己还是把这个疑惑解决了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107452
QQ
发表于 2013-11-20 10:29:38 | 显示全部楼层

回 lily 的帖子

lily:终于搞懂了,上面的认识和理解是不对的,纯粹是主观认为。虽然没人回答,不过自己还是把这个疑惑解决了。 (2013-11-20 09:27) 
谢谢,有空我也研究下
回复

使用道具 举报

12

主题

134

回帖

170

积分

初级会员

积分
170
发表于 2014-6-6 14:16:57 | 显示全部楼层
楼主谈得好有深度,。 我得慢慢理解。。谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-1 22:09 , Processed in 0.247863 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表