结构体强转出现问题,

wishifef 2009-12-13 07:46:17
我写了一个结构体

typedef struct _ScrollGridWidget{
IWidget * meScrollWidget;
IShell *piShell;
IWidget * meGridWidget;
}ScrollGridWidget

然后写了一个Create_ScrollGridWidget(IShell * pIShell,IWidget **pGridListWidget)方法
pMe=MALLOC(sizeof(ScrollGridWidget));
MEMSET(pMe,0,sizeof(ScrollGridWidget));
pMe->piShell=pIShell;
ISHELL_CreateInstance(pIShell,AEECLSID_GRIDWIDGET,(void**)&pMe->meGridWidget);
ISHELL_CreateInstance(pIShell,AEECLSID_SCROLLBARWIDGET,(void**)&pMe->meScrollWidget);
设置属性……(设置了其大小,颜色等)

最后把meScrollWidget接口传出来

又写了一个
int ScrollGridWidget_SetBgImage(ScrollGridWidget *pMe,IImage * bgImage){
IIMAGE_SetParm(bgImage,IPARM_SCALE,240,290);
IWIDGET_SetBGImage(pMe->meGridWidget, bgImage);
}
想用来改变其背景

然后我建了一个测试的APP,

……
IWidget *scrollGridWidget;
……
Create_ScrollGridWidget(pMe->a.m_pIShell,&scrollGridWidget);

IXYCONTAINER_Insert(pMe->mainContainer, scrollWidget, WIDGET_ZNORMAL, &pos);
IXYCONTAINER_QueryInterface(pMe->mainContainer,AEEIID_WIDGET,&containerWdg);
IFORM_SetWidget(pMe->mainForm,WID_FORM,containerWdg);

此时出现了运行正常,出现背景图片,然后加入

tempImage=ISHELL_LoadImage(pMe->meIshell, "m2.jpg");

ScrollGridWidget_SetBgImage((ScrollGridWidget*)scrollWidget,tempImage);

运行正常,但是背景图片没有更换,

调试得到
int ScrollGridWidget_SetBgImage(ScrollGridWidget *pMe,IImage * bgImage)
{
IIMAGE_SetParm(bgImage,IPARM_SCALE,240,290);
IWIDGET_SetBGImage(pMe->meGridWidget, bgImage);
}
中的pMe 的piShell为空指针,貌似meGridWidget的地址也有问题才导致图片为更换,


请教,想遇到这要的问题,把一个结构体作为一个Widget传出,在用到结构体内部的成员时再强转,后使用的做法是否正确,

若正确,我的错误出在哪里?
若不正确,该怎么做?

谢谢!

...全文
1828 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bxk253387223 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wishifef 的回复:]
引用 10 楼 bxk253387223 的回复:
你说的这个是Custom Widget了。不过你写的不太对。
Custom Widget可以从新定义Widget的行为,可以把多个Widget进行组合。

我猜你的是想抽出来一个函数,好为Widget来设置各种属性,是不?

呵呵,对,是这样,我该怎么写啊!
[/Quote]

按C语言的语法来划分,抽取出一个函数。来实现这个功能。
wishifef 2009-12-14
  • 打赏
  • 举报
回复
其实我就是想实现一个自己包装的widget的效果,传出来一个IWidget接口,这样别人就可以用
IXYCONTAINER_Insert(pMe->mainContainer, scrollWidget, WIDGET_ZNORMAL, &pos);

在容器里添加我包装后的widget了,而不必知道我结构体内部的成员,

如果我把*pGridListWidget = pMe,整个结构体的接口传出来,

那样别人调用的时候就要用

IXYCONTAINER_Insert(pMe->mainContainer, scrollWidget->meScrollWidget, WIDGET_ZNORMAL, &pos);
这样我就应该把结构体内部公开了!

我是想传出一个widget接口,调用的时候在内部强转使用,

我是这样想的,不知道能不能实现,你们自己写的widget都是怎么处理的啊,
我是个新手,
谢谢bxk253387223,
bxk253387223 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wishifef 的回复:]
呵呵,不好意思,我刚学,还不怎么知道怎么释放空间,我的代码都没释放过空间的,

可是传出来的是结构体的第一个元素啊!
[/Quote]
手误。
我的意思是你应该吧pMe传出去。而不是把一个Widget指针传出去。
wishifef 2009-12-14
  • 打赏
  • 举报
回复
呵呵,不好意思,我刚学,还不怎么知道怎么释放空间,我的代码都没释放过空间的,

可是传出来的是结构体的第一个元素啊!
bxk253387223 2009-12-14
  • 打赏
  • 举报
回复
看的我好乱。

pMe=MALLOC(sizeof(ScrollGridWidget));在那里释放的。
函数出去之后只把pMe->meScrollWidget反出来了。其他的空间是不是就丢失了?
既然传出去的都不是结构体,只是一个IWidget指针,之后你把它转成结构体,这个Widget指针又不是结构体的第一个元素。所以一定会有问题的。
wishifef 2009-12-14
  • 打赏
  • 举报
回复
--------------------------ScrollGridWidget.h

typedef struct _ScrollGridWidget{
IWidget * meScrollWidget;
IShell *piShell;
IWidget * meGridWidget;
IImage *bgImage;
}ScrollGridWidget;
int ScrollGridWidget_SetBgImage(ScrollGridWidget *pMe,IImage * bgImage);
int Create_ScrollGridWidget(IShell * pIShell,IWidget **pGridListWidget);

--------------------------ScrollGridWidget.c


#include "AEEModGen.h" // Module interface definitions
#include "AEEAppGen.h" // Applet interface definitions
#include "AEEShell.h" // Shell interface definitions

#include "AEEForm.h"
#include "AEERootForm.h"
#include "AEEVectorModel.h"
#include "AEEListWidget.h"
#include "AEEWidget.h"
#include "AEEScrollWidget.h"
#include "AEEFile.h"
#include "ScrollGridWidget.h"

int ScrollGridWidget_SetBgImage(ScrollGridWidget *pMe,IImage * bgImage)
{
pMe->bgImage=bgImage;
IIMAGE_SetParm(pMe->bgImage,IPARM_SCALE,240,290);
IWIDGET_SetBGImage(pMe->meGridWidget, pMe->bgImage);
}


int Create_ScrollGridWidget(IShell * pIShell,IWidget **scrollGridWidget)
{
WExtent we;
AEEDeviceInfo deviceinfo;
ScrollGridWidget * pMe;
IImage *widgetBgImage;
//为GridListWidget分配空间
pMe=MALLOC(sizeof(ScrollGridWidget));
MEMSET(pMe,0,sizeof(ScrollGridWidget));
ISHELL_GetDeviceInfo(pIShell,&deviceinfo);
we.width=deviceinfo.cxScreen;
we.height=deviceinfo.cyScreen-30;
pMe->piShell=pIShell;
ISHELL_CreateInstance(pIShell,AEECLSID_GRIDWIDGET,(void**)&pMe->meGridWidget);
ISHELL_CreateInstance(pIShell,AEECLSID_SCROLLBARWIDGET,(void**)&pMe->meScrollWidget);
IWIDGET_SetTopIndex(pMe->meGridWidget, 1);
IWIDGET_SetFocusIndex(pMe->meGridWidget, 1);
IWIDGET_SetBorderWidth(pMe->meGridWidget,2);
IWIDGET_SetBorderColor(pMe->meGridWidget,MAKE_RGB(100,100,100));

widgetBgImage=ISHELL_LoadImage(pIShell, "bg.jpg");
IIMAGE_SetParm(widgetBgImage,IPARM_SCALE,we.width,we.height);
IWIDGET_SetBGImage(pMe->meGridWidget, widgetBgImage);

IWIDGET_SetBorderColor(pMe->meGridWidget, MAKE_RGB(200, 200, 200));
IWIDGET_SetBorderWidth(pMe->meGridWidget, 1);
IWIDGET_SetBGColor(pMe->meGridWidget, MAKE_RGB(200, 200, 50));

ISHELL_CreateInstance(pIShell, AEECLSID_SCROLLBARWIDGET, (void **)&pMe->meScrollWidget);
IWIDGET_SetProperty(pMe->meScrollWidget, PROP_SCROLLPAD, 0);
IWIDGET_SetProperty(pMe->meScrollWidget, PROP_SCROLLHANDLEWIDTH, 4);
IWIDGET_SetProperty(pMe->meScrollWidget, PROP_FLAGS, SBWF_ARROWS);
IWIDGET_SetProperty(pMe->meScrollWidget, PROP_SCROLLBARENDPAD, 5);
IWIDGET_SetProperty(pMe->meScrollWidget, PROP_ACTIVE_SCROLLCOLOR, MAKE_RGB(200, 200, 0));
IWIDGET_SetProperty(pMe->meScrollWidget, PROP_ACTIVE_SCROLLHANDLECOLOR, MAKE_RGB(90, 90, 90));
IWIDGET_SetProperty(pMe->meScrollWidget, PROP_SCROLLFILLCOLOR, MAKE_RGB(200, 200, 0));

IDECORATOR_SetWidget((IDecorator *)pMe->meScrollWidget, pMe->meGridWidget);
IWIDGET_SetExtent(pMe->meScrollWidget,&we);
*scrollGridWidget=pMe->meScrollWidget;
return TRUE;
}


-----------------------------------------------------ceshi.c
static boolean CreateMainFrom(chunCeshi *pMe)
{
WExtent wt_list;
IWidget *containerWdg;
IWidget *scrollWidget;
ScrollGridWidget *scrollGridWidget;
WidgetPos pos;
IImage *bgImage;//背景图片
IImage *tempImage;
pos.x=0;
pos.y=0;
pos.bVisible=TRUE;
wt_list.height=200;
wt_list.width=200;
// bgImage=ISHELL_LoadImage(pMe->meIshell, "bg.jpg");
ISHELL_CreateInstance(pMe->meIshell,AEECLSID_FORM,(void**)&pMe->mainForm);
ISHELL_CreateInstance(pMe->meIshell,AEECLSID_XYCONTAINER,(void**)&pMe->mainContainer);
Create_ScrollGridWidget(pMe->meIshell,&scrollWidget);
// tempImage=ISHELL_LoadImage(pMe->meIshell, "m2.jpg");

// ScrollGridWidget_SetBgImage((ScrollGridWidget *)scrollWidget,tempImage);
IXYCONTAINER_Insert(pMe->mainContainer, scrollWidget, WIDGET_ZNORMAL, &pos);
IXYCONTAINER_QueryInterface(pMe->mainContainer,AEEIID_WIDGET,&containerWdg);
IWIDGET_SetBGColor(containerWdg,MAKE_RGB(200,50,100));
IWIDGET_SetExtent(containerWdg,&wt_list);
IFORM_SetWidget(pMe->mainForm,WID_FORM,containerWdg);
tempImage=ISHELL_LoadImage(pMe->meIshell, "m2.jpg");

ScrollGridWidget_SetBgImage((ScrollGridWidget*)scrollWidget,tempImage);
// tempImage=ISHELL_LoadImage(pMe->meIshell, "m2.jpg");
// GridListWidget_SetBgImage((GridListWidget *)gridWidget,tempImage);

return TRUE;
}



case EVT_APP_START:
// Add your code here...
if (CreateMainFrom(pMe))
{
IROOTFORM_PushForm(pMe->rootForm,pMe->mainForm);
}

---------------------------------谢谢啊!
FLYUP_CHEN 2009-12-14
  • 打赏
  • 举报
回复
你想实现的是要扩展一个IWidge对吧,你的思想是对的,但是有一点错误就是,首地址不能是指针,这样他就找不到空间的大小了。其实这也是一种模拟继承的方法,BUIW都是这样去做的,请看下面BUIW的做法,以ImageStaticWidget为例,其实ImageStaticWidget也是由PoperContainer继承而来,结构体如下:
typedef struct {

PropContainer base;

IWidget * piImage;
IWidget * piLabel;
uint32 dwFlags;
HandlerDesc handler;

IValueModel * pivm;
ModelListener modelListener;
} ImageStaticWidget;
这样当你返回时base的时候,就可以正确的找到以下的数据了,当然ImageStaticWidget它返回的并不是base,只是举一个例子。如果你要写IWdget,第一个数据就不应该是一个接口而应该是BUIW中的一个结构体,例如ListWidget。
bxk253387223 2009-12-14
  • 打赏
  • 举报
回复
*pGridListWidget = pMe->meScrollWidget?
*pGridListWidget = pMe?
bxk253387223 2009-12-14
  • 打赏
  • 举报
回复
如果还是NULL,就不明白了。
把代码都贴上来吧。
wishifef 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bxk253387223 的回复:]
pMe里面的piShell你没有进行赋值?
然后tempImage放到pMe里面试一下。
[/Quote]
谢谢!

pMe=MALLOC(sizeof(ScrollGridWidget));
MEMSET(pMe,0,sizeof(ScrollGridWidget));
pMe->piShell=pIShell;
ISHELL_CreateInstance(pIShell,AEECLSID_GRIDWIDGET,(void**)&pMe->meGridWidget);
ISHELL_CreateInstance(pIShell,AEECLSID_SCROLLBARWIDGET,(void**)&pMe->meScrollWidget);
赋值了,把tempImage放到pMe里面不可以,更换背景里那个pMe->piShell还是空指针,背景未换,
bxk253387223 2009-12-14
  • 打赏
  • 举报
回复
pMe里面的piShell你没有进行赋值?
然后tempImage放到pMe里面试一下。
路飞-总裁 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wishifef 的回复:]
呵呵,不好意思,我刚学,还不怎么知道怎么释放空间,我的代码都没释放过空间的,

可是传出来的是结构体的第一个元素啊!
[/Quote]

这个不应该吧,要是不及时释放空间的话,出现的问题是没有办法预测的啊。这方面的问题要考虑的,
内存泄露的问题可大可小。
wishifef 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bxk253387223 的回复:]
你说的这个是Custom Widget了。不过你写的不太对。
Custom Widget可以从新定义Widget的行为,可以把多个Widget进行组合。

我猜你的是想抽出来一个函数,好为Widget来设置各种属性,是不?

[/Quote]

呵呵,对,是这样,我该怎么写啊!
bxk253387223 2009-12-14
  • 打赏
  • 举报
回复
你说的这个是Custom Widget了。不过你写的不太对。
Custom Widget可以从新定义Widget的行为,可以把多个Widget进行组合。

我猜你的是想抽出来一个函数,好为Widget来设置各种属性,是不?

3,182

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧