OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4505|回复: 4

ucgui创建多对话框出现显示卡死现象

[复制链接]

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
发表于 2015-12-12 11:01:09 | 显示全部楼层 |阅读模式
ucgui创建对话框时候出现问题,我用GUI_CreateDialogBox创建一个对话框A后,利用WM_Exec刷新显示成功。然后我在A对话框的回调函数里用按钮实现弹出B对话框实现之后,在B对话框的回调函数里用按键返回到A对话框,实现之后往复点击几次后屏幕卡死了。请问问题出在哪里?谢谢!

代码如下

static  void  Display_Task(void )
{
    GUI_Init();//ucgui初始化
    while(1)
    {
        ADialogBox(); //创建A对话框
        while (1)
        {
            WM_Exec(); //刷新屏幕
        }
    }
}

static const GUI_WIDGET_CREATE_INFO _MAIN_TABLE[] =
{
    /*窗口控件*/   {  FRAMEWIN_CreateIndirect,    "MyTest",  0, 0, 0, 800,480, FRAMEWIN_CF_ACTIVE,0},
    /*按钮控件*/   {  BUTTON_CreateIndirect,      "下一页",  GUI_ID_BUTTON0,  640, 370, 150, 70, 0,0},
    {  CHECKBOX_CreateIndirect,    NULL,     GUI_ID_chbox,    20,  5,  180,  80,  0,  0},
};

static void _cbCallbackA(WM_MESSAGE * pMsg)
{
    int Id,NCode;
    unsigned short Get_No;
    WM_HWIN hDlg;
    WM_HWIN hItem;

    hDlg = pMsg->hWin;
    switch (pMsg->MsgId)
    {
        case WM_PAINT://重绘事件
            break;
        case WM_INIT_DIALOG: //初始化事件
            MainInitDialog(pMsg);
            break;
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);//控件ID号
           NCode = pMsg->Data.v;//通知代码信号量
            hItem = WM_GetDialogItem(hDlg, Id);
            switch(NCode)
            {
                case WM_NOTIFICATION_RELEASED:
                    if(Id == GUI_ID_BUTTON0)
                    {
                        BDialogBox(); //创建B对话框
                    }
                    break;
                default:
                    break;
            }
            break;
        default:
            WM_DefaultProc(pMsg);
            break;
    }
}

unsigned char ADialogBox(void)
{
    MainhWin = GUI_CreateDialogBox(_MAIN_TABLE, GUI_COUNTOF(_MAIN_TABLE), &_cbCallbackA, 0, 0, 0);//创建一个非阻塞式对话框
    //WM_Exec();
    WM_MakeModal(MainhWin);//设置成模态窗口
    GUI_ExecCreatedDialog(MainhWin); //推出模态对话框
    return 0;
}

//+++++++++++++++++以下是B对话框+++++++++++++++++++++++++++++++++++++

static const GUI_WIDGET_CREATE_INFO _B_TABLE[] =
{
    {  FRAMEWIN_CreateIndirect,    "TestB",  0, 0,   0, 800,480, FRAMEWIN_CF_ACTIVE,0},
    {  BUTTON_CreateIndirect,      "下一页",      GUI_ID_BUTTON0+1,  640, 370, 150, 70, 0,0},
    {  BUTTON_CreateIndirect,      "上一页",      GUI_ID_BUTTON0+2,  300, 370, 150, 70, 0,0},
};

static void _cbCallbackPB(WM_MESSAGE * pMsg)
{
    int Id,NCode;
    WM_HWIN hDlg;
    WM_HWIN hItem;

    hDlg = pMsg->hWin;
    switch (pMsg->MsgId)
    {
        case WM_INIT_DIALOG: //初始化事件
            old_hItem = 0;
            PBInitDialog(pMsg);
            break;
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);//控件ID号
            NCode = pMsg->Data.v;//通知代码信号量
            hItem = WM_GetDialogItem(hDlg, Id);
            switch(NCode)
            {
                case WM_NOTIFICATION_RELEASED:
                    if(Id == GUI_ID_BUTTON0+1)//下一页
                    {
                        //PagePC();//翻页。
                    }
                    if(Id == GUI_ID_BUTTON0+2)//上一页
                    {
                          ADialogBox();//返回A对话框。是不是问题处出这里?我是想实现B对话框上一页按钮返回A对话框。这是两个对话框,如果是三个                                                   //呢?
                    }
                    break;
        default:
            WM_DefaultProc(pMsg);
            break;

    }
}

void BDialogBox(void)
{
    PBhWin = GUI_CreateDialogBox(_B_TABLE, GUI_COUNTOF(_B_TABLE), &_cbCallbackB, 0, 0, 0);//创建一个非阻塞式对话框
    WM_MakeModal(PBhWin);//设置成模态窗口
}



创建两个对话框都成功了,A对话框“下一页”按钮弹出了B对话框;B对话框的“上一页”按钮能显示A对话框,但是反复几次后屏幕就卡死了。
1.我想问题是不是在B对话框的创建里面?A对话框创建后WM_Exec可以刷新;然后B对话框没有刷新?
2.还有可能是不是我没有删除对话框,然后内存被耗光了?
work is work!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-5-23
在线时间
0 小时
发表于 2015-12-14 14:39:10 | 显示全部楼层
我觉得很有可能是第二种情况,如果是我,我会在第二个界面的“上一页”回调函数里把自己这一页删除,这样在下一次执行WM_Exec()时就会只显示第一页了。大体就是第一页创建第二页,第二页删除自己,这样可以保证不重复创建。
回复 支持 反对

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2015-12-29 16:02:18 | 显示全部楼层
唉,还是我自己来结贴吧!原因是这样的:GUI_CreateDialogBox(_B_TABLE, GUI_COUNTOF(_B_TABLE), &_cbCallbackB, 0, 0, 0);这个0是父对话框的句柄。A对话框派生出来的对话框B这个地方不应该是0,应该是A的句柄。这样Display_Task里面的WM_Exec就不会不停的刷对话框,从而避免耗光内存。

不知道是不是这样的,有高手知道详细的,请指点一下。
work is work!!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-29 23:19:23 | 显示全部楼层
sanv 发表于 2015-12-29 16:02
唉,还是我自己来结贴吧!原因是这样的:GUI_CreateDialogBox(_B_TABLE, GUI_COUNTOF(_B_TABLE), &_cbCallb ...

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

69

主题

495

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2197
金钱
2197
注册时间
2015-11-14
在线时间
542 小时
发表于 2015-12-29 23:30:56 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 06:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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