硬汉嵌入式论坛

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

[emWin] stemwin两个窗口切换不成功

[复制链接]

4

主题

13

回帖

25

积分

新手上路

积分
25
发表于 2019-9-12 16:13:06 | 显示全部楼层 |阅读模式
我做了个主界面带icon的 然后通过icon确认进入 下一个界面; 我现在的情况是 2个界面放到主任务都可以正常显示的;但是通过按键调入的时候就显示一个白屏,请问是什么原因
主桌面:
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[]=
{
        { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 320, 240, 0, 0x0, 0 },
        { ICONVIEW_CreateIndirect, "Iconview", ID_ICONVIEW_0, 20, 20, 280, 240, 0, 0x00400030, 0 },
        { TEXT_CreateIndirect, "Text", ID_TEXT_0, 100, 1, 120, 20, 0, 0x64, 0 },
};

子窗口
static const GUI_WIDGET_CREATE_INFO _aDialogCreateRecord[]=
{
        { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 320, 240, 0, 0x0, 0 },
        { LISTVIEW_CreateIndirect, "Listview", ID_LISTVIEW_0 , 0, 0, 280, 200, 0, 0x0, 0 },
};

WM_HWIN CreateWindow(void) {

  hWinmain = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWinmain;
}


WM_HWIN CreateFramewin(void) {

  hWinDesk = GUI_CreateDialogBox(_aDialogCreateRecord, GUI_COUNTOF(_aDialogCreateRecord), _cbRecords, WM_HBKWIN, 0, 0);
  return hWinDesk;
}


下面是按键调用部分,debug跟踪可以看到进入了分支程序:
        case WM_KEY:
                switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
                {
                                case GUI_KEY_ESCAPE:
                                                break;
                                case GUI_KEY_ENTER:
                                                KeySel=ICONVIEW_GetSel(WM_GetDialogItem(pMsg->hWin,ID_ICONVIEW_0));
                                                switch(KeySel)
                                                {
                                                        case 0:
                                                                WM_HideWindow(hWinmain);
                                                                CreateFramewin();                       
//                                                                WM_ShowWindow(hWinDesk);                                               
                                                                break;
                                                        case 1:
                                               
                                                                break;
                                                        case 3:
                                                                break;                                               
                                                }

                                                break;
                }
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-9-12 16:20:26 | 显示全部楼层
外部实体按键操作ICONVIEW不需要进入到WM_KEY,它本身支持好几种消息的,详情可以参考我这个帖子里面的智能家居例子main.c文件和MainTask.c文件看下即可

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-12 16:22:12 | 显示全部楼层
这个例程我参照过了   我现在把实体按键分配给几个系统默认的按键了  就是上下左右 enter和esc;理论上应该也没问题吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-9-12 16:31:51 | 显示全部楼层
飞翔_o6KPw 发表于 2019-9-12 16:22
这个例程我参照过了   我现在把实体按键分配给几个系统默认的按键了  就是上下左右 enter和esc;理论上应该 ...

要注意这个问题:

控件被聚焦的情况下,键盘消息优先发给控件,然后才发给窗口回调消息中的WM_KEY
http://www.armbbs.cn/forum.php?m ... 3690&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-12 16:37:11 | 显示全部楼层
我debug单独跟踪 ,确实执行到了 子窗口的创建;就是实际没显示出来;跟这个键盘聚焦有关系吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-9-12 16:52:22 | 显示全部楼层
飞翔_o6KPw 发表于 2019-9-12 16:37
我debug单独跟踪 ,确实执行到了 子窗口的创建;就是实际没显示出来;跟这个键盘聚焦有关系吗?

直接聚焦到ICONVIEW,然后操作ICONVIEW不是更方便些
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-12 21:10:51 | 显示全部楼层
我先改用例程的方式试试吧,这内部消息处理不熟悉,看来很容易出问题
谢谢
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-13 11:27:12 | 显示全部楼层
我改成例程方式的 效果一样,依然是白屏;想来想去实在想不出哪里出问题了;我没有外壳内存 可能是内存出问题吗?
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-13 11:43:26 | 显示全部楼层
做了下测试  把两个窗口在主任务里面依次调用  显示都是正常的; 改成从一个窗口调用另一个,调用出来就是显示白屏
下面是子窗口回调函数,
static void _cbRecords(WM_MESSAGE* pMsg)
{
        WM_HWIN hWin = pMsg->hWin;
        HEADER_Handle hList;
        switch (pMsg->MsgId)
        {
                case WM_INIT_DIALOG:
                        hList = WM_GetDialogItem(pMsg->hWin, ID_LISTVIEW_0);
                        LISTVIEW_AddColumn(hList,30, "Col 0", GUI_TA_HCENTER | GUI_TA_VCENTER);//添加1列,序号
                        LISTVIEW_AddColumn(hList,30, "Col 1", GUI_TA_HCENTER | GUI_TA_VCENTER);// 地址
                        LISTVIEW_AddColumn(hList,100, "Col 2", GUI_TA_HCENTER | GUI_TA_VCENTER);//时间
                        LISTVIEW_AddColumn(hList,140, "Col 3", GUI_TA_HCENTER | GUI_TA_VCENTER);//告警信息
                        LISTVIEW_SetFont(hList,GUI_FONT_16_1);
                        LISTVIEW_SetHeaderHeight(hList,30);
                        LISTVIEW_SetGridVis(hList,1);//单元格可见
                        LISTVIEW_AddRow(hList, NULL);
                        LISTVIEW_AddRow(hList, NULL);
                        LISTVIEW_SetRowHeight(hList, 14);
                //        WM_SetFocus(hList);
                        break;
                case WM_KEY:
        switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                                case GUI_KEY_ESCAPE:
//            GUI_EndDialog(pMsg->hWin, 0);
                                                                                    //_DeleteFrame();
            break;
                                case GUI_KEY_TAB:
                                                WM_SetFocusOnNextChild(hWin);
                                                break;
//                                case GUI_KEY_NextPage:
//                                        {
//                                                GUI_PID_STATE CurrentState;
//                                                CurrentState.x = WM_GetWindowOrgX(hWin)+3;
//                                                CurrentState.y = WM_GetWindowOrgY(hWin)+3;
//                                                CurrentState.Layer = 0;
//                                                CurrentState.Pressed = 1;
//                                                GUI_PID_StoreState(&CurrentState);
//                                        }
//                                        break;
                                case GUI_KEY_LEFT:
//                                        bsp_LedToggle(3);
                                        break;
            }
            break;
                case WM_PAINT:
//                        _PaintFrame();
//                        GUI_DispStringHCenterAt(_GetLang(TEXT_ID_GELD_ENTNEHMEN), FRAME_WIDTH >> 1, 100);
                        break;
                case WM_NOTIFY_PARENT:
        //                GUI_EndDialog(pMsg->hWin, 0);
                        break;
                default:
                WM_DefaultProc(pMsg);
        }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-9-13 11:48:22 | 显示全部楼层
飞翔_o6KPw 发表于 2019-9-13 11:27
我改成例程方式的 效果一样,依然是白屏;想来想去实在想不出哪里出问题了;我没有外壳内存 可能是内存出问 ...

这个控件比较耗内存,对内存的需求比较大,不过也有折中的解决办法,不让他有按下的动态效果,那个效果比较耗内存。

当前可以这样测试,外部实体按键按下后,直接发个窗口自定义消息,弹出一个窗口是否正常
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-13 11:48:54 | 显示全部楼层
下面是主回调函数
static void _cbDialog(WM_MESSAGE * pMsg) {
        WM_HWIN hItem;
        WM_MESSAGE pMsgInfo;
  int NCode;
  int Id;
  // USER START (Optionally insert additional variables)
        uint8_t i;

  // USER END

  switch (pMsg->MsgId) {
                case WM_PAINT:
                        /* 重绘背景图片 */
                                WM_SetCallback(WM_HBKWIN, &_cbBkWindow);       
                        break;
                case WM_INIT_DIALOG:
                        /* 设置聚焦 */
                        /* 创建文本 */
                        hItem = pMsg->hWin;
                        WINDOW_SetBkColor(hItem, GUI_MAKE_COLOR(GUI_BLUE));                //设置背景颜色智能家居客户端
//               
//                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
//                        TEXT_SetTextColor(hItem, GUI_WHITE);
//                        TEXT_SetFont(hItem, &GUI_FontfontSong16);
//                        TEXT_SetText(hItem, "风阀控制");
//               

//                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_9);
//                        TEXT_SetFont(hItem, GUI_FONT_16B_ASCII);
//                        TEXT_SetTextColor(hItem, 0x00FFFFFF);
//                        TEXT_SetText(hItem, "2014-06-17");
//                       
//                        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_10);
//                        TEXT_SetFont(hItem, GUI_FONT_16B_ASCII);
//                        TEXT_SetTextColor(hItem, 0x00FFFFFF);
//                        TEXT_SetText(hItem, "00:00:00");
               
                                hWinICON = WM_GetDialogItem(pMsg->hWin, ID_ICONVIEW_0);
                                ICONVIEW_SetBkColor(hWinICON,ICONVIEW_CI_BK,GUI_BLUE);                               
                                ICONVIEW_SetIconAlign(hWinICON, ICONVIEW_IA_TOP);
                                ICONVIEW_SetTextColor(hWinICON, ICONVIEW_CI_UNSEL, GUI_WHITE);                                /* 设置小工具的背景色 32 位颜色值的前8 位可用于alpha混合处理效果*/
                                ICONVIEW_SetTextColor(hWinICON, ICONVIEW_CI_SEL, GUI_BLUE);
                                ICONVIEW_SetBkColor(hWinICON,ICONVIEW_CI_SEL,GUI_RED);
                                ICONVIEW_SetFrame(hWinICON, GUI_COORD_X, 0);//设置图标到IconView边框的间距
                                ICONVIEW_SetFrame(hWinICON, GUI_COORD_Y, 0);
                                ICONVIEW_SetSpace(hWinICON, GUI_COORD_X, 25);//设置图标和图标之间的间距
                                ICONVIEW_SetSpace(hWinICON, GUI_COORD_Y, 6);
                                ICONVIEW_SetFont(hWinICON, &GUI_FontfontSong16);                                /* 设置字体 */
                                ICONVIEW_SetIconAlign(hWinICON, ICONVIEW_IA_HCENTER|ICONVIEW_IA_TOP);                        /* 设置对齐方式 在5.22版本中最新加入的 */                       
                                for (i = 0; i < GUI_COUNTOF(_aBitmapItem); i++)                                 /* 向ICONVIEW 小工具添加新图标 */
                                {       
                                        ICONVIEW_AddBitmapItem(hWinICON, _aBitmapItem[i].pBitmap, _aBitmapItem[i].pText);
                                }
                       
//                                WM_SetFocus(hItem);                //窗口初始化最后,设置焦点到图标控件  
               
//                                WM_CreateTimer(WM_GetClientWindow(hWinMain), /* 接受信息的窗口的句柄 */
//                                                                 ID_TimerTime,                      /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
//                                                                 20,                           /* 周期,此周期过后指定窗口应收到消息*/
//                                                                 0);                                 /* 留待将来使用,应为0 */

                        break;       
        case WM_TIMER:
                        /* 显示时间和日期 */
                        Caculate_RTC(pMsg);

                        /* 重启定时器 */
                        WM_RestartTimer(pMsg->Data.v, 1000);
                        break;
        /*  发送按下的消息 */
        case MSG_SetENTER:
                        pMsgInfo.MsgId = WM_NOTIFY_PARENT;
                        pMsgInfo.hWinSrc = hWinICON;
                        pMsgInfo.Data.v = WM_NOTIFICATION_RELEASED;
                        WM_SendMessage(pMsg->hWin, &pMsgInfo);       
                        break;
               
                /*  设置ICON的聚焦 */
        case MSG_SetICONFocus:
                        WM_SetFocus(hWinICON);
                        break;
               
                /* 删除通过ICON创建的对话框 */
        case MSG_Delect:
                        if(WM_IsWindow(hWinInfo))
                        {
                                WM_DeleteWindow(hWinInfo);                       
                        }
                        break;
  case WM_NOTIFY_PARENT:
                        Id    = WM_GetId(pMsg->hWinSrc);     
                        NCode = pMsg->Data.v;               
                        switch (Id)
                        {
                                /* 点击ICONVIEW上相应的图标,打开相应的窗口 */
                                case ID_ICONVIEW_0:
                                        switch (NCode)
                                        {
                                                case  WM_NOTIFICATION_RELEASED:
                                                       
                                                        s_ucSelIconIndex  = ICONVIEW_GetSel(pMsg->hWinSrc);
                                               
                                                        switch( ICONVIEW_GetSel(pMsg->hWinSrc))
                                                        {
                                                                /* 视频监控 */
                                                                case 0:
                                                                        hWinInfo = GUI_CreateDialogBox(_aDialogCreateRecord, GUI_COUNTOF(_aDialogCreateRecord), &_cbRecords, 0, 0, 0);                               
                                                                    break;       
                                                               
                                                                /* 灯光控制 */
                                                                case 1:
                                                                       
                                                                        break;       
                                                               
                                                                /* 智能门窗 */
                                                                case 2:
               
                                                                    break;       
                                                               
                                                                /* 电器控制 */
                                                                case 3:
                       
                                                                    break;
                                                               
                                                                /* 信息查询 */
                                                                case 4:
                       
                                                                    break;       
                                                               
                                                                /* 安防报警 */
                                                                case 5:
                       
                                                                    break;       
                                                               
                                                                /* 背景音乐 */
                                                                case 6:
                                                       
                                                                    break;       
                                                               
                                                                /* 情景模式 */
                                                                case 7:
                                               
                                                                    break;       
                                                               
                                                                /* 定时管理 */
                                                                case 8:
                                               
                                                                    break;
                                                               
                                                                /* 系统设置 */
                                                                case 9:
                                                               
                                                                    break;
                                                               
                                                                default:
                                                                        break;
                                                        }       
                                                 break;
                                        }
                                break;
                        }
    // USER START (Optionally insert additional code for further Ids)
    // USER END
    break;
  // USER START (Optionally insert additional message handling)
  // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-13 13:46:22 | 显示全部楼层
eric2013 发表于 2019-9-13 11:48
这个控件比较耗内存,对内存的需求比较大,不过也有折中的解决办法,不让他有按下的动态效果,那个效果比 ...

谢谢,我试了一下其他控件 是正常的;看来确实是 listview空间引起了内存问题;但是为什么我从主任务里面 依次显示就没问题呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-9-14 12:46:22 | 显示全部楼层
飞翔_o6KPw 发表于 2019-9-13 13:46
谢谢,我试了一下其他控件 是正常的;看来确实是 listview空间引起了内存问题;但是为什么我从主任务里面 ...

把这个消息 WM_NOTIFICATION_RELEASED改成CLICKED点击消息好点
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-14 14:21:31 | 显示全部楼层
再请教一下内存分配的问题:
我用的stm32f103VE  应该有64k的空间

我程序配置 #define GUI_NUMBYTES  (1024*20)   直接编译错误
我改成 1k 和 10k 看了一下结果:

当:#define GUI_NUMBYTES  (1024*1) 时:
Program Size: Code=85316 RO-data=47804 RW-data=1072 ZI-data=7232  

当#define GUI_NUMBYTES  (1024*10) 时:
Program Size: Code=85316 RO-data=47804 RW-data=1072 ZI-data=44096  

当#define GUI_NUMBYTES  (1024*14) 时:
Program Size: Code=85316 RO-data=47804 RW-data=1072 ZI-data=60480  

再大了就直接出现link错误了 应该是内存不足了吧
我看ZI-data时我设置1024*14的时候就 60480 这就60k了?
网上看到有些帖子 用的103VE的可以设置成 1024*50;为什么我这里明显超出了呢?是我有哪里配置不对吗?
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-14 15:02:57 | 显示全部楼层
总觉得64k 两个页面都显示不了 ;是不是某些地方用得不对呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-9-16 10:50:08 | 显示全部楼层
飞翔_o6KPw 发表于 2019-9-14 15:02
总觉得64k 两个页面都显示不了 ;是不是某些地方用得不对呢

有一个可以获得动态内存剩余的API,可以调用下
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-9-17 08:23:06 | 显示全部楼层
1.你是不是用了很多图片,直接编译到程序空间里面了?
2.下面两个使用方法还是有区别的。一个用户数据放在ZI内存,一个编译到code,用的时候再加载。
//const uint8_t DefaultData[]={
vsc8 DefaultData[]={

Releasing your creativity
回复

使用道具 举报

4

主题

13

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-9-17 10:39:10 | 显示全部楼层
是有些图标 放到程序区了    用的const  
回复

使用道具 举报

354

主题

2164

回帖

3231

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3231
发表于 2019-9-17 11:07:28 | 显示全部楼层
飞翔_o6KPw 发表于 2019-9-14 14:21
再请教一下内存分配的问题:
我用的stm32f103VE  应该有64k的空间

这个看看map文件,就知道了哈!
每个变量,每个函数用了多少ram和rom都很清楚的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 07:14 , Processed in 0.341523 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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