硬汉嵌入式论坛

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

[emWin] EDIT控件游标闪烁,但其他String无法更新

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2020-2-25 14:17:42 | 显示全部楼层 |阅读模式
在窗口初始化中设置了EDIT的游标闪烁使能

EDIT_EnableBlink(hItem, 500, 1);

并且在任务中
while(1) {
                GUI_Delay(1000);
                board_info_disp();
  }

刷新显示一行信息

其中board_info_disp函数主要用了以下:

        GUI_SetColor(GUI_WHITE);
        GUI_SetFont(&GUI_Font24);
        GUI_DispStringAt(chbuf, 790, 738);


如果注释掉EDIT_EnableBlink,这个信息是正常显示的
但是一关闭注释,EDIT的游标显示正常,但board_info_disp()里刷新的内容就被白色矩形框覆盖,无法刷新了。

请教一下各位,是哪里的问题。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-25 14:33:49 | 显示全部楼层
方便的话,发个稍完整点的代码,我帮你在模拟器上面测试下,仅需emWin部分的代码即可。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-2-25 15:11:55 | 显示全部楼层
eric2013 发表于 2020-2-25 14:33
方便的话,发个稍完整点的代码,我帮你在模拟器上面测试下,仅需emWin部分的代码即可。

初始化就一个EDIT

hItem = WM_GetDialogItem(pMsg->hWin, ID_SERVER1NAME);
EDIT_EnableBlink(hItem, 500, 1);
EDIT_SetFont(hItem, GUI_FONT_24_ASCII);
EDIT_SetText(hItem, "");

void MainTask(void)
{
        char buf[50];
        GUI_Init();
        ......
while (1) {
                GUI_Delay(1000);
                time_t now = time(NULL);
                struct tm *time;
                time = localtime(&now);               
                sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d", time->tm_year+1900,time->tm_mon+1,time->tm_mday,time->tm_hour,time->tm_min,time->tm_sec);
                GUI_DispStringAt(buf, 790, 738);
        }
}
这样就能出现问题

把EnableBlink关掉则正常
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-2-25 15:23:15 | 显示全部楼层
完整代码:

#define ID_WINDOW_0  (GUI_ID_USER + 0x00)
#define ID_EDIT_0         (GUI_ID_USER + 0x01)



static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
        { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 170, 1024, 528, 0, 0x0, 0 },       
        { EDIT_CreateIndirect, "EDIT", ID_EDIT_0, 10, 20, 100, 40, 0, 0x0, 0 },

};

static void _cbDialog(WM_MESSAGE * pMsg) {
        WM_HWIN hItem;
        int     NCode;
        int     Id;

        switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:
                hItem = pMsg->hWin;
                WINDOW_SetBkColor(hItem, GUI_MAKE_COLOR(0x00000000));               
               
                hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
                EDIT_SetText(hItem, "");
                //EDIT_EnableBlink(hItem, 500, 1);               
                break;
        case WM_NOTIFY_PARENT:
                Id = WM_GetId(pMsg->hWinSrc);
                NCode = pMsg->Data.v;
                switch (Id) {
                case ID_EDIT_0:
                        switch (NCode) {
                        case WM_NOTIFICATION_CLICKED:
                                hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
                                break;
                        case WM_NOTIFICATION_RELEASED:                                                               
                                break;
                        case WM_NOTIFICATION_SEL_CHANGED:                                                               
                                break;
                               
                        }
                        break;                               
                }
                break;               
        default:
                WM_DefaultProc(pMsg);
                break;
        }
}

WM_HWIN CreateMainWindow(void);
WM_HWIN CreateMainWindow(void) {
        WM_HWIN hWin;
        hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);       
        return hWin;
}

void MainTask(void) {
        char buf[50];
        GUI_Init();       
        if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
                GUI_ErrorOut("Not enough memory available.");
                return;
        }
        //WM_EnableMemdev(WM_HBKWIN);
        WM_SetCreateFlags(WM_CF_MEMDEV);       
        GUI_UC_SetEncodeUTF8();

        WM_HWIN hMainWin;
        hMainWin = CreateMainWindow();
        WM_EnableMemdev(hMainWin);

        while (1) {
                GUI_Delay(1000);
                time_t now = time(NULL);
                struct tm *time;
                time = localtime(&now);               
                sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d", time->tm_year+1900,time->tm_mon+1,time->tm_mday,time->tm_hour,time->tm_min,time->tm_sec);
                GUI_DispStringAt(buf, 790, 738);
        }
}
//EDIT_EnableBlink(hItem, 500, 1);                这个打开或者关闭能看出来不一样,底部时间会反色?我也在查原因。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-2-25 15:50:53 | 显示全部楼层
Update:

使用WM_TIMER定时器,也是一样的问题。

完整代码:

  1. #include "DIALOG.h"
  2. #include <time.h>


  3. #define ID_WINDOW_0  (GUI_ID_USER + 0x00)
  4. #define ID_EDIT_0         (GUI_ID_USER + 0x01)



  5. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  6.         { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 170, 1024, 528, 0, 0x0, 0 },       
  7.         { EDIT_CreateIndirect, "EDIT", ID_EDIT_0, 10, 20, 100, 40, 0, 0x0, 0 },

  8. };

  9. static void _cbDialog(WM_MESSAGE * pMsg) {
  10.         WM_HWIN hItem;
  11.         int     NCode;
  12.         int     Id;
  13.         char   buf[50];

  14.         switch (pMsg->MsgId) {
  15.         case WM_TIMER:
  16.         {
  17.                 time_t now = time(NULL);
  18.                 struct tm *time;
  19.                 time = localtime(&now);
  20.                 sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d", time->tm_year + 1900, time->tm_mon + 1, time->tm_mday, time->tm_hour, time->tm_min, time->tm_sec);
  21.                 GUI_SetColor(GUI_RED);
  22.                 GUI_DispStringAt(buf, 790, 738);
  23.         }
  24.         WM_RestartTimer(pMsg->Data.v, 1000);
  25.                 break;
  26.         case WM_INIT_DIALOG:
  27.                 hItem = pMsg->hWin;
  28.                 WINDOW_SetBkColor(hItem, GUI_MAKE_COLOR(0x00000000));               
  29.                
  30.                 hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
  31.                 EDIT_SetText(hItem, "");
  32.                 EDIT_EnableBlink(hItem, 500, 1);               
  33.                 break;
  34.         case WM_NOTIFY_PARENT:
  35.                 Id = WM_GetId(pMsg->hWinSrc);
  36.                 NCode = pMsg->Data.v;
  37.                 switch (Id) {
  38.                 case ID_EDIT_0:
  39.                         switch (NCode) {
  40.                         case WM_NOTIFICATION_CLICKED:
  41.                                 hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
  42.                                 break;
  43.                         case WM_NOTIFICATION_RELEASED:                                                               
  44.                                 break;
  45.                         case WM_NOTIFICATION_SEL_CHANGED:                                                               
  46.                                 break;
  47.                                
  48.                         }
  49.                         break;                               
  50.                 }
  51.                 break;               
  52.         default:
  53.                 WM_DefaultProc(pMsg);
  54.                 break;
  55.         }
  56. }

  57. WM_HWIN CreateMainWindow(void);
  58. WM_HWIN CreateMainWindow(void) {
  59.         WM_HWIN hWin;
  60.         hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);       
  61.         return hWin;
  62. }

  63. void MainTask(void) {
  64.         char buf[50];
  65.         GUI_Init();       
  66.         if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
  67.                 GUI_ErrorOut("Not enough memory available.");
  68.                 return;
  69.         }
  70.         //WM_EnableMemdev(WM_HBKWIN);
  71.         WM_SetCreateFlags(WM_CF_MEMDEV);       
  72.         GUI_UC_SetEncodeUTF8();

  73.         WM_HWIN hMainWin;
  74.         hMainWin = CreateMainWindow();
  75.         WM_EnableMemdev(hMainWin);
  76.         WM_SetCallback(WM_HBKWIN, _cbDialog);
  77.         WM_CreateTimer(WM_HBKWIN, 0, 1000, 0);

  78.         while (1) {
  79.                 GUI_Delay(1000);
  80.                
  81.         }
  82. }
复制代码
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-25 15:53:54 | 显示全部楼层
你的这些信息应该放到桌面窗口回调函数的WM_PAINT消息里面,不要直接往桌面窗口函数,这样就没问题了。

GUI_SetColor(GUI_WHITE);
        GUI_SetFont(&GUI_Font24);
        GUI_DispStringAt(chbuf, 790, 738);
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-2-25 16:02:23 | 显示全部楼层
eric2013 发表于 2020-2-25 15:53
你的这些信息应该放到桌面窗口回调函数的WM_PAINT消息里面,不要直接往桌面窗口函数,这样就没问题了。

...

那怎么实现1秒刷新一次呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-25 16:18:47 | 显示全部楼层
doublemark 发表于 2020-2-25 16:02
那怎么实现1秒刷新一次呢?

给桌面窗口创建个emWin定时器就好了。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-2-25 16:27:26 | 显示全部楼层
eric2013 发表于 2020-2-25 16:18
给桌面窗口创建个emWin定时器就好了。

看到了


  1.         case WM_TIMER:
  2.                 hItem = pMsg->hWin;
  3.                 WM_InvalidateWindow(hItem);
  4.                 WM_RestartTimer(pMsg->Data.v, 1000);
  5.                 break;
复制代码


这样到了时间就会进WM_PAINT,但是带来的效果是EDIT如果需要弹窗键盘输入字符时,响应会比不用这个方法慢很多。

折腾了半天还是算了,不EnableBlink了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-25 16:35:56 | 显示全部楼层

WM_InvalidateWindow(hItem);范围太大了

你应该做局部无效化。仅仅将你的日期更新文本区域更新下就好了。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2020-2-25 16:43:34 | 显示全部楼层
eric2013 发表于 2020-2-25 16:35
WM_InvalidateWindow(hItem);范围太大了

你应该做局部无效化。仅仅将你的日期更新文本区域更新下就好 ...

原来如此

感谢您。

WM_InvalidateRect()或者WM_InvalidateArea()应该都可以吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-25 16:48:36 | 显示全部楼层
doublemark 发表于 2020-2-25 16:43
原来如此

感谢您。

用WM_InvalidateRect,可以指定窗口的指定区域做无效化。
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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