硬汉嵌入式论坛

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

[emWin] 屏幕刷新時機

[复制链接]

34

主题

112

回帖

214

积分

高级会员

积分
214
发表于 2018-4-17 22:14:41 | 显示全部楼层 |阅读模式
各位前輩好:

  屏幕需要顯示數值 目前是利用  
  WM_SetCallback(Win_TI, &_cbThermalImage); /* Set window Callback  */
  hTimer=  WM_CreateTimer(Win_TI, 0, 1000, 0); //每秒   

進行 每秒的屏幕刷新,如果每一秒都整個屏幕刷新是很浪費且費工的(因為有時溫度其實都沒變)

由於溫度變化不大,甚至有時是恆溫

想請問各位前輩,我該要刷新屏幕時需要怎麼寫才好

目前我只知道 利用 WM_CreateTimer 來進行每秒的刷屏幕,但我想應該有更好的寫法


想請問前輩們  感謝
回复

使用道具 举报

13

主题

24

回帖

63

积分

初级会员

积分
63
发表于 2018-4-17 22:26:28 | 显示全部楼层
WM_SendMessageNoPara
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-4-18 09:27:34 | 显示全部楼层
楼主方便的话,直接贴代码,帮你修改。
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2018-4-18 11:23:50 | 显示全部楼层
/*********************************************************************
*
*       _cbBkWindow
*
**********************************************************************
*/
static void _cbBkWindow(WM_MESSAGE * pMsg) {
PARAM       Param;        /* PARAM類型變量 */
  uint8_t i;
int     NCode;
int     Id;
WM_HWIN  hDateTime;
  switch (pMsg->MsgId) {
  case WM_PAINT:
   /* 第1步:繪製背景與背景文字 *******************************************************************************************/
              paint();  

   /* 第2步:繪製 Temperaturer 相關*************************************************************************/

               GUI_SetColor(GUI_WHITE);
         for(i=0;i<TEMPBar;i++)
         {
          Param.Angle= (Data.WirelessTemp<=1) ? 210 : 210-Data.WirelessTemp; //  Param.Angle= 210-rand()%240;
          if ( i <3 ){
            Param.CenterPoint.x= LCD_GetXSize() /6*i  + LCD_GetXSize()/6/2 - 10*i;
            Param.CenterPoint.y= 30+(LCD_GetYSize()-60) /3;
          }
          else{         
            Param.CenterPoint.x= LCD_GetXSize() /6*(i-3)  + LCD_GetXSize()/6/2 - 10*(i-3);
            Param.CenterPoint.y= 40+(LCD_GetYSize()-60) /4*3;      
          }         
          Draw_Temperature(&aram,i,temp_select(Data.WirelessTemp,i));
         }   
      
   break;
    case WM_TIMER:   
         WM_RestartTimer(pMsg->Data.v,1000);  //重新匯入1秒更新
         WM_InvalidateWindow(hWin);           //刪除舊窗口
  break;
   default:
    WM_DefaultProc(pMsg);
                     }
}

void MainTask(void) {
/* 第1步:顯示滑鼠,設定小工具皮膚 *************************************************************************/
  GUI_CURSOR_Show();
SetDefaultSkin();
/* 第2步:刷新畫面 *****************************************************************************************/
GUI_SetBkColor(GUI_BLACK);
GUI_Clear();  
/* 第3步:SetCallback *************************************************************************************/
  WM_SetCallback(WM_HBKWIN, &_cbBkWindow); /* Set window Callback  */
  WM_CreateTimer(WM_HBKWIN, 0, 1000, 0); //每一秒刷新
}

目前是利用 WM_CreateTimer 去每秒刪除舊窗口 WM_InvalidateWindow(hWin)
而執行 _cbBkWindow 的 WM_PAINT ,造成 屏幕的每秒刷新


_cbBkWindow 的第2步 就是利用感測器的溫度值 Data.WirelessTemp 來畫溫度圓餅圖

我在想是否我可以判別 Data.WirelessTemp 的值如果有改變我再去 觸發  WM_PAINT (但要怎麼觸發? 我只知道 刪除舊窗口..)


我知道有個辦法就是把螢幕切成好幾個視窗
例如: 溫度圓餅圖 用一個小視窗 去每秒刪除舊窗口 ; ( 不一定要每秒都刷新,而是溫度值改變再刷新)
         熱影像       用一個小視窗 去每秒刪除舊窗口 ; ( 一定要每秒都刷新                                      )
         系統時間    用一個小視窗 去每秒刪除舊窗口 ; ( 一定要每秒都刷新                                      )
這樣會不會更浪費效率呀?


附上: 目前屏幕主畫面


目前屏幕主畫面

目前屏幕主畫面



會這樣問是因為每秒刷新整個屏幕實在很費效率,目前還要顯示熱影像攝像頭跟每秒儲存資訊到SD卡還有將資料透過網路傳輸到監控電腦,如果使用者按下分析鈕還要畫曲線圖,在無系統(裸機)的情況下
好像忙不過來,沒辦法多工處理...(不知道是不是我寫的太爛 )


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-4-18 11:44:34 | 显示全部楼层
fcdxsdxsza 发表于 2018-4-18 11:23
/*********************************************************************
*
*       _cbBkWindow

使用函数做局部刷新WM_InvalidateRect(),你要更新那部分,仅更新那部分,

不要使用函数WM_InvalidateWindow(hWin); 做全局更新
你测试下效果看看。

回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2018-4-18 12:30:03 | 显示全部楼层
你好:

WM_InvalidateRect() , 我了解
但如果兩個地方以上 使用 WM_InvalidateRect() 的話 ,我沒記錯的話 系統是會整個畫面刷新的

有沒有方法能夠 我告訴它要刷新再刷新 (例如: 溫度值改變了,再刷新,平常只刷新系統時間的部分就好) 或者有什麼更好的方法嗎?

感謝!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-4-18 12:36:59 | 显示全部楼层
fcdxsdxsza 发表于 2018-4-18 12:30
你好:

WM_InvalidateRect() , 我了解

系统会裁剪的,不会都刷新的。

另外如果你是刷新下文本,使用TEXT文件控件就好了,直接在WM_TIMER消息里面处理的。这个仅刷新文本的区域。

其它刷新2D绘制的,就调用局部刷新。
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2018-4-18 13:24:21 | 显示全部楼层
感謝! 使用 TEXT文件控件 真的只在 WM_TIMER消息里面处理就好
我之前是用 GUI_DispStringHCenterAt( datatime ,( LCD_GetXSize()/2 )/2 ,20); 導致要刷新區域才行
-----------------------------------------------------------------------------------------------------------------------------
我想再問一下! 當 主畫面 以每秒在更新屏幕時,我如果開啟新的視窗
而新的視窗是會蓋住 主畫面的 ,這時候我的主畫面應該是不用更新吧?

但事實上,新的視窗就算在蓋住主畫面時,其實主畫面每秒還是在更新屏幕對吧? 這樣就浪費效率了,因為更新我也看不到且也不需要

想詢問前輩,該如何避免這事情發生呢?

謝謝
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-4-18 14:53:50 | 显示全部楼层
fcdxsdxsza 发表于 2018-4-18 13:24
感謝! 使用 TEXT文件控件 真的只在 WM_TIMER消息里面处理就好
我之前是用 GUI_DispStringHCenterAt( datat ...

这个用户不用管,emWin会自己做裁剪。
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2018-4-18 15:26:27 | 显示全部楼层
謝謝回復 ! !

不過 我想到 既然是用 WM_CreateTimer 來觸發 每次的主畫面區域性刷新

當開啟新視窗時,把 WM_CreateTimer 的 handle 給刪除 ( 表示這時主畫面不再刷新 )

而當關掉新視窗時,再把 WM_CreateTimer 給創建一次 。
這樣回到主畫面時,又會繼續刷新了!

可以省下開新視窗期間 而造成主畫面之不必要的刷新
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-19 21:54 , Processed in 0.045885 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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