OpenEdv-开源电子网

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

用ucGUI建立了一个窗口和一个按键,程序跳不出来了,是什么原因?

[复制链接]

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-11-4
在线时间
1 小时
发表于 2013-5-24 12:28:12 | 显示全部楼层 |阅读模式
用硬件仿真器观察,程序进入GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0)后就再也没出来,
跟踪进入 GUI_ExecDialogBox发现程序在GUI_ExecCreatedDialog里没出来,再进入GUI_ExecCreatedDialog里发现程序在
  while (!DialogStatus.Done) {
    if (!GUI_Exec()) {
      GUI_X_WAIT_EVENT();      /* Wait for event (keyboard, mouse or whatever) */
    }
  }
程序在这里一直循环,不知道为什么,
这就导致程序不能进行其他的任务,比如触摸屏坐标获取任务。。。
不知道大家遇到过这样的问题没有,求解!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

89

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2012-10-6
在线时间
9 小时
发表于 2013-5-24 14:23:37 | 显示全部楼层
楼主上代码呀····还不会移植触摸屏呢~~~~~~~~~~~~~~~·····借来参考参考谢谢
回复 支持 反对

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-11-4
在线时间
1 小时
 楼主| 发表于 2013-5-25 10:39:47 | 显示全部楼层
回复【2楼】weiwei:
---------------------------------
我的触摸功能也没成功,网上都有视频教程移植了,好像是奋斗出的,怎么不去看看
回复 支持 反对

使用道具 举报

16

主题

89

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2012-10-6
在线时间
9 小时
发表于 2013-5-25 19:58:43 | 显示全部楼层
回复【3楼】lzw520:
---------------------------------
看了···不会
回复 支持 反对

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-10-27
在线时间
12 小时
发表于 2014-8-18 16:19:59 | 显示全部楼层
楼主问题解决了吗,我用的emwin5.22,利用自带的CHOOSEFILE(...)函数创建的文件管理,调用GUI_ExecCreatedDialog()后出不来了。不过我的看不到源码,是一个封装库文件,
既然来了,就留下您的痕迹呗......
回复 支持 反对

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-11-4
在线时间
1 小时
 楼主| 发表于 2014-8-19 11:47:13 | 显示全部楼层
回复【5楼】glyxz1990:
---------------------------------
GUI_ExecDialogBox是阻塞对话框,你用GUI_CreateDialogBox
回复 支持 反对

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-10-27
在线时间
12 小时
发表于 2014-8-19 15:18:18 | 显示全部楼层
回复【6楼】lzw520:
---------------------------------
我知道GUI_ExecDialogBox是阻塞对话框,但是用到了CHOOSEFILE函数了,只能通过执行GUI_ExecDialogBox来处理啊,但是一用到GUI_ExecDialogBox就死了。
还有个问题就是,用到GUI_MessageBox()函数也会死掉,原因可能是里面也用到了GUI_ExecDialogBox,所以只要一用到GUI_ExecDialogBox就死了。
既然来了,就留下您的痕迹呗......
回复 支持 反对

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-11-4
在线时间
1 小时
 楼主| 发表于 2014-8-19 18:58:48 | 显示全部楼层
回复【7楼】glyxz1990:
---------------------------------
GUI_ExecDialogBox函数里有这么一段:
while (!DialogStatus.Done) {
    if (!GUI_Exec()) {
      GUI_X_WAIT_EVENT();      /* Wait for event (keyboard, mouse or whatever) */
    }
  }    这个值DialogStatus.Done一直是0,所以程序会阻塞在这个while循环里,跳不出来。
你说的自带的CHOOSEFILE不是emWIN里的吧。
“用到GUI_MessageBox()函数也会死掉”,这是指死机么?
回复 支持 反对

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-10-27
在线时间
12 小时
发表于 2014-8-20 08:06:38 | 显示全部楼层
回复【8楼】lzw520:
---------------------------------
GUI_MessageBox()是不是死机还是出不来,我没有调试,不清楚。我单独测试GUI_MessageBox还想可以执行,不知道是不是多对话框处理不好的问题。

/*********************************************************************
*                                                                    *
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
*                                                                    *
**********************************************************************
*                                                                    *
* C-file generated by:                                               *
*                                                                    *
*        GUI_Builder for emWin version 5.22                          *
*        Compiled Jul  4 2013, 15:16:01                              *
*        (c) 2013 Segger Microcontroller GmbH & Co. KG               *
*                                                                    *
**********************************************************************
*                                                                    *
*        Internet: www.segger.com  Support: support@segger.com       *
*                                                                    *
**********************************************************************
*/

#include "DIALOG.h"
#include "MyTask.h"

#define FILE_PATH_MAX   150

static WM_HWIN hWin_parent;

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_FRAMEWIN_0   (GUI_ID_USER + 0x00)
#define ID_TREEVIEW_0   (GUI_ID_USER + 0x01)

static void OpenFileProcess(WM_HWIN hWin,u8* path)
{
    if(strstr((char*)path,".txt")||strstr((char*)path,".TXT")
        ||strstr((char*)path,".c")||strstr((char*)path,".C")
        ||strstr((char*)path,".cpp")||strstr((char*)path,".CPP")
        ||strstr((char*)path,".h")||strstr((char*)path,".H"))//判断是否可以使用txt格式打开
    {
        TEXTReader(hWin,path);
    }
    else if(strstr((char*)path,".bmp")||strstr((char*)path,".BMP")||
            strstr((char*)path,".jpg")||strstr((char*)path,".JPG")||
            strstr((char*)path,".png")||strstr((char*)path,".PNG")||
            strstr((char*)path,".gif")||strstr((char*)path,".GIF"))
    {
        /* 显示图片 */
// ImageReader_FrameWin((char*)path);
    }
    else if(strstr((char*)path,".mp3")||strstr((char*)path,".MP3")
            ||strstr((char*)path,".wav")||strstr((char*)path,".WAV"))
    {
        GUI_MessageBox("Sorry,do not support open the file!","Sorry",GUI_MESSAGEBOX_CF_MOVEABLE);
    }
    else
    {
        GUI_MessageBox("Sorry,do not support open the file!","Sorry",GUI_MESSAGEBOX_CF_MOVEABLE);
    }
}

/************************************************************************************
*函数:  ScanFiles
*作者:  alan
*日期:  2014.07.07
*参数:  path:遍历路径名
        hFile:记录文件路径的文件指针结构体
*返回:  None
*描述:  遍历此文件夹及子文件夹下所有文件
************************************************************************************/
static FRESULT ScanFiles(char* path,WM_HWIN hTree, TREEVIEW_ITEM_Handle hNode,FILE_TYPE fileType,u32 *fileNum,u8 treeflag)
{
    FRESULT res;
    FILINFO fno;
    DIR dir;
    UINT rw;
    int i;
    char *fn;   /* This function is assuming non-Unicode cfg. */
    TREEVIEW_ITEM_Handle hItem;
    
#if _USE_LFN
    static char lfn[FILE_PATH_MAX]={0};   /* Buffer to store the LFN */
    fno.lfname = lfn;
    fno.lfsize = sizeof(lfn);
#endif

    res = f_opendir(&dir, (const TCHAR*)path);                       /* Open the directory */
    if (res == FR_OK)
    {
        i = strlen((const char*)path);
        for (;;) 
        {
            res = f_readdir(&dir, &fno);                   /* Read a directory item */
            if (res != FR_OK || fno.fname[0] == 0) break;  /* Break on error or end of dir */
            if (fno.fname[0] == '.') continue;             /* Ignore dot entry */ //忽略上级目录
#if _USE_LFN
            fn = *fno.lfname ? fno.lfname: fno.fname;
#else
            fn = fno.fname;
#endif
            if (fno.fattrib & AM_DIR) /* It is a directory */
            {
                if(hTree != NULL && hNode != NULL && treeflag)
                {
                    //目录,创建结点
                    hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_NODE,fn,0);
                    //把结点加入到目录树中
                    TREEVIEW_AttachItem(hTree,hItem,hNode,TREEVIEW_INSERT_FIRST_CHILD);
                }
                else
                {
                    hItem=hNode;
                }
                //在路径最后添加文件夹路径名
                sprintf(&path, "/%s", fn);
                //遍历此新文件夹下的文件
                res = ScanFiles(path,hTree,hItem,fileType,fileNum,treeflag);
                if (res != FR_OK) break;//打开失败,跳出循环
                path = 0;//末尾添加结束字符
            } 
            else /* It is a file. */
            {
                if(fileType == TEXTFILE )
                {
                    //判断如果不是txt文件,跳出本函数
                    if(!(strstr(fn,".txt")||strstr(fn,".TXT")
                        ||strstr(fn,".c")||strstr(fn,".C")
                        ||strstr(fn,".cpp")||strstr(fn,".CPP")
                        ||strstr(fn,".h")||strstr(fn,".H")))
                    {
                        return res;
                    }
                }
                //判断如果不是Image文件,跳出本函数
                else if(fileType ==IMAGEFILE)
                {
                    if(!(strstr(fn,".bmp")||strstr(fn,".BMP")||
                        strstr(fn,".jpg")||strstr(fn,".JPG")||
                        strstr(fn,".gif")||strstr(fn,".GIF")||
                        strstr(fn,".png")||strstr(fn,".PNG")))
                    {
                        return res;
                    }
                }
                /* 根据要求是否创建目录树 */
                if(hTree != NULL && hNode != NULL)//创建目录树
                {
                    hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_LEAF,fn,0);//文件,创建树叶
                    TREEVIEW_AttachItem(hTree,hItem,hNode,TREEVIEW_INSERT_FIRST_CHILD);//把树叶添加到目录树
//                    (*fileNum)++;//记录文件数目
                }
                else
                {
                    (*fileNum)++;//记录文件数目
                }
            }

        }
        f_closedir(&dir);
    }
    return res;
}

void Fill_FileList(char *path,WM_HWIN hTree, TREEVIEW_ITEM_Handle hNode,FILE_TYPE fileType,u32 *fileNum,u8 treeflag)
{
    TREEVIEW_ITEM_Handle hTreeItem_Flash;
    TREEVIEW_ITEM_Handle hTreeItemCur;
    static char p_path[FILE_PATH_MAX]={0};  //目录名 指针
// FIL hFile;  //文件句柄
FRESULT fres;   //返回结果
    
    hTreeItemCur=hNode;
    strcpy(p_path,path);    //复制目录名到指针
    fres = ScanFiles(p_path,hTree,hNode,fileType,fileNum,treeflag);    //递归扫描文件
    
    hTreeItem_Flash = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_NODE, "Flash[1:]", 0);
    TREEVIEW_AttachItem(hTree, hTreeItem_Flash, hTreeItemCur, TREEVIEW_INSERT_BELOW);
    strcpy(p_path,"1:");    //复制目录名到指针
    fres = ScanFiles(p_path,hTree,hTreeItem_Flash,fileType,fileNum,treeflag);    //递归扫描文件
}
/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    { FRAMEWIN_CreateIndirect, "FileBrower", ID_FRAMEWIN_0, 0, 0, 240, 320, 0, 0x64, 0 },
//    { TREEVIEW_CreateIndirect, "Treeview", ID_TREEVIEW_0, 0, 0, 230, 293, 0, 0x0, 0 },
};

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/

void get_pathname(WM_HWIN hTree,TREEVIEW_ITEM_Handle hNode,int level,u8* path)
{
    int i;
    u8 len=0;
    static TREEVIEW_ITEM_Handle hparent[50]={0};//最大50级目录
    static u8 hItemname[100]={0};
    
    hparent[level]=hNode;//先保存最后一级的句柄
    //获取各级句柄
    for(i=level;i>0;i--)
    {
        hparent[i-1]=TREEVIEW_GetItem(hTree, hparent, TREEVIEW_GET_PARENT);//父句柄
    }
    //先判断根目录
    TREEVIEW_ITEM_GetText(hparent[0],hItemname,99);
    if(0==strcmp((char*)hItemname,"SDCard[0:]"))
    {
        sprintf((char*)path,"%s","0:");
    }
    else if(0!=strcmp((char*)hItemname,"Flash[1:]"))
    {
        sprintf((char*)path,"%s","1:");
    }
    else
    {
        sprintf((char*)path,"%s",hItemname);
    }
    //根据句柄获取文本
    for(i=1;i<=level;i++)
    {
        TREEVIEW_ITEM_GetText(hparent,hItemname,99);
        len=strlen((char*)path);
        sprintf((char*)(path+len),"/%s",hItemname);
    }
}

/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog(WM_MESSAGE * pMsg) {
  TREEVIEW_ITEM_INFO ItemInfo;
  TREEVIEW_ITEM_Handle hNode;
  WM_HWIN hItem;
  int     NCode;
  int     Id;  
  u8 *pathname;
  GUI_HMEM hMem_pathname;

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of 'FileBrower'
    //
    hItem = pMsg->hWin;
    FRAMEWIN_SetFont(hItem, &GUI_FontHZ16);
    FRAMEWIN_SetTitleHeight(hItem, 20);
    FRAMEWIN_SetText(hItem, "FileBrower");
    FRAMEWIN_AddCloseButton(hItem, FRAMEWIN_BUTTON_RIGHT, 0);
    FRAMEWIN_AddMaxButton(hItem, FRAMEWIN_BUTTON_RIGHT, 1);
    FRAMEWIN_AddMinButton(hItem, FRAMEWIN_BUTTON_RIGHT, 2);
    FRAMEWIN_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
    FRAMEWIN_SetTextColor(hItem, 0x00000000);
    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_TREEVIEW_0: // Notifications sent by 'Treeview'
      /* 查看选中了哪个项目 */
      hNode = TREEVIEW_GetSel(pMsg->hWinSrc);
      /* 获取该项目的信息 */
      TREEVIEW_ITEM_GetInfo(hNode,&ItemInfo);
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        break;
      case WM_NOTIFICATION_RELEASED:
        if(ItemInfo.IsNode == 0)//点击的是目录树的叶子(即文件)
        {
            hMem_pathname = GUI_ALLOC_AllocZero(FILE_PATH_MAX);
            pathname = GUI_ALLOC_h2p(hMem_pathname);
            hItem=WM_GetDialogItem(pMsg->hWin, ID_TREEVIEW_0);
            get_pathname(hItem,hNode,ItemInfo.Level,pathname);
            printf("\r\n%s\r\n",pathname);
            GUI_ALLOC_Free(hMem_pathname);
            //调用打开文件相应的程序
            OpenFileProcess(pMsg->hWinSrc,pathname);
        }
        break;
      case WM_NOTIFICATION_MOVED_OUT:
        break;
      case WM_NOTIFICATION_SEL_CHANGED:
        break;
      }
      break;
    }
    break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

/*********************************************************************
*
*       ublic code
*
**********************************************************************
*/
/*********************************************************************
*
*       CreateFileBrower
*/
void CreateFileBrower(WM_HWIN hWin,u8 treeflag);
void CreateFileBrower(WM_HWIN hWin,u8 treeflag)
{
    WM_HWIN hFileBrower;//浏览器窗口
    WM_HWIN hFileBrowerC;//浏览器客户区窗口
    WM_HWIN hTree;//树形窗口
    TREEVIEW_ITEM_Handle    hTreeItemCur;
    TREEVIEW_ITEM_Handle    hTreeItem_SDCard;
    u32 FileNum=0;
    
    hWin_parent=hWin;
    
    hFileBrower = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
    hFileBrowerC = WM_GetClientWindow(hFileBrower);/* 获取框架窗口用户区的句柄 */
    hTree = TREEVIEW_CreateEx(0, 0, 
                                WM_GetWindowSizeX(hFileBrowerC),
                                WM_GetWindowSizeY(hFileBrowerC), 
                                hFileBrowerC,
                                WM_CF_SHOW,
                                0,
                                ID_TREEVIEW_0);
    SCROLLBAR_CreateAttached(hTree,0);//水平滚动条
    SCROLLBAR_CreateAttached(hTree,SCROLLBAR_CF_VERTICAL);//垂直
//    TREEVIEW_SetAutoScrollV(hTree, 1);    //使用自动滑动条
//    TREEVIEW_SetAutoScrollH(hTree, 1);    //使用自动滑动条
    TREEVIEW_SetSelMode(hTree, TREEVIEW_SELMODE_ROW);
    TREEVIEW_SetFont(hTree,&GUI_FontHZ16);
    hTreeItemCur = TREEVIEW_GetItem(hTree, 0, TREEVIEW_GET_LAST);
    hTreeItem_SDCard = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_NODE, "SDCard[0:]", 0);
    TREEVIEW_AttachItem(hTree, hTreeItem_SDCard, hTreeItemCur, TREEVIEW_INSERT_BELOW);
    Fill_FileList("0:",hTree,hTreeItem_SDCard,ALLFILE,&FileNum,treeflag);
}


/*************************** End of file ****************************/

上面有GUI_MessageBox,执行后就死了。
既然来了,就留下您的痕迹呗......
回复 支持 反对

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-10-27
在线时间
12 小时
发表于 2014-8-20 08:08:33 | 显示全部楼层
回复【8楼】lzw520:
---------------------------------
CHOOSEFILE()函数对话框在emwin5.22里是有的,英文版里有介绍的。5.16之后开始有了。
既然来了,就留下您的痕迹呗......
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-12-5
在线时间
0 小时
发表于 2015-12-5 08:42:33 | 显示全部楼层
回复【9楼】glyxz1990:
---------------------------------
Hello, thanks for share your code, but i need of the file MyTask.h, because of the files ALLFILE and fileType, congratulations.

Rodrigo - Brazil
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2013-9-25
在线时间
60 小时
发表于 2016-4-17 17:01:20 | 显示全部楼层
请问楼主这个问题最后怎么解决的??遇到同样的问题了,求指导
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 03:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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