1、 使窗口无效后,会引起窗口重绘。
WM_InvalidateWindow (W1);//使得窗口无效
//①判断窗口句柄是否有效
//②判断窗口是否无效
//③判断当前窗口的顶级父窗体是否是桌面窗体。
//①②③都是就调入下面函数。
->WM_InvalidateRect(hWin, NULL);
//①各种判断
//②计算出窗口的区域
//③标志窗口无效
//④无效窗口加1
-->WM__Invalidate1Abs(hWin, &r);
2、 重绘过程
int GUI_Exec(void)
->int GUI_Exec1(void)
-->if (WM_Exec())
--->while (WM_Exec1())
---->_DrawNext();
------>if (WM__Paint(iWin, pWin))
//①计算出无效区域和判断顶层父窗体是否是桌面窗体。
//②判断是否使用存储设备
------->WM__PaintWinAndOverlays(&Info);
-------->_Paint1(hWin, pWin);//①剪切处理后调用回调函数重绘
3、测试代码
static WM_HWIN W1;
static GUI_PID_STATE State;
static WM_MESSAGE pMsg;
uint8_t num = 0;
uint8_t x,y;
GUI_COLOR Color=GUI_WHITE;
extern const GUI_FONT GUI_FontHZ16;
static void cbW1( WM_MESSAGE* pMsg)
{
switch(pMsg->MsgId)
{
case WM_PAINT:
GUI_SetBkColor(Color); //设置背景色
GUI_Clear();
GUI_SetColor(GUI_BLACK); //设置前景色
GUI_SetFont(&GUI_Font24_ASCII);
GUI_DispDecAt(num++,10,35,3);
return ;
default:
WM_DefaultProc(pMsg);
}
}
void ucgui_m_wm_call_back(void)
{
uint8_t x1=10,y1=10;
State.x=x1;
State.y=y1;
State.Pressed=1;
W1 = WM_CreateWindow(10, 10, 100, 100, WM_CF_SHOW, cbW1, 0);
while(1)
{
GUI_Exec();
WM_InvalidateWindow (W1);
GUI_OnlyDelay(1000);
}
}