硬汉嵌入式论坛

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

[emWin] 怎么处理窗口口刷新闪烁

  [复制链接]

21

主题

323

回帖

386

积分

高级会员

积分
386
发表于 2024-5-22 21:14:37 | 显示全部楼层 |阅读模式
大家好,
我们机器GUI使用emwin,整个窗口背景窗口是父窗口
坐标是A(A1-A6),右边是B(B1-B6  未画线)
都是Framewin组成的,
A1-A6之间,都留了1个像素的间隔,这样自然就有个背景色作为分割线


现在有个弹出窗口,打开的时候,是遮挡住A的部分,
问题:
关闭这个大窗口的时候,能看到窗口关闭的过程,
而且感觉就是背景几个Framewin的刷新把大窗口切割成了几个部分


我在主窗口的刷新里面,是会绘制A+B真个屏幕那么大的背景色(因为弹出的窗口会有残留)



请问现在怎么处理?该如何优化?


123123.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107866
QQ
发表于 2024-5-23 09:03:45 | 显示全部楼层
有没有可以在模拟器上运行的代码,我试试
回复

使用道具 举报

21

主题

323

回帖

386

积分

高级会员

积分
386
 楼主| 发表于 2024-5-23 09:06:51 | 显示全部楼层
eric2013 发表于 2024-5-23 09:03
有没有可以在模拟器上运行的代码,我试试

那要等等,我们工程很大,我弄一个测试工程,
模拟器上是没有问题的,因为刷新足够快
回复

使用道具 举报

21

主题

323

回帖

386

积分

高级会员

积分
386
 楼主| 发表于 2024-5-23 12:28:12 | 显示全部楼层
本帖最后由 hpxzw_foxmai 于 2024-5-24 09:38 编辑
eric2013 发表于 2024-5-23 09:03
有没有可以在模拟器上运行的代码,我试试

版主,断断续续搞了一段时间,现在可以重现了
点击右边3个窗口,弹出一个大窗口,然后继续点击右边区域,会关闭大窗口
这个时候会闪烁
麻烦你看一下怎么处理,谢谢
公司有加密的,文件保存有乱码,就直接贴代码,可以在模拟器运行

触摸响应代码如下
{
WM_HWIN hWinMSG;
hWinMSG = GetChildByPos(TS_State.x, TS_State.y);
WM_SendMessageNoPara(WM_GetClientWindow(hWinMSG), WM_TOUCH);
}

---------------------------------------------------------------------------------------------------------------
#define LCD_REAL_XSIZE  (1280)
#define LCD_REAL_YSIZE  (800)

#define BTNW  150
#define BTNH  (80)
#define BTNX1 100
#define BTNX2 (BTNX1 + BTNW + 10)
static const GUI_WIDGET_CREATE_INFO _aDialogCreateTest[] = {
    { WINDOW_CreateIndirect,    "Caption",  0x1000,     0,   0, LCD_REAL_XSIZE * 2 /3 + 30,  LCD_REAL_YSIZE,  0,0x0,0},
    { BUTTON_CreateIndirect,    "Button1",  0x1001,   BTNX1, 100, BTNW, BTNH,  0,0x0,0},
    { BUTTON_CreateIndirect,    "Button2",  0x1002,   BTNX2, 100, BTNW, BTNH,  0,0x0,0},
    { BUTTON_CreateIndirect,    "Button3",  0x1003,   BTNX1, 200, BTNW, BTNH,  0,0x0,0},
    { BUTTON_CreateIndirect,    "Button4",  0x1004,   BTNX2, 200, BTNW, BTNH,  0,0x0,0},
    { BUTTON_CreateIndirect,    "Button5",  0x1005,   BTNX1, 500, BTNW, BTNH,  0,0x0,0},
    { BUTTON_CreateIndirect,    "Button6",  0x1006,   BTNX2, 500, BTNW, BTNH,  0,0x0,0},
    { BUTTON_CreateIndirect,    "Button7",  0x1007,   BTNX1, 600, BTNW, BTNH,  0,0x0,0},
    { BUTTON_CreateIndirect,    "Button8",  0x1008,   BTNX2, 600, BTNW, BTNH,  0,0x0,0},
};
static WM_HWIN hDlg_Test = WM_HWIN_NULL;
static void _cbCallbackTest(WM_MESSAGE* pMsg)
{
    switch(pMsg->MsgId)
    {
        case WM_DELETE:
        {
            hDlg_Test = WM_HWIN_NULL;
        }
        break;
        case WM_PAINT:
        {
            GUI_RECT rect;
            WM_GetClientRectEx(pMsg->hWin, &rect);
            GUI_SetColor(COLOR_WHITE);
            GUI_FillRectEx(&rect);
        }
        break;
        default:WM_DefaultProc(pMsg);break;
    }
}
WM_HWIN CreateTestpDialog(void)
{
    hDlg_Test = GUI_CreateDialogBox(_aDialogCreateTest, GUI_COUNTOF(_aDialogCreateTest), &_cbCallbackTest, 0, 0, 0);
    return hDlg_Test;
}

static void _cbBkWin1(WM_MESSAGE* pMsg)
{
    switch(pMsg->MsgId)
    {
        case WM_PAINT:
        {
            GUI_RECT rect;
            WM_GetClientRectEx(pMsg->hWin, &rect);
            GUI_SetColor(COLOR_BLUE);
            GUI_FillRectEx(&rect);
        }
        break;
        default:WM_DefaultProc(pMsg);break;
    }
}
static void _cbBkWin_child(WM_MESSAGE* pMsg)
{
    switch(pMsg->MsgId)
    {
        case WM_PAINT:
        {
            GUI_RECT rect;
            WM_GetClientRectEx(pMsg->hWin, &rect);
            GUI_SetColor(COLOR_RED);
            GUI_FillRectEx(&rect);
        }
        break;
        default:WM_DefaultProc(pMsg);break;
    }
}
static void _cbBkWin_child2(WM_MESSAGE* pMsg)
{
    switch(pMsg->MsgId)
    {
        case WM_PAINT:
        {
            GUI_RECT rect;
            WM_GetClientRectEx(pMsg->hWin, &rect);
            GUI_SetColor(COLOR_MAGENTA);
            GUI_FillRectEx(&rect);
        }
        break;
        case WM_TOUCH:
        case MSG_KEY_ENTER://case USER_MSG_START0:
        {
            if(WM_HWIN_NULL == hDlg_Test)
            {
                CreateTestpDialog();
            }
            else
            {
                GUI_EndDialog(hDlg_Test, 1);
            }
        }
        break;
        default:WM_DefaultProc(pMsg); break;
    }
}

#define ARRAY_LEN (10)
WM_HWIN hClild, hClildArr[ARRAY_LEN] = {0};
GUI_RECT rectArr[ARRAY_LEN] = {0};
void SetInfoToArr(int index, int x, int y, int xsize, int ysize)
{
    if(index >= ARRAY_LEN)
    {
        return;
    }
    rectArr[index].x0 = x;
    rectArr[index].y0 = y;
    rectArr[index].x1 = rectArr[index].x0 + xsize;
    rectArr[index].y1 = rectArr[index].y0 + ysize;
}

WM_HWIN GetChildByPos(int x, int y)
{
    for(int i = 0; i < ARRAY_LEN; i++)
    {
        if(WM_HWIN_NULL != hClildArr)
        {
            if(((x > rectArr.x0) && (rectArr.y0<y)) && ((rectArr.x1>x) && (rectArr.y1 > y)))
            {
                return hClildArr;
            }
        }
    }
    return WM_HWIN_NULL;
}

static void createFrame(void)
{
    int hLeft = LCD_REAL_YSIZE / 6;
    int wLeft = LCD_REAL_XSIZE * 2 /3;
    int hRight = LCD_REAL_YSIZE / 3;
    int wRight = LCD_REAL_XSIZE - wLeft;


    WIDGET_SetDefaultEffect(&WIDGET_Effect_Simple);/* 控件使用简单样式 */
    TEXT_SetDefaultTextColor(COLOR_GREEN);
    //TEXT_SetDefaultFont(g_systemInfo.fontGUI.pDefText);
    HEADER_SetDefaultSkinClassic();
    SCROLLBAR_SetDefaultSkinClassic();
    WINDOW_SetDefaultBkColor(COLOR_CYAN);
    FRAMEWIN_SetDefaultSkinClassic(); /* 开启窗口经典模式 */
    FRAMEWIN_SetDefaultClientColor(COLOR_CYAN);
    LISTVIEW_SetDefaultGridColor(COLOR_CYAN);

    hClildArr[0] = hClild = FRAMEWIN_CreateEx(0, hLeft * 0, wLeft - 1, hLeft - 1, WM_HBKWIN, WM_CF_SHOW, 0, 0, "", _cbBkWin_child);
    FRAMEWIN_SetTitleVis(hClild, 0); FRAMEWIN_SetBorderSize(hClild, 0);SetInfoToArr(0, 0, hLeft * 0, wLeft - 1, hLeft - 1);
    hClildArr[1] = hClild = FRAMEWIN_CreateEx(0, hLeft * 1, wLeft - 1, hLeft - 1, WM_HBKWIN, WM_CF_SHOW, 0, 0, "", _cbBkWin_child);
    FRAMEWIN_SetTitleVis(hClild, 0); FRAMEWIN_SetBorderSize(hClild, 0);SetInfoToArr(1, 0, hLeft * 1, wLeft - 1, hLeft - 1);
    hClildArr[2] = hClild = FRAMEWIN_CreateEx(0, hLeft * 2, wLeft - 1, hLeft - 1, WM_HBKWIN, WM_CF_SHOW, 0, 0, "", _cbBkWin_child);
    FRAMEWIN_SetTitleVis(hClild, 0); FRAMEWIN_SetBorderSize(hClild, 0);SetInfoToArr(2, 0, hLeft * 2, wLeft - 1, hLeft - 1);
    hClildArr[3] = hClild = FRAMEWIN_CreateEx(0, hLeft * 3, wLeft - 1, hLeft - 1, WM_HBKWIN, WM_CF_SHOW, 0, 0, "", _cbBkWin_child);
    FRAMEWIN_SetTitleVis(hClild, 0); FRAMEWIN_SetBorderSize(hClild, 0);SetInfoToArr(3, 0, hLeft * 3, wLeft - 1, hLeft - 1);
    hClildArr[4] = hClild = FRAMEWIN_CreateEx(0, hLeft * 4, wLeft - 1, hLeft - 1, WM_HBKWIN, WM_CF_SHOW, 0, 0, "", _cbBkWin_child);
    FRAMEWIN_SetTitleVis(hClild, 0); FRAMEWIN_SetBorderSize(hClild, 0);SetInfoToArr(4, 0, hLeft * 4, wLeft - 1, hLeft - 1);
    hClildArr[5] = hClild = FRAMEWIN_CreateEx(0, hLeft * 5, wLeft - 1, hLeft - 1, WM_HBKWIN, WM_CF_SHOW, 0, 0, "", _cbBkWin_child);
    FRAMEWIN_SetTitleVis(hClild, 0); FRAMEWIN_SetBorderSize(hClild, 0);SetInfoToArr(5, 0, hLeft * 5, wLeft - 1, hLeft - 1);

    hClildArr[6] = hClild = FRAMEWIN_CreateEx(wLeft, hRight * 0, wRight - 1, hRight - 1, WM_HBKWIN, WM_CF_SHOW, 0, 0, "", _cbBkWin_child2);
    FRAMEWIN_SetTitleVis(hClild, 0); FRAMEWIN_SetBorderSize(hClild, 0);SetInfoToArr(6, wLeft, hRight * 0, wRight - 1, hRight - 1);
    hClildArr[7] = hClild = FRAMEWIN_CreateEx(wLeft, hRight * 1, wRight - 1, hRight - 1, WM_HBKWIN, WM_CF_SHOW, 0, 0, "", _cbBkWin_child2);
    FRAMEWIN_SetTitleVis(hClild, 0); FRAMEWIN_SetBorderSize(hClild, 0);SetInfoToArr(7, wLeft, hRight * 1, wRight - 1, hRight - 1);
    hClildArr[8] = hClild = FRAMEWIN_CreateEx(wLeft, hRight * 2, wRight - 1, hRight - 1, WM_HBKWIN, WM_CF_SHOW, 0, 0, "", _cbBkWin_child2);
    FRAMEWIN_SetTitleVis(hClild, 0); FRAMEWIN_SetBorderSize(hClild, 0);SetInfoToArr(8, wLeft, hRight * 2, wRight - 1, hRight - 1);
}


void apptask_gui(void *argument)
{
    (void)argument;
    GUI_Init();
    GUI_EnableAlpha(0);
    WM_SetCreateFlags(WM_CF_MEMDEV);
    WM_EnableMemdev(WM_HBKWIN);
    WM_SetDesktopColor(COLOR_BLACK);
    WM_MULTIBUF_Enable(1);
    createFrame();
    WM_SetCallback(WM_HBKWIN, _cbBkWin1);
#ifdef WIN32
//    createFreeRtosThread();
#endif
    while(1)
    {
        /* 喂狗 */
        //iwdg_feed();
        GUI_Delay(10);
        if(1)
        {
            static int touchCnt = 0;
            touchCnt++;
            if(touchCnt >= 3)
            {
                touchCnt = 0;
                Touch_Exec();
            }
        }
    }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107866
QQ
发表于 2024-5-24 14:59:22 来自手机 | 显示全部楼层
hpxzw_foxmai  2024-5-23 12:28

3 ...

洢豸
回复

使用道具 举报

21

主题

323

回帖

386

积分

高级会员

积分
386
 楼主| 发表于 2024-5-26 17:45:25 | 显示全部楼层
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107866
QQ
发表于 2024-5-27 01:27:29 | 显示全部楼层

手机回复了,没留意到回复有误,存储设备函数
WM_SetCreateFlags(WM_CF_MEMDEV);WM_EnableMemdev(WM_HBKWIN);
和三缓冲函数,二选一
WM_MULTIBUF_Enable(1);
回复

使用道具 举报

21

主题

323

回帖

386

积分

高级会员

积分
386
 楼主| 发表于 2024-5-27 10:42:45 | 显示全部楼层
eric2013 发表于 2024-5-27 01:27
手机回复了,没留意到回复有误,存储设备函数
WM_SetCreateFlags(WM_CF_MEMDEV);WM_EnableMemdev(WM_HBK ...

版主,两种方法试了还是有问题,

我们用的是ARM926芯片,不知道是不是emwin的配置问题
1、
我这边使用内存设备,屏蔽WM_MULTIBUF_Enable(1); 好像还是不行
是不是要用内存设备进行刷新??代码是要改哪里?
2、
屏蔽WM_SetCreateFlags(WM_CF_MEMDEV);WM_EnableMemdev(WM_HBKWIN);
保留三缓冲,NUM_BUFFERS设置为3,
不知道驱动改哪里,还是一样有问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107866
QQ
发表于 2024-5-28 08:06:17 | 显示全部楼层
hpxzw_foxmai 发表于 2024-5-27 10:42
版主,两种方法试了还是有问题,

我们用的是ARM926芯片,不知道是不是emwin的配置问题

使用WM_MULTIBUF_Enable(1),需要你的底层移植接口也做了多缓冲支持。

现在得考虑在程序上改进下了。
回复

使用道具 举报

21

主题

323

回帖

386

积分

高级会员

积分
386
 楼主| 发表于 2024-5-28 10:48:00 | 显示全部楼层
本帖最后由 hpxzw_foxmai 于 2024-5-28 21:52 编辑
eric2013 发表于 2024-5-28 08:06
使用WM_MULTIBUF_Enable(1),需要你的底层移植接口也做了多缓冲支持。

现在得考虑在程序上改进下了。
...

版主,多缓冲的底层驱动,这个芯片资料少了,我这边搞不定,
有什么办法可以解决这个闪烁问题?
用内存设备吗?
我这边用内存设备,发现还是会闪烁

版主能不能在机器上面实际测一下,看看不用多缓冲,怎么处理不会闪烁,谢谢


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107866
QQ
发表于 2024-5-29 09:16:38 | 显示全部楼层
hpxzw_foxmai 发表于 2024-5-28 10:48
版主,多缓冲的底层驱动,这个芯片资料少了,我这边搞不定,
有什么办法可以解决这个闪烁问题?
用内存 ...

测试了下,模拟器上面运行得做个交互才行,还不太方便。


有视频效果没,分享到百度云,我看下你那边展示出来的效果。
回复

使用道具 举报

21

主题

323

回帖

386

积分

高级会员

积分
386
 楼主| 发表于 2024-5-29 09:49:31 | 显示全部楼层
eric2013 发表于 2024-5-29 09:16
测试了下,模拟器上面运行得做个交互才行,还不太方便。

视频上传了
链接:https://pan.baidu.com/s/1HESEjg5cEHratGqRXtLfLQ
提取码:M695
------------------------------------------------------

版主,给你的代码,你只需要用机器把全部文件放进去就行,
触摸的地方,那个响应代码按我给的弄一下就可以
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107866
QQ
发表于 2024-5-30 09:04:09 | 显示全部楼层
hpxzw_foxmai 发表于 2024-5-29 09:49
视频上传了
链接:https://pan.baidu.com/s/1HESEjg5cEHratGqRXtLfLQ
提取码:M695

看视频了,这个是貌似是你的处理速度有点慢造成的,你可以显示个背景窗口,然后创建个对话框,拖拽对话框看看。

这种效果是处理速度有点慢,看到了自动分割现象。
回复

使用道具 举报

21

主题

323

回帖

386

积分

高级会员

积分
386
 楼主| 发表于 2024-6-3 13:02:55 | 显示全部楼层
eric2013 发表于 2024-5-30 09:04
看视频了,这个是貌似是你的处理速度有点慢造成的,你可以显示个背景窗口,然后创建个对话框,拖拽对话框 ...

版主,我这边试了下,好像不太好做这样的测试
但是,
我把左边的窗口都屏蔽掉,不显示,在机器上面实际测试
打开窗口、关闭窗口,都看不到闪烁

应该是窗口关闭过程中,底部窗口也要做刷新,GUI裁剪之类的
导致刷新是分很多个小区域进行,导致这个问题
不知道怎么处理?
回复

使用道具 举报

7

主题

104

回帖

125

积分

初级会员

积分
125
发表于 2024-6-4 14:25:49 | 显示全部楼层
太多窗口了,界面设计直接用 2D API 画,画线,画点自己组成一个框(窗口)
回复

使用道具 举报

21

主题

323

回帖

386

积分

高级会员

积分
386
 楼主| 发表于 2024-6-6 21:04:09 | 显示全部楼层
eric2013 发表于 2024-5-30 09:04
看视频了,这个是貌似是你的处理速度有点慢造成的,你可以显示个背景窗口,然后创建个对话框,拖拽对话框 ...

版主,我这边试了下,好像不太好做这样的测试
但是,
我把左边的窗口都屏蔽掉,不显示,在机器上面实际测试
打开窗口、关闭窗口,都看不到闪烁
应该是窗口关闭过程中,底部窗口也要做刷新,GUI裁剪之类的
导致刷新是分很多个小区域进行,导致这个问题
不知道怎么处理?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107866
QQ
发表于 2024-6-8 01:41:05 | 显示全部楼层
hpxzw_foxmai 发表于 2024-6-6 21:04
版主,我这边试了下,好像不太好做这样的测试
但是,
我把左边的窗口都屏蔽掉,不显示,在机器上面实际 ...

创建对话框的主体使用FrameWin,然后回调消息的INIT消息里面调用FrameWin的使能窗口可以拖拽标题栏的函数,这样就可以方便测试了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-16 10:03 , Processed in 0.278156 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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