硬汉嵌入式论坛

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

[emWin] emwin 部分清除问题-思路求解

[复制链接]

7

主题

31

回帖

7

积分

新手上路

积分
7
发表于 2017-7-4 16:15:50 | 显示全部楼层 |阅读模式
这样的,我只用了emwin的一些函数,裸机程序。
我把屏幕分为三个部分,top,mid,bottom,三部分独立的窗口  用WM_CreateWindowAsChild创建;
top和bottom 只是简单的显示,不需要大的变动,mid需要进行大规模的变动,top和bottom有动作的时候  通过WM_SendMessage  发送 WM_PAINT 带参数给mid的callback,
根据参数进行重回mid,但是我调用GUI_Clear的时候top和bottom窗口东西也会清除掉,要是用哪个函数才能值清除 mid窗口的内容?  我还在文档中找着,哪位知道的话帮忙告诉我一声。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-7-4 16:53:34 | 显示全部楼层
你的程序设计应该有问题。先简单创建两个窗口,互发消息看下。
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-4 16:55:06 | 显示全部楼层
用GUI_ClearRect可以清除部分窗口,那么有一个问题来了
第一次创建一个窗口的时候,在WM_PAINT下直接用  drawbitmap 坐标是相对于这个创建的  当再次绘制的时候相对的是整个屏幕,这个又怎么设置呢
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-4 17:04:49 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的程序设计应该有问题。先简单创建两个窗口,互发消息看下。
 (2017-07-04 16:53) 
消息能收到  这样可能会产生哪些不可预期的问题呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-7-4 17:09:29 | 显示全部楼层

回 wendell.sun 的帖子

wendell.sun:消息能收到  这样可能会产生哪些不可预期的问题呢
 (2017-07-04 17:04) 
在界面上面单独创建两个小窗口,都用桌面窗口做父窗口,这两个窗口不要有重叠,看看是否还有问题。

测试还有问题的话,你发下你的代码,我晚上有时间,我在模拟器上走一个看看。
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 10:33:38 | 显示全部楼层
TestforComm.zip (2 KB, 下载次数: 18)

这个是我的测试程序,是不是使用方法不对……

第一个窗口(W1)是  一个text  和 一个button
第二个窗口是(W2)是一个text

想实现  button 点击之后 给W2 发送 重绘(WM_PAINT)带有一个参数,根据参数 更改W2 中的Text内容

目前程序调试能够进入W2的回调函数,参数也是正确的,但是重绘中的GUI_Clear 会一并将W1窗口的东西清除,并且更改的内容也无法显示。不知道何解!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-7-5 10:46:59 | 显示全部楼层
测试了下,没问题啊,我仅仅是修改下两个窗口的背景是,起初是这个样子的,
QQ截图20170705104338.png

点击按钮后变成下面这样
QQ截图20170705104344.png
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 10:50:33 | 显示全部楼层
点击之后  W2 窗口应该是 3333
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 10:51:31 | 显示全部楼层

回 eric2013 的帖子

eric2013:测试了下,没问题啊,我仅仅是修改下两个窗口的背景是,起初是这个样子的,


点击按钮后变成下面这样
 (2017-07-05 10:46) 
点击之后怎么窗口都变大了
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 10:53:02 | 显示全部楼层

回 eric2013 的帖子

eric2013:测试了下,没问题啊,我仅仅是修改下两个窗口的背景是,起初是这个样子的,


点击按钮后变成下面这样
 (2017-07-05 10:46) 
我现在硬件也是800x480的屏幕   只用320x240
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 10:56:57 | 显示全部楼层

回 eric2013 的帖子

eric2013:测试了下,没问题啊,我仅仅是修改下两个窗口的背景是,起初是这个样子的,


点击按钮后变成下面这样
 (2017-07-05 10:46) 
会不会是GUI_Clear 是默认清除全屏   只能用GUI_ClearRect 清除部分
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-7-5 10:57:08 | 显示全部楼层
你给我发的程序有问题,创建的TEXT控件ID是ID_TEXT_1,与更新时用的ID,ID_TEXT_2不匹配,修改匹配后就没问题了,

发送前
1.png
发送后
2.png
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 11:07:25 | 显示全部楼层

回 eric2013 的帖子

eric2013:你给我发的程序有问题,创建的TEXT控件ID是ID_TEXT_1,与更新时用的ID,ID_TEXT_2不匹配,修改匹配后就没问题了,

发送前

发送后
....... (2017-07-05 10:57) 
我这边还是不行,难道是触摸的问题?我点击一下按钮  触发好几个按键click
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 11:07:58 | 显示全部楼层

回 eric2013 的帖子

eric2013:你给我发的程序有问题,创建的TEXT控件ID是ID_TEXT_1,与更新时用的ID,ID_TEXT_2不匹配,修改匹配后就没问题了,

发送前

发送后
....... (2017-07-05 10:57) 
用GUI_Clear  还是会把1111那个text清除掉
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 11:08:25 | 显示全部楼层

回 eric2013 的帖子

eric2013:你给我发的程序有问题,创建的TEXT控件ID是ID_TEXT_1,与更新时用的ID,ID_TEXT_2不匹配,修改匹配后就没问题了,

发送前

发送后
....... (2017-07-05 10:57) 
3333也是无法显示出来
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 11:13:06 | 显示全部楼层

回 eric2013 的帖子

eric2013:你给我发的程序有问题,创建的TEXT控件ID是ID_TEXT_1,与更新时用的ID,ID_TEXT_2不匹配,修改匹配后就没问题了,

发送前

发送后
....... (2017-07-05 10:57) 
点击两下按钮   你那边是不是正常呢?
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-5 12:16:41 | 显示全部楼层

回 eric2013 的帖子

eric2013:你给我发的程序有问题,创建的TEXT控件ID是ID_TEXT_1,与更新时用的ID,ID_TEXT_2不匹配,修改匹配后就没问题了,

发送前

发送后
....... (2017-07-05 10:57) 
这样的   创建两个窗口 W1 W2
先创建W1,再创建W2  这时候点击W1 按键之后  W2接到信息之后可以正常显示,这时候再次点击按键,W2 实际上已经响应,做出了动作,但是无法显示。
如果先创建W2   再创建W1  W1怎么操作,W2的内容都可以完整显示出来……
我猜测是窗口z轴的问题  具体解决办法还在找,刚开始研究这玩意  还需多多看看  你觉得呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-7-6 01:33:23 | 显示全部楼层

回 wendell.sun 的帖子

wendell.sun:

这样的   创建两个窗口 W1 W2
先创建W1,再创建W2  这时候点击W1 按键之后  W2接到信息之后可以正常显示,这时候再次点击按键,W2 实际上已经响应,做出了动作,但是无法显示。
如果先创建W2   再创建W1  W1怎么操作,W2的内容都可以完整显示出来……
我猜测是窗口z轴的问题  具体解决办法还在找,刚开始研究这玩意  还需多多看看  你觉得呢
.......
也没有问题的,我简单的做了个累加计数,点击一次按钮,做一次累加:
QQ截图20170706013010.png


可以直接在模拟器上面跑的代码:
  1. /*********************************************************************
  2. *                                                                    *
  3. *                SEGGER Microcontroller GmbH & Co. KG                *
  4. *        Solutions for real time microcontroller applications        *
  5. *                                                                    *
  6. **********************************************************************
  7. *                                                                    *
  8. * C-file generated by:                                               *
  9. *                                                                    *
  10. *        GUI_Builder for emWin version 5.32                          *
  11. *        Compiled Oct  8 2015, 11:59:02                              *
  12. *        (c) 2015 Segger Microcontroller GmbH & Co. KG               *
  13. *                                                                    *
  14. **********************************************************************
  15. *                                                                    *
  16. *        Internet: www.segger.com  Support: support@segger.com       *
  17. *                                                                    *
  18. **********************************************************************
  19. */
  20. // USER START (Optionally insert additional includes)
  21. // USER END
  22. #include "DIALOG.h"
  23. WM_HWIN _WinTop;
  24. WM_HWIN _WinBot;
  25. #define  ID_TEXT_1  (GUI_ID_USER + 0x01)
  26. #define  ID_TEXT_2  (GUI_ID_USER + 0x02)
  27. #define  ID_BUTTON_1 (GUI_ID_USER + 0x03)
  28. void _cbTopWindow(WM_MESSAGE *pMsg)
  29. {
  30.     WM_HWIN hItem;
  31.     int     NCode;
  32.     int     Id;
  33.     WM_MESSAGE msg;
  34.     switch (pMsg->MsgId)
  35.     {
  36.         case WM_NOTIFY_PARENT:
  37.             Id = WM_GetId(pMsg->hWinSrc);
  38.             NCode = pMsg->Data.v;
  39.             switch(Id)
  40.             {
  41.                 case ID_BUTTON_1:
  42.                     switch(NCode)
  43.                     {
  44.                         case WM_NOTIFICATION_CLICKED:
  45.                             break;
  46.                         case WM_NOTIFICATION_RELEASED:
  47.                             msg.MsgId = WM_PAINT;
  48.                             msg.Data.v = 1;
  49.                             WM_SendMessage(_WinBot,&msg);
  50.                             break;
  51.                         default:
  52.                             break;
  53.                     }
  54.                     break;
  55.             }
  56.             break;
  57.         /* 重绘消息*/
  58.         case WM_PAINT:
  59.             GUI_SetBkColor(GUI_BLUE);
  60.             GUI_Clear();
  61.             break;   
  62.             
  63.      default:
  64.         WM_DefaultProc(pMsg);
  65.         break;
  66.     }
  67. }
  68. void _cbBotWindow(WM_MESSAGE *pMsg)
  69. {
  70.     WM_HWIN hItem;
  71.     int     NCode;
  72.     int     Id;
  73.     static int count = 0;
  74.     char buf[20];
  75.     switch (pMsg->MsgId)
  76.     {
  77.         case WM_INIT_DIALOG:
  78.             break;
  79.         case WM_NOTIFY_PARENT:
  80.             break;
  81.         /* 重绘消息*/
  82.         case WM_PAINT:
  83.             GUI_SetBkColor(GUI_RED);
  84.             GUI_Clear();
  85.             if(pMsg->Data.v == 1)
  86.             {
  87.                 sprintf(buf, "count = %d", count++);
  88.                 TEXT_SetText(WM_GetDialogItem(pMsg->hWin,ID_TEXT_2),  buf);
  89.             }   
  90.         break;            
  91.      default:
  92.         WM_DefaultProc(pMsg);
  93.         break;
  94.     }
  95. }
  96. static void _cbButton(WM_MESSAGE *pMsg)
  97. {
  98.     GUI_RECT Rect;
  99.     WM_HWIN hWin;
  100.     hWin = pMsg->hWin;
  101.     switch(pMsg->MsgId)
  102.     {
  103.         case WM_PAINT:
  104.             WM_GetClientRect(&Rect);
  105.             if(BUTTON_IsPressed(hWin))
  106.             {
  107.                 GUI_SetColor(GUI_DARKGRAY);
  108.                 GUI_FillRoundedRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1, 5);
  109.                 GUI_SetBkColor(GUI_DARKGRAY);
  110.                 GUI_SetColor(GUI_WHITE);
  111.             }
  112.             else
  113.             {
  114.                 GUI_SetBkColor(GUI_TRANSPARENT);
  115.                 GUI_ClearRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1);
  116.                
  117.             }
  118.             GUI_SetFont(&GUI_Font16_ASCII);
  119.             GUI_DispStringInRect("test", &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER);
  120.             break;   
  121.             default:
  122.                 BUTTON_Callback(pMsg);
  123.             break;
  124.     }
  125. }
  126. void CreateTopWindow(void)
  127. {
  128.     WM_HWIN hItem;
  129.     _WinTop = WM_CreateWindowAsChild(0,0,320,30,WM_GetDesktopWindowEx(1),WM_CF_SHOW,_cbTopWindow,0);
  130.     hItem = TEXT_CreateEx(0,0,30,30,_WinTop, WM_CF_SHOW|WM_CF_MEMDEV, GUI_TA_LEFT|TEXT_CF_VCENTER, ID_TEXT_1, "1111");
  131.    
  132.     hItem=BUTTON_CreateEx(35,0,30,30,_WinTop,WM_CF_SHOW|WM_CF_MEMDEV,0,ID_BUTTON_1);
  133.     WM_SetCallback(hItem, _cbButton);   
  134.    
  135. }
  136. void CreateBotWindow(void)
  137. {
  138.     WM_HWIN hItem;
  139.     _WinBot = WM_CreateWindowAsChild(0,31,320,210,WM_GetDesktopWindowEx(1),WM_CF_SHOW,_cbBotWindow,0);
  140.     hItem = TEXT_CreateEx(0,50,100,30,_WinBot, WM_CF_SHOW|WM_CF_MEMDEV, GUI_TA_LEFT|TEXT_CF_VCENTER, ID_TEXT_2, "2222");
  141. }
  142. void TestWindow(void)
  143. {
  144.     CreateTopWindow();
  145.     CreateBotWindow();
  146. }
  147. // USER START (Optionally insert additional public code)
  148. // USER END
  149. /*************************** End of file ****************************/
  150. /*********************************************************************
  151. *
  152. *       MainTask
  153. */
  154. void MainTask(void)
  155. {
  156.      /* 初始化 */
  157.     GUI_Init();
  158.     /* 窗口自动使用存储设备 */
  159.     WM_SetCreateFlags(WM_CF_MEMDEV);
  160.     /* 创建对话框,使用GUIBulder5.32生成的对话框创建函数 */
  161.     TestWindow();
  162.     while(1)
  163.     {
  164.         GUI_Delay(50);
  165.     }
  166. }
复制代码
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-6 09:00:23 | 显示全部楼层
我也做了累加也是可以的,但是我给固定值就不行了! count固定值…………你试试
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-6 09:20:13 | 显示全部楼层

回 eric2013 的帖子

eric2013:也没有问题的,我简单的做了个累加计数,点击一次按钮,做一次累加:



....... (2017-07-06 01:33) 
这个demo我调试好了  你是对的
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-6 10:12:14 | 显示全部楼层

回 eric2013 的帖子

eric2013:也没有问题的,我简单的做了个累加计数,点击一次按钮,做一次累加:



....... (2017-07-06 01:33) 
WM_PAINT  会进入两次,第一次是正确的,随后自身也会再进入一次,这时候 v的值就变化了,把原来的数据覆盖了,这个是单步调试出来的 ,是不是用该去查查调度机制


GUI_Clear  仍然清除的是整个屏幕的数据,这个是不是和底层驱动有关系  我还在查
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-6 10:22:01 | 显示全部楼层

回 eric2013 的帖子

eric2013:也没有问题的,我简单的做了个累加计数,点击一次按钮,做一次累加:



....... (2017-07-06 01:33) 
是的很有意思的    count是固定值的时候  是显示不出来的  ……
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-6 11:23:43 | 显示全部楼层

回 eric2013 的帖子

capture1.png
eric2013:

也没有问题的,我简单的做了个累加计数,点击一次按钮,做一次累加:



.......
现在整理一下,感觉这个问题很有意思
capture.png

程序如果是这样的,那么会一直显示0000  说明在更改完count显示之后又一次进入  WM_PAINT,并且不是我们发送的命令,单步调试之后也是这个结果;



改成这样的话,能够显示count 变化,也就是正常显示,单步调试也是在我们发送 WM_PAINT命令之后,又进入一次,只是没有操作仍然正常显示

capture2.png

如果count改成固定值,那么第一次显示之后再次发送WM_PAINT命令,无法显示出来。
我觉得应该是库函数做了优化,如果text内容没有变化的时候做了某些处理,在出现变化的时候在重绘的时候也做了特殊的处理,不知道是不是这样!!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-7-6 11:32:54 | 显示全部楼层

回 wendell.sun 的帖子

wendell.sun:

现在整理一下,感觉这个问题很有意思


....... (2017-07-06 11:23) 
你的这个问题就讨论这么多吧,你自己可往下再研究下[s:142]
回复

使用道具 举报

7

主题

31

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-7-6 13:53:07 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的这个问题就讨论这么多吧,你自己可往下再研究下[s:142] (2017-07-06 11:32) 
最后问题出在 TEXT_SetText   这个返回值是1  而非0   只有成功的第一次是0    显示的内容和原来的内容相同的话就是1  然后就无法显示了  这个是库函数 哪里可以查查怎么改进……
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-19 16:55 , Processed in 0.063779 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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