硬汉嵌入式论坛

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

[有问必答] 界面切换卡死(白屏)

[复制链接]

2

主题

0

回帖

2

积分

新手上路

积分
2
发表于 2016-7-27 19:08:25 | 显示全部楼层 |阅读模式
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.还有可能是不是我没有删除对话框,然后内存被耗光了?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2016-7-28 09:54:21 | 显示全部楼层
出现死机是因为你多次相互创建对话框框A和B,而没有删除,其实你这种简单的创建两个对话框,可以先将A,B都创建好,通过显示和隐藏函数,实现相互切换就行了,
另外就是这个地方,函数GUI_ExecCreatedDialog(MainhWin); 不是退出模态,是执行函数,这样此对话框就成了阻塞对话框了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 15:47 , Processed in 0.043324 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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