硬汉嵌入式论坛

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

[emWin] 使用emwin显示edit编辑框的问题

[复制链接]

11

主题

104

回帖

137

积分

初级会员

积分
137
发表于 2017-7-24 08:43:21 | 显示全部楼层 |阅读模式
最近在做触摸edit小工具弹出小键盘的事,但是一直没有做成功。具体的实现流程应该是:
1.在界面m触摸edit小工具后直接在界面m的某个指定位置弹出小键盘
2.这个小键盘应该具有“模态”窗口的属性,具体是指只能触摸小键盘区域,窗口m的区域不在支持触摸
3.其他小可爱~
现在的问题就是我在弹出小键盘的时候,能显示小键盘的背景图片跟字符,但就是不能显示小键盘窗口上面的edit框。
然而如果我在创建小键盘窗口的时候如果依次做了删除界面m、创建小键盘窗口、设置背景色、清屏(相当于直接重新创建一个窗口),这时候能显示完全的小键盘,但这是不符合要求的,因为我需要将小键盘显示在界面m上面,不能删除它。具体的现象及部分源代码我会贴在下面,不知道有没有好汉知道这是怎么回事呢?
  1. void CreateKeyboard(WindowElem window)
  2. {
  3.     /*
  4.     **    此函数说明:
  5.         1.此函数不需要保存LastHwin参数,也不需要删除上一个窗口
  6.         2.需要保存的是keyboardID,在退出小键盘编辑状态的时候删除这个窗口,并退回之前的窗口
  7.     */
  8.     WM_HWIN hWin;
  9. //WM_DeleteWindow(LastHwin);     //1.删除界面m
  10.     hWin = WM_CreateWindow(window.x, window.y, window.width, window.height, WM_CF_SHOW, NULL, 0);
  11.     //LastHwin = hWin;
  12.     WM_SelectWindow(hWin);
  13. //GUI_SetBkColor(window.bgkColor); //2.设置清屏的背景色
  14. //GUI_Clear();              //3.清屏
  15. }
  16. void showKeyboard(int WindowID)
  17. {
  18.     WindowList *we = myWindowList->next;
  19.     NewWindowID = WindowID;
  20.     while (we->data.number != WindowID)   we = we->next;
  21.     if (we)
  22.     {
  23.         CreateKeyboard(we->data);
  24.         showKeyboardCell(we->data);
  25.     }
  26. }
  27. void showKeyboardCell(WindowElem window)
  28. {
  29.     /*
  30.     **    此函数说明:
  31.     1.使用此函数显示小键盘的按钮、字符、edit、背景图片
  32.     */
  33.     NumberList *numberList = window.num->next;
  34.     ButtonList *buttonList = window.button->next;
  35.     ImageList *imageList = window.image->next;
  36.     StringList *stringList = window.str->next;
  37.     int curCellID = 0, haveFind = 0;
  38.     while (numberList || buttonList || imageList || stringList)
  39.     {
  40.         if (numberList && haveFind == 0)
  41.         {
  42.             if (curCellID == numberList->data.cellID)
  43.             {
  44.                 showNumber(*numberList);
  45.                 numberList = numberList->next;
  46.                 haveFind = 1;
  47.                 curCellID++;
  48.             }
  49.         }
  50.         if (buttonList && haveFind == 0)
  51.         {
  52.             if (curCellID == buttonList->data.cellID)
  53.             {
  54.                 showButton(*buttonList);
  55.                 buttonList = buttonList->next;
  56.                 haveFind = 1;
  57.                 curCellID++;
  58.             }
  59.         }
  60.         if (imageList && haveFind == 0)
  61.         {
  62.             if (curCellID == imageList->data.cellID)
  63.             {
  64.                 showImage(*imageList);
  65.                 imageList = imageList->next;
  66.                 haveFind = 1;
  67.                 curCellID++;
  68.             }
  69.         }
  70.         if (stringList && haveFind == 0)
  71.         {
  72.             if (curCellID == stringList->data.cellID)
  73.             {
  74.                 showString(*stringList);
  75.                 stringList = stringList->next;
  76.                 haveFind = 1;
  77.                 curCellID++;
  78.             }
  79.         }
  80.         if (haveFind == 0)  curCellID++;
  81.         else   haveFind = 0;
  82.     }
  83. }
  84. void showNumber(NumberList numberList)
  85. {
  86.     //显示的字符要跟随寄存器值变化,首先需要获取寄存器值
  87.     DrawEdit(numberList.data.cellID, numberList.data.x, numberList.data.y, numberList.data.width,numberList.data.height,numberList.data.font,numberList.data.fontcolor,numberList.data.fontsize,numberList.data.bgkColor,numberList.data.NumberType,numberList.data.m_numFormat,numberList.data.RegType,numberList.data.RegID,numberList.data.keyboard);
  88. }
  89. void DrawEdit(int cellID, int x, int y, int width, int height, int font, int fontColor, int fontSize, int bgkColor, int numberType, int M_numFormat, int RegType, int RegID, int keyboard)
  90. {
  91.     /*
  92.     **    函数说明:
  93.         1.字体暂时使用等宽字体
  94.         2.显示的格式使用文本,可以使用sprintf函数将数值转换成文本显示出来
  95.         3.句柄的动态创建通过将cellID的类型强制转换成EDIT_Handle
  96.         4.将寄存器的值读出来赋给value
  97.     */
  98.     char buf[50];
  99.     char value = 0;
  100.     EDIT_Handle hEdit;
  101.    
  102.     hEdit = EDIT_CreateEx(x, y, width, height, LastHwin, WM_CF_SHOW, 0, cellID, 15);    //暂时只支持输入、显示15个字符
  103.     sprintf(buf, "%d", value);        //将value转换成字符串的形式,以便使用
  104.     EDIT_SetText(hEdit, buf);        //这里需要获取寄存器数值,在此之前还需要使用sprintf函数将数值转换成文本
  105.     EDIT_SetFont(hEdit, &GUI_Font8x16x2x2);    //暂时使用这个字体,后期做成宏定义
  106.     EDIT_SetTextColor(hEdit, EDIT_CI_DISABLED, (GUI_COLOR)fontColor);
  107.     EDIT_SetBkColor(hEdit, EDIT_CI_DISABLED, (GUI_COLOR)bgkColor);
  108. }
复制代码

清屏显示小键盘

清屏显示小键盘

未清屏显示小键盘

未清屏显示小键盘


清屏操作是在函数:
  1. void CreateKeyboard(WindowElem window);
复制代码
内执行的。
我在仿真的时候发现显示edit小工具的函数:
  1. void DrawEdit(int cellID, int x, int y, int width, int height, int font, int fontColor, int fontSize, int bgkColor, int numberType, int M_numFormat, int RegType, int RegID, int keyboard);
复制代码
已经进入,并且传入的参数均是有值的。
现在是真的不知道究竟是怎么回事导致edit无法在界面m显示,求好汉相告...感激不尽!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2017-7-24 12:49:54 | 显示全部楼层
你这个程序的逻辑关系弄的稍有些复杂,有没有简单点的测试程序,仅需能够表达你的功能的程序即可。我在模拟器上给你测试下。

另外清屏操作
//GUI_SetBkColor(window.bgkColor); //2.设置清屏的背景色
//GUI_Clear();  

使用窗口的时候不要这么清除,全部有窗口的回调函数来实现。比如你桌面窗口上面创建了一个窗口,你删掉这个窗口后,无需自己手动调用这两个函数去清除,仅需其放在桌面窗口的回调函数里面即可,窗口管理器会去自动处理。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-7-24 13:56:32 | 显示全部楼层

回 eric2013 的帖子

eric2013:你这个程序的逻辑关系弄的稍有些复杂,有没有简单点的测试程序,仅需能够表达你的功能的程序即可。我在模拟器上给你测试下。

另外清屏操作
//GUI_SetBkColor(window.bgkColor); //2.设置清屏的背景色
//GUI_Clear();  
....... (2017-07-24 12:49) 
谢谢硬汉哥的回复..
实际上现在做的这个事其流程大致是:上位机生成一个文件->下位机读取、解析该文件->下位机生成界面上的各种元件,因此整个过程中大量使用了链表来存储、传递数据..由于创建窗口的方式不是使用资源表的形式,因此并没有使用emwin统一的资源表加上回调函数的形式,只是使用emwin的底层。实际上对于使用资源表的方式我个人是喜闻乐见的,毕竟很方便撒..
测试程序我这边其实并没有这个...所以还在跟学长商量怎么搞这个鬼
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-7-24 14:24:48 | 显示全部楼层

回 eric2013 的帖子

eric2013:你这个程序的逻辑关系弄的稍有些复杂,有没有简单点的测试程序,仅需能够表达你的功能的程序即可。我在模拟器上给你测试下。

另外清屏操作
//GUI_SetBkColor(window.bgkColor); //2.设置清屏的背景色
//GUI_Clear();  
....... (2017-07-24 12:49) 
已经解决..多谢硬汉哥的提醒,‘窗口’两字惊醒梦中人..解决途径我写在下面了,再次感谢![s:138][s:138][s:138]
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-7-24 14:25:11 | 显示全部楼层
成功做出来了。
创建edit小工具的时候传入的一个全局变量给错了。就是这个函数:
  1. EDIT_CreateEx(x, y, width, height, LastHwin, WM_CF_SHOW, 0, cellID, 15);
复制代码
其解决过程为:在调试的时候强制更改生成文件中小键盘窗口的起始x、y坐标值。那么小键盘的位置理应发生改变。
随后发现在删除窗口m的情况下,生成的小键盘窗口起始位置确实发生变化,同时edit、字符、图片的位置也随着窗口的改变而改变。
然而在不删除界面m的情况下,生成的小键盘窗口起始位置还是发生变化,字符、图片的位置也随着窗口的改变而改变,但是这时候edit小工具的位置却不变。
所以由此考虑到edit相对于屏幕的相对位置,在界面m上受到界面m的影响,而这个影响的唯一一个参数值只能是‘LastHwin’。
我在编写函数:
  1. void CreateKeyboard(WindowElem window);
复制代码
的时候曾提前写过注释:
  1. /*
  2.     **    此函数说明:
  3.         1.此函数不需要保存LastHwin参数,也不需要删除上一个窗口
  4.         2.需要保存的是keyboardID,在退出小键盘编辑状态的时候删除这个窗口,并退回之前的窗口
  5.     */
复制代码
所以,实际上在编写之初是考虑到这部分问题了的,但在编写另一部分代码来显示元件的时候可能有点晕了,还是怎么滴..总之,确实是没按要求来...
万幸的是,还好晕了是晕了但还没傻掉..
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2017-7-24 14:32:58 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:已经解决..多谢硬汉哥的提醒,‘窗口’两字惊醒梦中人..解决途径我写在下面了,再次感谢![s:138][s:138][s:138] (2017-07-24 14:24) 
[s:130]
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
发表于 2020-12-21 17:30:27 | 显示全部楼层
笔记本的自嘲 发表于 2017-7-24 14:25
成功做出来了。
创建edit小工具的时候传入的一个全局变量给错了。就是这个函数:
其解决过程为:在调试的时 ...

老哥,键盘上的EDIT控件怎么获取点击的EDIT框里的值并且修改,相当于全选编辑框里的数值,要不然不知道输入了什么
回复

使用道具 举报

8

主题

53

回帖

77

积分

初级会员

积分
77
发表于 2021-1-6 20:21:21 | 显示全部楼层
楼上
  请看我在:" 求助键盘上的EDIT控件怎么获取点击的EDIT框里的值并且修改 " 帖子内的回复,10#楼
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 06:17 , Processed in 0.264992 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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