打印

UCGUI对话框中显示图片的问题?

[复制链接]
7837|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flyingbugcc|  楼主 | 2013-1-29 11:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人正在做UCGUI界面,界面都采用对话框形式切换,为了好看需要添加图片在对画框中,我试过用按钮然后给按钮添加图片,但是比较难看,而且不规则形状的图片很按钮形状不适应,请问在对话框中显示图片还有其他方法么? 或者在对话框中绘图,这样行的通吗?

相关帖子

沙发
shell.albert| | 2013-1-29 11:13 | 只看该作者
为了美观,在软件的定制过程中,一般由美工绘制图片,然后交与软件开发人员。
由软件开发人员再进行贴图。
自己绘制?一般不要这么想了,数据量大,而且麻烦。不如贴图来得实惠。

使用特权

评论回复
评论
nongfuxu 2013-1-29 12:23 回复TA
~赞同~ 
板凳
flyingbugcc|  楼主 | 2013-1-29 11:41 | 只看该作者
自己绘的也是简单的矩形,也无所谓了,在UCGUI对话框中贴图,除了在按钮上贴,还有其他方法么?

使用特权

评论回复
地板
hebeijiang| | 2013-1-29 16:57 | 只看该作者
很久没有用过了,感觉就使用普通页面切换就可以了,这样图片也好做,好处理。
几年前做的一个函数:
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 是页面回调函数。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
flyingbugcc + 2 赞一个!
5
flyingbugcc|  楼主 | 2013-1-30 09:36 | 只看该作者
首先感谢楼上的回答,给我了很大的启发,代码我还没有试,等下试试...我的理解你的方法就是新建一个字窗口把图片放在子窗口里来显示,我先搞一下 再来反馈

使用特权

评论回复
6
flyingbugcc|  楼主 | 2013-1-30 11:04 | 只看该作者
hebeijiang 发表于 2013-1-29 16:57
很久没有用过了,感觉就使用普通页面切换就可以了,这样图片也好做,好处理。
几年前做的一个函数:
WM_HWI ...

请问往子窗口页面贴图用那个函数啊物品用GUI_DrawBitmap(&bmESC,50,50);他始终是绘制在最底层。。。你的代码中__PageStr Page;中后边的几个变量怎么应用,能吧__cbPage的代码给我看一下吗??谢谢啦

使用特权

评论回复
7
hebeijiang| | 2013-1-30 13:38 | 只看该作者
你慢慢看,写的很乱。几年前做一个界面时写的底层:
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[ProStack.Index-1].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[ProStack.Index-1].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[ProStack.Index].HWin;
                WM_DeleteWindow(OldHWIN);
                __DelAllAction();
                __FunDelAllVarRead();
                #ifdef __Db__JumpPage
                LcdShow_Printf(" __JumpMid1 ");
                #endif
                OldHWIN = ProStack.HWinPage[ProStack.Index-1].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[ProStack.Index].HWin;
                WM_DeleteWindow(HWIN);
                #ifdef        __Db__ReturnPage
                LcdShow_Printf(" DelHWIN=%d ",HWIN);
                #endif
                __DelAllAction();
                __FunDelAllVarRead();
                HWIN = ProStack.HWinPage[ProStack.Index-1].HWin;
                WM_MakeModal(HWIN);
                WM_SelectWindow(HWIN);
                __CreateActionKey(*ProStack.HWinPage[ProStack.Index-1].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;
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
flyingbugcc + 1 很给力!
8
蓝格子| | 2013-1-30 15:28 | 只看该作者
赞同2楼的观点,我的上家公司、现在的公司都是这么做的

使用特权

评论回复
9
flyingbugcc|  楼主 | 2013-1-30 16:56 | 只看该作者
hebeijiang 发表于 2013-1-30 13:38
你慢慢看,写的很乱。几年前做一个界面时写的底层:
static void _cbWinBase(WM_MESSAGE * pMsg)                         //页面 ...

HWinToPageStr(pMsg->hWin);
这个函数很关键。。。但是没有给出。。。好吧 我是伸手党,其实我明白了 就是自己写一个控件专门用来显示图片,对话框调用这个控件,就可以显示出来了。。。研究中。。。

使用特权

评论回复
10
flyingbugcc|  楼主 | 2013-1-30 16:58 | 只看该作者
我们是小公司了,软件界面简单, 就都自己整了。。。 配色什么的 都挺烦的

使用特权

评论回复
11
xinyipcb| | 2013-1-30 17:08 | 只看该作者
找人做界面也不贵啊。自己整可能很难达到人家那种专业的效果。我们也有类似的经历,最后还是决定发出去做了。

使用特权

评论回复
12
flyingbugcc|  楼主 | 2013-1-31 09:59 | 只看该作者
。。UCGUI作不出多好看的界面了 就算弄的漂亮GUI也难以实现,我设计的界面在电脑上看也不错,但是弄到板子上就难看了不少。。屏幕还有色差。。。

使用特权

评论回复
13
BH7KQK| | 2019-3-20 13:29 | 只看该作者
楼主问题 解决了吗?
GUI_DrawBitmap它总是绘到底层,被对话框档住。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

24

帖子

1

粉丝