OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3040|回复: 1

两个窗体部分重合,下层的窗体动态显示内容(比如走动的波形),上层的窗体在删除以后,为什么窗体的画面没有消失?

[复制链接]

4

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-1-4
在线时间
14 小时
发表于 2019-3-27 19:34:08 | 显示全部楼层 |阅读模式
10金钱
    两个窗体部分重合,下层的窗体动态显示内容(比如走动的线条),希望达到的功能是上层窗体关闭后,下层的窗体的动态内容依然显示。    目前的状况是,上层的窗体使用WM_DeleteWindow函数删除以后,并没有完全消失,在两个窗体重叠部分,留下残影,没有重叠的部分确实是消失了,为什么?要怎么做?

    代码如下:
    //创建下层的窗体
    void EcgArea(void)
    {
        ecgWaveWin = WINDOW_CreateEx(0, PARAM_ECG_Y, WAVE_AREA_WIDTH, PARAM_AREA_HEIGHT
                                        , 0, WM_CF_SHOW, 0, GUI_ID_USER + 5, cbEcgWave);
        WINDOW_SetBkColor(ecgWaveWin, GUI_BLACK);
    }

//在任务里每20毫秒执行一次
void TestTask(void)
{
        WM_SetCallback(ecgWaveWin, cbEcgWave);
        WM_Exec();
}


//窗体回调, 动态连续地画直线
static void cbEcgWave(WM_MESSAGE *pMsg)
{
    switch (pMsg->MsgId)
    {
        case WM_PAINT:
                       
                        GUI_SetColor(GUI_GREEN);
                       
                        if (sEraseX + 4 >= WAVE_AREA_WIDTH)
                                sEraseX = 0;
                        if (sPointX >= WAVE_AREA_WIDTH)
                        {
                                sPointX = 0;
                                sEraseX = sPointX + 2;
                        }
                        GUI_DrawLine(sPointX, POINT_Y, sPointX + 1, POINT_Y);
                        GUI_SetColor(GUI_BLACK);
                        GUI_FillRect(sEraseX, 0, sEraseX + 2, PARAM_AREA_HEIGHT);
                       
                        sPointX++;
                        if (sPointX < WAVE_AREA_WIDTH - 4)
                                sEraseX++;
                        break;

                default:
            WM_DefaultProc(pMsg);
            break;
        }
}


ecgWaveWin是下层的窗体。

上层的窗体:
void CreateEcgSetupDialog(void)
{
        ecgSetupDlg = WINDOW_CreateEx(ECG_SETUP_DIALOG_X, ECG_SETUP_DIALOG_Y, ECG_SETUP_DIALOG_WIDTH, ECG_SETUP_DIALOG_HEIGHT
                                        , 0, WM_CF_SHOW, 0, RESOURCE_DLG_ECG_SETUP, cbEcgSetupDialog);
        WINDOW_SetBkColor(ecgSetupDlg, GUI_LIGHTGRAY);


        WM_Exec();
}

void DeleteEcgDialog(void)
{
        WM_DeleteWindow(ecgSetupDlg);
        WM_Exec();
}


下层窗体动态画线的代码,在一个任务里,:
void vTaskTestWave(void *pvParameter)
{

        while(1)
        {
                TestTask();
                vTaskDelay(4);
        }
}

当某个时候调用CreateEcgSetupDialog创建上层窗体,然后调用DeleteEcgDialog删除上层窗体时,上下层窗体重叠的一部分没有消失,这是为什么???
如果不使用vTaskTestWave这个定时任务,创建下层窗体时在窗体里画一些图形,当创建上层窗体时,下层窗体的一部分被被挡住,但当删除上层窗体后,挡住的部分会正常显示出来。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-1-4
在线时间
14 小时
 楼主| 发表于 2019-3-27 19:37:02 | 显示全部楼层
“ecgWaveWin是下层的窗体”这里写错了,是“ecgSetupDlg”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-23 19:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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