hpdell 发表于 2024-1-6 14:19:34

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

本帖最后由 hpdell 于 2024-1-6 14:22 编辑



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


如上图中,

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_tend;
                        uint32_tbegin ;
                     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 区域, 如果不无效化 此区域,那么此处就无法显示出任何内容, 请问这个是怎么个情况呀???

   ... ....

}

eric2013 发表于 2024-1-6 14:33:32

在WM_PAINT里面做无效化,这个姿势不好

hpdell 发表于 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_tend;
                        uint32_tbegin ;

                        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 创建的 区域没有什么关闭把??

eric2013 发表于 2024-1-7 10:45:13

hpdell 发表于 2024-1-6 17:20
刚刚测试了一下, 把 WM_TIMER 这个定时器回调里面的

                case WM_TIMER:{


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

hpdell 发表于 2024-1-7 16:38:11

本帖最后由 hpdell 于 2024-1-7 16:47 编辑

eric2013 发表于 2024-1-7 10:45
你这样实现,你不用AppWizard,如何处理。

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

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

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

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

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


eric2013 发表于 2024-1-8 09:47:59

hpdell 发表于 2024-1-7 16:38
如果不使用 appWizard 的话, 按照传统的方法, 我上面的运行是没有问题的,

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

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

hpdell 发表于 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 框架 修改的蛮大的喔

eric2013 发表于 2024-1-9 09:09:54

hpdell 发表于 2024-1-8 17:24
不是的,

使用的 是


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

hpdell 发表于 2024-1-9 10:05:03

eric2013 发表于 2024-1-9 09:09
那还真有这个可能,不兼容。

感觉 appWizard 没有 guix 好用啊,而且还有很多功能 都没有完善 , 估计还需要再等个 3-5 年吧 ?!!
页: [1]
查看完整版本: 请教下使用appWizard 框架 定时区域无效化显示图片出现诡异的情况 ??