UCGUI对话框中显示图片的问题?
本人正在做UCGUI界面,界面都采用对话框形式切换,为了好看需要添加图片在对画框中,我试过用按钮然后给按钮添加图片,但是比较难看,而且不规则形状的图片很按钮形状不适应,请问在对话框中显示图片还有其他方法么? 或者在对话框中绘图,这样行的通吗? 为了美观,在软件的定制过程中,一般由美工绘制图片,然后交与软件开发人员。由软件开发人员再进行贴图。
自己绘制?一般不要这么想了,数据量大,而且麻烦。不如贴图来得实惠。 自己绘的也是简单的矩形,也无所谓了,在UCGUI对话框中贴图,除了在按钮上贴,还有其他方法么? 很久没有用过了,感觉就使用普通页面切换就可以了,这样图片也好做,好处理。
几年前做的一个函数:
WM_HWIN __CreatePage(__PageStr Page, U32 x0, U32 y0) //创建页面
{
WM_HWIN CurrentHWIN;
WM_HWIN PageHWIN;
CurrentHWIN = WM_GetActiveWindow(); //获得当前活动的窗口的句柄
switch (Page.Type)
{
case WinBase:
PageHWIN = WM_CreateWindowAsChild(
(Page.x0+x0), (Page.y0+y0), Page.xSize, Page.ySize, CurrentHWIN, WM_CF_SHOW, _cbPage, 0);
break;
default:
break;
}
#ifdef __Db__CreatePage
LcdShow_Printf("\r\nCreaterCurHWIN=%d-%d, ",CurrentHWIN,PageHWIN);
LcdShow_Printf(" Page.Type=%d ",Page.Type);
#endif
return PageHWIN;
}
typedef struct //页面定义
{
//__Index Index; //页面ID
S16 Type; //页面类型
U32 x0; //页面位置x
U32 y0; //页面位置y
U32 xSize; //页面大小x
U32 ySize; //页面大小y
char *Caption; //页面标题
GUI_BITMAP *Bmp; //页面底图
__KeyUni *pKey; //页面按键
__DispUni *pDisp; //页面显示
} __PageStr
//页面类型定义
#define WinBase 0 //基本页面类型,不可移动、独占输入、没有专门的标题栏
_cbPage 是页面回调函数。
首先感谢楼上的回答,给我了很大的启发,代码我还没有试,等下试试...我的理解你的方法就是新建一个字窗口把图片放在子窗口里来显示,我先搞一下 再来反馈 hebeijiang 发表于 2013-1-29 16:57 static/image/common/back.gif
很久没有用过了,感觉就使用普通页面切换就可以了,这样图片也好做,好处理。
几年前做的一个函数:
WM_HWI ...
请问往子窗口页面贴图用那个函数啊物品用GUI_DrawBitmap(&bmESC,50,50);他始终是绘制在最底层。。。你的代码中__PageStr Page;中后边的几个变量怎么应用,能吧__cbPage的代码给我看一下吗??谢谢啦 你慢慢看,写的很乱。几年前做一个界面时写的底层:
static void _cbWinBase(WM_MESSAGE * pMsg) //页面回调函数
{
#ifdef __Db_cbWinBase
WM_HWIN HWIN;
#endif
__PageStr *pPage;
S32 NCode, Id;
GUI_PID_STATE State;
WM_MESSAGE Msg;
switch (pMsg->MsgId)
{
case WM_PAINT:
pPage = HWinToPageStr(pMsg->hWin);
GUI_DrawBitmap(pPage->Bmp,0,0);
GUI_DispStringAt(pPage->Caption, 0, 0);
#ifdef __Db_cbWinBase
HWIN = WM_GetActiveWindow(); //获得当前活动的窗口的句柄
LcdShow_Printf(" PaintHWIN-pMhWin=%d-%d ",HWIN,pMsg->hWin);
#endif
break;
case WM_TOUCH:
PageTouch(pMsg);
break;
case WM_TOUCH_CHILD:
PageTouch(pMsg);
Msg = *(WM_MESSAGE*)pMsg->Data.p;
State = *(GUI_PID_STATE*)Msg.Data.p;
if ((pMsg->hWin == ProStack.HWinPage.HWin) && (State.Pressed == 0)) //弹起时处理
{
if (ProStack.MaskHwin == NULL)
{
__HideKeyFun(pMsg);
}
else
{
ProStack.MaskHwin = NULL;
}
}
break;
case WM_NOTIFY_PARENT:
//LcdShow_Printf(" --HWIN=%d,%d-- MsgLock=%d-",pMsg->hWin, pMsg->hWinSrc,MsgLock);
//LcdShow_Printf(" --PARENT-- ");
Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */
NCode = pMsg->Data.v; /* Notification code */
switch (NCode)
{
case WM_NOTIFICATION_VALUE_CHANGED: // Value has changed
break;
case WM_NOTIFICATION_RELEASED: // React only if released
if (KeyIdCheck(0,Id) != NULL)
{ //当前页存在该按键
KeyIdToAction(Id)(pMsg); //运行相应的按键回调函数
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
static void _cbPage(WM_MESSAGE * pMsg) //页面回调函数
{
__PageStr *pPage;
#ifdef __Db_cbPage
WM_HWIN HWIN;
GUI_PID_STATE State;
WM_HWIN CurHWIN;
WM_MESSAGE Msg;
HWIN = WM_GetActiveWindow(); //获得当前活动的窗口的句柄
LcdShow_Printf(" -Cur-hWin-Msg=%d-%d-%d ",HWIN, pMsg->hWin, pMsg->MsgId);
if (ProStack.HWinPage.HWin != HWIN)
{
#ifdef __Db_cbPage
LcdShow_Printf("--cbErrHWin--");
#endif
//WM_DefaultProc(pMsg);
}
#endif
#ifdef __Db_cbPage
//LcdShow_Printf(" -hWin-Msg=%d-%d ",pMsg->hWin, pMsg->MsgId);
/*if ((pMsg->MsgId == 17) || (pMsg->MsgId == WM_TOUCH_CHILD) || (pMsg->MsgId == WM_TOUCH))
//if(pMsg->Data.p != NULL)
{
if (pMsg->MsgId == WM_TOUCH_CHILD)
{
Msg = *(WM_MESSAGE*)pMsg->Data.p;
State = *(GUI_PID_STATE*)Msg.Data.p;
}
else
State = *(GUI_PID_STATE*)pMsg->Data.p;
//if ((State.x>430) && (State.x<600))
{
LcdShow_Printf(" x,y,Pr=%d,%d,%d ", State.x, State.y, State.Pressed);
//CurHWIN = WM_Screen2hWin(101,101);
LcdShow_Printf(" HWIN=%d,%d ",pMsg->hWin, pMsg->hWinSrc);
//BUTTON_SetPressed(CurHWIN,State.Pressed);
//WIDGET_OrState(CurHWIN,BUTTON_STATE_PRESSED);
}
}*/
#endif
pPage = HWinToPageStr(pMsg->hWin);
switch (pPage->Type)
{
case WinBase:
_cbWinBase(pMsg);
break;
default:
break;
}
}
WM_HWIN __CreatePage(__PageStr Page, U32 x0, U32 y0) //创建页面
{
WM_HWIN CurrentHWIN;
WM_HWIN PageHWIN;
CurrentHWIN = WM_GetActiveWindow(); //获得当前活动的窗口的句柄
switch (Page.Type)
{
case WinBase:
PageHWIN = WM_CreateWindowAsChild(
(Page.x0+x0), (Page.y0+y0), Page.xSize, Page.ySize, CurrentHWIN, WM_CF_SHOW, _cbPage, 0);
break;
default:
break;
}
#ifdef __Db__CreatePage
LcdShow_Printf("\r\nCreaterCurHWIN=%d-%d, ",CurrentHWIN,PageHWIN);
LcdShow_Printf(" Page.Type=%d ",Page.Type);
#endif
return PageHWIN;
}
char __EntryPage(__PageStr *pPage, U32 x0, U32 y0) //进入页面,是可以返回当前页的
{
WM_HWIN HWIN;
WM_MESSAGE Message;
#ifdef __Db__EntryPage
LcdShow_Printf("_EntryPage0 ");
#endif
if (ProStack.Index < __PageMax)
{
ProStack.PageSwitch = TRUE;
#ifdef __Db__EntryPage
LcdShow_Printf("_EntryPage1 ");
#endif
__DelAllAction();
__FunDelAllVarRead();
#ifdef __Db__EntryPage
LcdShow_Printf(" EpPage=%x ",pPage);
#endif
HWIN = __CreatePage(*pPage,x0,y0); //创建页面
#ifdef __Db__EntryPage
LcdShow_Printf("_EntryPage2 ");
#endif
ProStackPush(HWIN, pPage);
WM_SelectWindow(HWIN);
WM_MakeModal(HWIN);
#ifdef __Db__EntryPage
LcdShow_Printf(" HWIN=%d ",HWIN);
#endif
__CreateDisp(*pPage);
#ifdef __Db__EntryPage
LcdShow_Printf("_EntryPage3 ");
#endif
__CreateKey(*pPage);
#ifdef __Db__EntryPage
LcdShow_Printf("_EntryPage4 ");
#endif
Message.MsgId= WM_PAINT;
WM_SendMessage(HWIN, &Message);
#ifdef __Db__EntryPage
LcdShow_Printf("_EntryPage5 ");
#endif
ProStack.PageSwitch = FALSE;
return Pass;
}
#ifdef __Db__EntryPage
LcdShow_Printf("_EntryPage6 ");
#endif
return Error;
}
char __JumpPage(__PageStr *pPage, U32 x0, U32 y0) //跳入页面,是不可以返回当前页的
{
WM_HWIN OldHWIN,NewHWIN;
if (ProStack.Index > 1)
{
ProStack.PageSwitch = TRUE;
#ifdef __Db__JumpPage
LcdShow_Printf(" __JumpStart ");
#endif
ProStackPull();
OldHWIN = ProStack.HWinPage.HWin;
WM_DeleteWindow(OldHWIN);
__DelAllAction();
__FunDelAllVarRead();
#ifdef __Db__JumpPage
LcdShow_Printf(" __JumpMid1 ");
#endif
OldHWIN = ProStack.HWinPage.HWin;
WM_MakeModal(OldHWIN);
WM_SelectWindow(OldHWIN);
NewHWIN = __CreatePage(*pPage,x0,y0); //创建页面
ProStackPush(NewHWIN, pPage);
WM_MakeModal(NewHWIN);
WM_SelectWindow(NewHWIN);
#ifdef __Db__JumpPage
LcdShow_Printf(" __JumpMid2 ");
#endif
__CreateDisp(*pPage);
__CreateKey(*pPage);
#ifdef __Db__JumpPage
LcdShow_Printf(" __JumpEnd ");
#endif
ProStack.PageSwitch = FALSE;
ProStack.MaskHwin = NewHWIN;
return Pass;
}
return Error;
}
char __ReturnPage(void) //返回上一级页面
{
WM_HWIN HWIN;
//LcdShow_Printf("__ReturnPage ");
if (ProStack.Index > 1)
{
ProStack.PageSwitch = TRUE;
ProStackPull();
HWIN = ProStack.HWinPage.HWin;
WM_DeleteWindow(HWIN);
#ifdef __Db__ReturnPage
LcdShow_Printf(" DelHWIN=%d ",HWIN);
#endif
__DelAllAction();
__FunDelAllVarRead();
HWIN = ProStack.HWinPage.HWin;
WM_MakeModal(HWIN);
WM_SelectWindow(HWIN);
__CreateActionKey(*ProStack.HWinPage.pPage);
#ifdef __Db__ReturnPage
LcdShow_Printf(" ReturnHWIN=%d ",HWIN);
HWIN = WM_GetActiveWindow(); //获得当前活动的窗口的句柄
LcdShow_Printf(" RCurHWIN=%d ",HWIN);
//OSTimeDly(1500);
GUI_Delay(1500);
HWIN = WM_GetActiveWindow(); //获得当前活动的窗口的句柄
LcdShow_Printf(" RCurHWIN=%d ",HWIN);
#endif
ProStack.PageSwitch = FALSE;
return Pass;
}
return Error;
}
赞同2楼的观点,我的上家公司、现在的公司都是这么做的 hebeijiang 发表于 2013-1-30 13:38 static/image/common/back.gif
你慢慢看,写的很乱。几年前做一个界面时写的底层:
static void _cbWinBase(WM_MESSAGE * pMsg) //页面 ...
HWinToPageStr(pMsg->hWin);
这个函数很关键。。。但是没有给出。。。好吧 我是伸手党,其实我明白了 就是自己写一个控件专门用来显示图片,对话框调用这个控件,就可以显示出来了。。。研究中。。。 我们是小公司了,软件界面简单, 就都自己整了。。。 配色什么的 都挺烦的 找人做界面也不贵啊。自己整可能很难达到人家那种专业的效果。我们也有类似的经历,最后还是决定发出去做了。 。。UCGUI作不出多好看的界面了 就算弄的漂亮GUI也难以实现,我设计的界面在电脑上看也不错,但是弄到板子上就难看了不少。。屏幕还有色差。。。 楼主问题 解决了吗?
GUI_DrawBitmap它总是绘到底层,被对话框档住。
页:
[1]