硬汉嵌入式论坛

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

[emWin] 请问为什么我的父窗口回调函数不能自动进入

[复制链接]

6

主题

25

回帖

43

积分

新手上路

积分
43
发表于 2019-7-10 21:38:56 | 显示全部楼层 |阅读模式
本帖最后由 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);               
        }






回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-10 22:57:46 | 显示全部楼层
本帖最后由 mikekod 于 2019-7-10 23:00 编辑

1.png 2.png
本来是想让子窗口的数字更新,父窗口重绘相应的无效区域的,现在不触发父窗口回调函数,该区域直接被清空了
回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2019-7-11 08:42:57 | 显示全部楼层
发个完整的模拟器测试代码。
代码不规范,亲人两行泪!
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-11 09:18:30 | 显示全部楼层
missfox 发表于 2019-7-11 08:42
发个完整的模拟器测试代码。

刚刚学起来移植到模拟器。。。。。。。之前都是直接在芯片上跑..........................

WM_Demo.c

2.96 MB, 下载次数: 2

模拟器代码

回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-11 09:37:06 | 显示全部楼层
missfox 发表于 2019-7-11 08:42
发个完整的模拟器测试代码。

刚刚尝试了WM_SetTransState(hGear1,WM_CF_CONST_OUTLINE | WM_CF_HASTRANS);也还是没有效果
回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2019-7-11 11:42:07 | 显示全部楼层
mikekod 发表于 2019-7-11 09:37
刚刚尝试了WM_SetTransState(hGear1,WM_CF_CONST_OUTLINE | WM_CF_HASTRANS);也还是没有效果

好的,老铁,我测试下看看
代码不规范,亲人两行泪!
回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2019-7-11 12:00:56 | 显示全部楼层
测试了下,没发现什么问题,你这个数值更新,创建两个TEXT文本控件就够用,完全不需要两个子窗口,太繁琐了
代码不规范,亲人两行泪!
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-11 13:04:24 | 显示全部楼层
missfox 发表于 2019-7-11 12:00
测试了下,没发现什么问题,你这个数值更新,创建两个TEXT文本控件就够用,完全不需要两个子窗口,太繁琐了

我是想让上面的数字刷的时候,父窗口的相应区域重绘一下,不然会有带有一个背景色的数字,实际想达到这样的效果,而不是这样的效果
无标题.png
1.png
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-11 13:05:10 | 显示全部楼层
missfox 发表于 2019-7-11 12:00
测试了下,没发现什么问题,你这个数值更新,创建两个TEXT文本控件就够用,完全不需要两个子窗口,太繁琐了

文本控件可以做到透明效果吗????
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-7-11 13:26:18 | 显示全部楼层
missfox 发表于 2019-7-11 12:00
测试了下,没发现什么问题,你这个数值更新,创建两个TEXT文本控件就够用,完全不需要两个子窗口,太繁琐了

文本区域不是始终不变的,后期还要在表盘内做GIF动画滚动切换,所有做的是窗口
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 03:07 , Processed in 0.494141 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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