|
本帖最后由 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_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 区域, 如果不无效化 此区域,那么此处就无法显示出任何内容, 请问这个是怎么个情况呀 ???
... ....
}
|
|