|
本帖最后由 mikekod 于 2019-7-10 22:55 编辑
我在桌面下新建了一个父窗口(父窗口存放的是一张彩色背景图),在父窗口下面新建了2个子窗口,用来更新数值。
在while循环里一直手动对子窗口无效化操作,触发子窗口回调函数,屏幕上数值一直在正常累加显示,但是父窗口的回调函数没有被触发,被子窗口遮掉的区域没有重绘,请问怎么样才能自动触发父窗口的回调函数(仿真的时候父窗口回调函数打了断点,也没有进入过函数)。



代码如下:
//父窗口回调函数
static void _cbWindow1(WM_MESSAGE *pMsg)
{
switch(pMsg->MsgId)
{
case WM_PAINT:
GUI_SetBkColor(0x160104);
GUI_SetColor(GUI_WHITE);
GUI_Clear();
GUI_SetTextMode(GUI_TM_TRANS); //透明显示
GUI_DrawBitmap(&bmbk,0,0); //绘制背景图标
break;
default:
WM_DefaultProc(pMsg);
}
}
void Win1_Init(void) //父窗口初始化
{
hWnd1 = WM_CreateWindow(0,0,800,480,WM_CF_SHOW,_cbWindow1,0);
WM_Invalidate(WM_HBKWIN); //父窗口无效
GUI_Delay(100);
}
static void _cbGear1(WM_MESSAGE* pMsg) { //子窗口2回调函数
GUI_RECT Rect;
switch (pMsg->MsgId) {
case WM_PAINT:
WM_GetInsideRect(&Rect);
GUI_SetBkColor(0x160104);
GUI_SetColor(0x525153); //选择画笔颜色
GUI_SetFont(GUI_FONT_D64); //选择字体 D64
GUI_ClearRectEx(&Rect);
Gear=Speed_Num/40;
GUI_DispDecAt(Gear,2,0,1); //显示数值Gear
default:
WM_DefaultProc(pMsg); //要处理WM_GetInsideRect发过来的消息(检索内部矩形的大小)
}
}
static void _cbSpeed1(WM_MESSAGE* pMsg) { //子窗口1回调函数
GUI_RECT Rect;
switch (pMsg->MsgId) {
case WM_PAINT:
WM_GetInsideRect(&Rect);
GUI_SetBkColor(0x160104);
GUI_SetFont(GUI_FONT_D80); //选择字体 D80
GUI_SetColor(GUI_WHITE); //选择画笔颜色
GUI_ClearRectEx(&Rect);
if(Speed_Num>=100)
{
GUI_DispDecAt(Speed_Num,0,0,3); //显示数值Speed_num
}
else if(Speed_Num>=10)
{
GUI_DispDecAt(Speed_Num,0+30,0,2); //显示数值Speed_num
}
else
{
GUI_DispDecAt(Speed_Num,0+60,0,1); //显示数值Speed_num
}
break;
default:
WM_DefaultProc(pMsg); //要处理WM_GetInsideRect发过来的消息(检索内部矩形的大小)
}
}
void Data_Init(void) //子窗口初始化
{
hSpeed1=WM_CreateWindowAsChild(SPEED_X,SPEED_Y,SPEED_SIZE_X,SPEED_SIZE_Y,hWnd1,WM_CF_SHOW,_cbSpeed1,0);//在父窗口hWnd1下新建子窗口1,回调函数_cbSpeed1
hGear1=WM_CreateWindowAsChild(GEAR_X,GEAR_Y,GEAR_SIZE_X,GEAR_SIZE_Y,hWnd1,WM_CF_SHOW,_cbGear1,0);//在父窗口hWnd1下新建子窗口2,回调函数_cbGear1
WM_Invalidate(hWnd1); //父窗口无效
GUI_Exec();
}
////////////////////////////////////////////////////////////////////////////////////////
while(1)// main主循环 不断子窗口无效化
{
if(Speed_Num++>198)Speed_Num=0;
if(Km++>99998)Km=0;
WM_InvalidateWindow(hSpeed1); //hSpeed1窗口无效
WM_InvalidateWindow(hGear1); //hGear1窗口无效
GUI_Delay(50);
}
|
|