硬汉嵌入式论坛

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

[AppWizard] 请教下使用appWizard 框架 定时区域无效化显示图片出现诡异的情况 ??

[复制链接]

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2024-1-6 14:19:34 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2024-1-6 14:22 编辑



请教下使用appWizard 框架 定时区域无效化显示图片出现诡异的情况 ??
007.jpg

如上图中,

01. A 区域 已经使用 appWizard 框架 增加了相关的控件
02. B 区域 没有增加任何控件
03. 无效化区域的 先后顺序不能够搞反,否则 B 区域不会有任何显示 啊


#define ID_TIMER_00   0

// 刷新 页面剩余 没有使用控件的所有位置空间  Free space refresh
#define   GX_ICON_Y_POS            (62)
#define   GX_FreeSpaceRefresh_W    (1024-385-10)    // 剩余空间宽度 = 1024 - (385(绘制日历表的宽度) + (10 间隔))
#define   GX_FreeSpaceRefresh_H    (600-GX_ICON_Y_POS-2)    // 剩余空间高度  62 = 显示年月日高度 + 间隔高度

#define   GX_FreeSpaceRefresh_LEFT      (2)
#define   GX_FreeSpaceRefresh_RIGHT     (GX_FreeSpaceRefresh_LEFT+GX_FreeSpaceRefresh_W)
#define   GX_FreeSpaceRefresh_TOP       (GX_ICON_Y_POS)
#define   GX_FreeSpaceRefresh_BOTTON    (GX_FreeSpaceRefresh_TOP+GX_FreeSpaceRefresh_H )

#define   GX_Refresh_W    (385)
#define   GX_Refresh_H    (426)
#define   GX_Refresh_LEFT      (637)
#define   GX_Refresh_RIGHT     (GX_Refresh_LEFT+GX_Refresh_W)
#define   GX_Refresh_TOP       (172)
#define   GX_Refresh_BOTTON    (GX_Refresh_TOP+GX_Refresh_H )




static const GUI_RECT __FreeSpaceRefreshRect ={GX_FreeSpaceRefresh_LEFT,
                                                   GX_FreeSpaceRefresh_TOP,
                                                   GX_FreeSpaceRefresh_RIGHT,
                                                   GX_FreeSpaceRefresh_BOTTON};   //刷新无效化

                                    
static const GUI_RECT __RefreshRect ={GX_Refresh_LEFT,
                                       GX_Refresh_TOP,
                                        GX_Refresh_RIGHT,
                                       GX_Refresh_BOTTON};


void cbID_SCREEN_Main(WM_MESSAGE * pMsg)
{

        WM_HWIN hItem;  //, hWinOld;
        WM_HWIN hWin = pMsg->hWin;
        int     NCode;
        int     Id;

   switch (pMsg->MsgId) {
      
                case WM_INIT_DIALOG : {  // 初始化
               
                       /* 创建定时器 */
                      WM_CreateTimer(pMsg->hWin,
                                             ID_TIMER_00, /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                                            1000,
                                            0);   /* 留待将来使用,应为0 */
                                      __log("cbID_SCREEN_Main --> WM_INIT_DIALOG ...\r\n");
                        break;
                }
      
       case WM_CREATE:  {
        }   break;

                case WM_TIMER:  {
                        WM_RestartTimer(pMsg->Data.v, 200);  // 触发 WM_PAINT 更新
                        /* 执行窗口无效化,会触发执行WM_PAINT消息 */
                        WM_InvalidateRect(pMsg->hWin, & __RefreshRect );   // 必须先无效化 有控件的区域  ... ??
                       main_clock_update_show();    // 刷新控件 A区域 一次 20ms
               break;               
                }

                case WM_PAINT: {
                        uint32_t  end;
                        uint32_t  begin ;
                       begin = HAL_GetTick();
                       ShowDrawDisp( pMsg) ;   // 绘制需要 无效化 第2 次 , 这个函数里面还有一次 ?????
                        end = HAL_GetElapsedTime(begin);
                        __log("Clock_DialDrawDisp timer: %d\r\n", end);
                        break;
                }

               
                case WM_NOTIFY_PARENT:  {
                                
                        break;
                }
               
                default : break;
        
        }

}

// 在这个函数里面还需要在进行无效化一次
void ShowDrawDisp(WM_MESSAGE * pMsg)
{
    WM_InvalidateRect(pMsg->hWin, &__FreeSpaceRefreshRect);   // 指定区域无效化, 主要是无效化 B 区域, 如果不无效化 此区域,那么此处就无法显示出任何内容, 请问这个是怎么个情况呀  ???

   ... ....

}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-1-6 14:33:32 | 显示全部楼层
在WM_PAINT里面做无效化,这个姿势不好
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
 楼主| 发表于 2024-1-6 17:20:34 | 显示全部楼层
本帖最后由 hpdell 于 2024-1-6 17:31 编辑
eric2013 发表于 2024-1-6 14:33
在WM_PAINT里面做无效化,这个姿势不好

刚刚测试了一下, 把 WM_TIMER 这个定时器回调里面的

                case WM_TIMER:  {
                        WM_RestartTimer(pMsg->Data.v, 200);
                        /* 执行窗口无效化,会触发执行WM_PAINT消息 */
                        WM_InvalidateRect(pMsg->hWin, & __RefreshRect );   // 这个屏蔽后, b 区没有任何显示出现  ??
                                                                                                      // 貌似这个有控件的 a 区域必须得进行刷新一次才可以呀  ...   ??  
                       main_clock_update_show();    // 刷新控件 A区域 一次 20ms
               break;               
                }

                01. 改成这样, 如果把 WM_TIMER 这个里面的 __RefreshRect  这个区域屏蔽, 那么再刷新 __FreeSpaceRefreshRect 这个区域 也是没有任何显示的, 感觉有些想不通啊 ??
                02. 如果直接把 __FreeSpaceRefreshRect 放在 WM_TIMER  这个里面刷新,那么 b 区也是没有任何显示的,
                03. 我目前使用的是 AppWizard V138_632d   这个版本的
                case WM_PAINT: {
                        uint32_t  end;
                        uint32_t  begin ;

                        WM_InvalidateRect(pMsg->hWin, &__FreeSpaceRefreshRect);   // 指定区域无效化

                       begin = HAL_GetTick();
                       ShowDrawDisp( pMsg) ;
                        end = HAL_GetElapsedTime(begin);
                        __log("Clock_DialDrawDisp timer: %d\r\n", end);
                        break;
                }

在 界面屏幕里面, A 区使用了 window 创建了一片区域
                          B 区使用了 window 创建了一片区域


刷新 应该跟 使用了 window 创建的 区域没有什么关闭把  ??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-1-7 10:45:13 | 显示全部楼层
hpdell 发表于 2024-1-6 17:20
刚刚测试了一下, 把 WM_TIMER 这个定时器回调里面的

                case WM_TIMER:  {

你这样实现,你不用AppWizard,如何处理。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
 楼主| 发表于 2024-1-7 16:38:11 | 显示全部楼层
本帖最后由 hpdell 于 2024-1-7 16:47 编辑
eric2013 发表于 2024-1-7 10:45
你这样实现,你不用AppWizard,如何处理。


如果不使用 appWizard 的话, 按照传统的方法, 我上面的运行是没有问题的,

刚刚又捣鼓了一下, 确定是 因为 界面里面创建屏幕时 多了一个 box 造成的,

我把 创建屏幕步骤改成如下就可以了:
screen -> window 这个就可以了, 现在改成这样使用上面的方法也是可以的哟, 貌似就是隔了一座 box

之前创建屏幕的步骤是:
screen - > box

貌似现在还发现一个情况,就是在 appWizard 框架下,不能够调用 GUI_DispStringAt 这个函数来显示 自制的中文了(只要不使用 appWizard , 调用 GUI_DispStringAt  就可以显示中文),


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-1-8 09:47:59 | 显示全部楼层
hpdell 发表于 2024-1-7 16:38
如果不使用 appWizard 的话, 按照传统的方法, 我上面的运行是没有问题的,

刚刚又捣鼓了一下, 确定 ...

自制的汉字是FontCvt.exe生成的吗
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
 楼主| 发表于 2024-1-8 17:24:33 | 显示全部楼层
本帖最后由 hpdell 于 2024-1-8 17:26 编辑
eric2013 发表于 2024-1-8 09:47
自制的汉字是FontCvt.exe生成的吗

不是的,

使用的 是
01. TS4.exe
02. 字模III

上面 2 个其中一个生成的字库


看来 appWizard 内部还是做了蛮多的限制 或者是 appWizard 框架 修改的蛮大的喔
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-1-9 09:09:54 | 显示全部楼层
hpdell 发表于 2024-1-8 17:24
不是的,

使用的 是

那还真有这个可能,不兼容。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
 楼主| 发表于 2024-1-9 10:05:03 | 显示全部楼层
eric2013 发表于 2024-1-9 09:09
那还真有这个可能,不兼容。

感觉 appWizard 没有 guix 好用啊,而且还有很多功能 都没有完善 , 估计还需要再等个 3-5 年吧 ?!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 02:35 , Processed in 0.189832 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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