硬汉嵌入式论坛

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

[emWin] 局部刷新和全局刷新

[复制链接]

100

主题

94

回帖

394

积分

高级会员

积分
394
发表于 2021-2-24 14:57:17 | 显示全部楼层 |阅读模式

  1.   hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
  2.    WM_SetHasTrans(hItem);
  3.    WM_SetCallback(hItem, _CbHomeBtn2);
  4.   
  5.    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3);
  6.    WM_SetHasTrans(hItem);
  7.    WM_SetCallback(hItem, _CbHomeBtn3);
复制代码
代码如上,button2  按下,按钮2,3都刷新了。我觉得这个浪费资源了。能不能只刷新我按下的按钮?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2021-2-24 21:54:09 | 显示全部楼层
发个完整测试代码,我试试。
回复

使用道具 举报

15

主题

73

回帖

118

积分

初级会员

积分
118
发表于 2021-2-25 08:46:59 | 显示全部楼层
这个我测试过,很久之前,但是代码找不回来了,也很简单的界面,主要用来颜色变化来看刷新的区域。就是在window控件里面放一个按键,具体怎么写的忘记了,大概是按下按键,本来只是按键刷新颜色就行了,但是window控件里面的一大片区域都刷新了(颜色能看出来)。。。。这一大片区域,按键在左上角。
回复

使用道具 举报

100

主题

94

回帖

394

积分

高级会员

积分
394
 楼主| 发表于 2021-2-25 10:27:57 | 显示全部楼层
eric2013 发表于 2021-2-24 21:54
发个完整测试代码,我试试。

#define DEBUG(fmt, arg...)         printf("%s_%d:" fmt,__func__,__LINE__, ##arg)


void RvDmHome(WM_HWIN hParent);
void RvDmHome01(WM_HWIN hDel,WM_HWIN hParent);
void RvDmHome02(WM_HWIN hDel,WM_HWIN hParent);
void RvDmHome03(WM_HWIN hDel,WM_HWIN hParent);
void RvDmHome04(WM_HWIN hDel,WM_HWIN hParent);
void RvDmHome05(WM_HWIN hDel,WM_HWIN hParent);




int  iFlgInit;
typedef struct
{
        //bmp的(x0,y0)处截取width×height大小的图片,然后显示到屏幕的(x,y)坐标上。

        GUI_BITMAP *pBmp;

        int iX;
        int iY;

        int iX0;
        int iY0;
        int iWidth;
        int iHeight;
}DrwBmpPara_t;

DrwBmpPara_t g_tHomeBmpPara[ID_BUTTON_6-ID_BUTTON_0+1] =
{
        {&(g_tRwDm.hPic[16]),0,0,0,0,0,0},
        {&(g_tRwDm.hPic[16]),0,0,0,0,0,0},
        {&(g_tRwDm.hPic[16]),0,0,40, 140, 400, 195},
        {&(g_tRwDm.hPic[16]),0,0,40, 350, 196, 195},
        {&(g_tRwDm.hPic[16]),0,0,250,350, 200, 195},
        {&(g_tRwDm.hPic[16]),0,0,40, 560, 200, 195},
        {&(g_tRwDm.hPic[16]),0,0,250,560, 200, 195}
};

/* 艺术字 */
DrwBmpPara_t g_tArtBmpPara[ID_BUTTON_0-ID_BUTTON_0+1] =
{
        {&(g_tRwDm.hPic[20]),0,0,380,40,  50,50},
};

/*
        16.dta
        艺术字        (44    144)(433      330) (389,186)
        变量图标       (44    367)(230      542) (186,175)
        数字录入       (250   367)(433      542) (250,367)
        弹出菜单       (44    568)(230      751) (44,  568)
        动画图标       (250   568)(433      751)
*/

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = //主页面
{
          { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 120, 0, 480, 800, 0, 0x0, 0 },//120?
          //{ BUTTON_CreateIndirect, NULL, ID_BUTTON_0, 0, 470, 600, 100, 0, 0, 0 },
          //{ BUTTON_CreateIndirect, NULL, ID_BUTTON_1, 0, 470, 600, 100, 0, 0, 0 },
#if 1
        { BUTTON_CreateIndirect, "", ID_BUTTON_2, 40, 140, 400, 195, 0, 0, 0 },//艺术字

        { BUTTON_CreateIndirect, "", ID_BUTTON_3, 40, 350, 200, 195, 0, 0, 0 },//变量图标
        { BUTTON_CreateIndirect, "", ID_BUTTON_4, 250,350, 200, 195, 0, 0, 0 },//数字录入
        { BUTTON_CreateIndirect, "", ID_BUTTON_5, 40, 560, 200, 195, 0, 0, 0 },//弹出菜单
        { BUTTON_CreateIndirect, "", ID_BUTTON_6, 250,560, 200, 195, 0, 0, 0 } //动画图标
#endif
};

/*艺术字界面*/
static const GUI_WIDGET_CREATE_INFO _aArt[] =
{
          { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 120, 0, 480, 800, 0, 0x0, 0 },
          { BUTTON_CreateIndirect, NULL, ID_BUTTON_0, 376,48,  50,50, 0, 0, 0 },
};
/*
bmp的(x0,y0)处截取width×height大小的图片,然后显示到屏幕的(x,y)坐标上。
*/
void copy_part_of_bitmap(int x, int y, const GUI_BITMAP *bmp, int x0, int y0, int width, int height)
{
  GUI_RECT rect;

  rect.x0 = x;
  rect.y0 = y;
  rect.x1 = x + width - 1;
  rect.y1 = y + height - 1;
  GUI_SetClipRect(&rect);
  GUI_DrawBitmap(bmp, x-x0, y-y0);
  GUI_SetClipRect(NULL);
}


/*艺术字*/
static void _CbHomeBtn2(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin;
        hWin = pMsg->hWin;
        DrwBmpPara_t *ptBmp = &g_tHomeBmpPara[ID_BUTTON_2-ID_BUTTON_0];
        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                {
                        DEBUG("\n");
                        if(BUTTON_IsPressed(hWin))
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[6], 0, 0);
                        }
                        else
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[1], 0, 0);
                        }
                        break;
                }
                default:
                        BUTTON_Callback(pMsg);
        }
}
/*变量图标*/
static void _CbHomeBtn3(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin;
        hWin = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                {
                        DEBUG("\n");
                        if(BUTTON_IsPressed(hWin))
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[7], 0, 0);
                        }
                        else
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[2], 0, 0);
                        }
                        break;
                }
                default:
                        BUTTON_Callback(pMsg);
        }
}

/*数字录入*/
static void _CbHomeBtn4(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin;
        hWin = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                {
                        DEBUG("\n");
                        if(BUTTON_IsPressed(hWin))
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[8], 0, 0);
                        }
                        else
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[3], 0, 0);
                        }
                        break;
                }
                default:
                        BUTTON_Callback(pMsg);
        }
}


/*弹出菜单*/
static void _CbHomeBtn5(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin;
        hWin = pMsg->hWin;

        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                {
                        DEBUG("\n");
                        if(BUTTON_IsPressed(hWin))
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[9], 0, 0);
                        }
                        else
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[4], 0, 0);
                        }
                        break;
                }
                default:
                        BUTTON_Callback(pMsg);
        }
}


/*动画图标*/
static void _CbHomeBtn6(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin;
        hWin = pMsg->hWin;

        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                {
                        DEBUG("\n");
                        if(BUTTON_IsPressed(hWin))
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[10], 0, 0);
                        }
                        else
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[5], 0, 0);
                        }
                        break;
                }
                default:
                        BUTTON_Callback(pMsg);
        }
}



/*艺术字:关闭x*/
static void _CbArtBtn0(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin;
        hWin = pMsg->hWin;

        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                {
                        DEBUG("\n");
                        if(BUTTON_IsPressed(hWin))
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[12], 0, 0);
                        }
                        else
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[13], 0, 0);
                        }
                        break;
                }
                default:
                        BUTTON_Callback(pMsg);
        }
}

/*艺术字:减号*/
static void _CbArtBtn1(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin;
        hWin = pMsg->hWin;

        switch (pMsg->MsgId)
        {
                case WM_PAINT:
                {
                        DEBUG("\n");
                        if(BUTTON_IsPressed(hWin))
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[12], 0, 0);
                        }
                        else
                        {
                                GUI_DrawBitmap(&g_tRwDm.hPic[13], 0, 0);
                        }
                        break;
                }
                default:
                        BUTTON_Callback(pMsg);
        }
}

static void _CbRvDmHome(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        DrwBmpPara_t *ptBmp;

    switch (pMsg->MsgId)
    {
            case WM_PAINT:
            {
                    DEBUG("\n");
                        GUI_DrawBitmap(&(g_tRwDm.hPic[0]), 0, 0);
                        break;
            }
        case WM_INIT_DIALOG:
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _CbHomeBtn2);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3);
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _CbHomeBtn3);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_4);
                        WM_SetCallback(hItem, _CbHomeBtn4);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_5);
                        WM_SetCallback(hItem, _CbHomeBtn5);

                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_6);
                        WM_SetCallback(hItem, _CbHomeBtn6);

            break;

        case WM_NOTIFY_PARENT:
            switch(WM_GetId(pMsg->hWinSrc))
            {
                case ID_BUTTON_2:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome01(pMsg->hWin,WM_HBKWIN);
                                                        break;
                                        }
                        break;
                                case ID_BUTTON_3:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome02(pMsg->hWin,WM_HBKWIN);
                                                        break;
                                        }
                                        break;
                                case ID_BUTTON_4:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome03(pMsg->hWin,WM_HBKWIN);
                                                        break;
                                        }
                                        break;
                                case ID_BUTTON_5:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome04(pMsg->hWin,WM_HBKWIN);
                                                        break;
                                        }
                                        break;
                                case ID_BUTTON_6:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome05(pMsg->hWin,WM_HBKWIN);
                                                        break;
                                        }
                                        break;
            }
                        break;
                       
        default:
            WM_DefaultProc(pMsg);
            break;
      }
}

static void _CbRvDm01(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        DrwBmpPara_t *ptBmp;

    switch (pMsg->MsgId)
    {
            case WM_PAINT:
            {
                    DEBUG("\n");
                        GUI_DrawBitmap(&(g_tRwDm.hPic[11]), 0, 0);
//                        GUI_MEMDEV_WriteAt(g_tRwDm.hMemPic[16],120,0);
                        break;
            }
        case WM_INIT_DIALOG:
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _CbArtBtn0);
            break;

        case WM_NOTIFY_PARENT:
            switch(WM_GetId(pMsg->hWinSrc))
            {
                case ID_BUTTON_0:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome(WM_HBKWIN);
                                                        break;
                                        }
                        break;
            }
                        break;
                       
        default:
            WM_DefaultProc(pMsg);
            break;
      }
}
static void _CbRvDm02(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        DrwBmpPara_t *ptBmp;

    switch (pMsg->MsgId)
    {
            case WM_PAINT:
            {
                    DEBUG("\n");
                        GUI_DrawBitmap(&(g_tRwDm.hPic[22]), 0, 0);
                        break;
            }
        case WM_INIT_DIALOG:
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _CbArtBtn0);
            break;

        case WM_NOTIFY_PARENT:
            switch(WM_GetId(pMsg->hWinSrc))
            {
                case ID_BUTTON_0:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome(WM_HBKWIN);
                                                        break;
                                        }
                        break;
            }
                        break;
                       
        default:
            WM_DefaultProc(pMsg);
            break;
      }
}

static void _CbRvDm03(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        DrwBmpPara_t *ptBmp;

    switch (pMsg->MsgId)
    {
            case WM_PAINT:
            {
                    DEBUG("\n");
                        GUI_DrawBitmap(&(g_tRwDm.hPic[23]), 0, 0);
                        break;
            }
        case WM_INIT_DIALOG:
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _CbArtBtn0);
            break;

        case WM_NOTIFY_PARENT:
            switch(WM_GetId(pMsg->hWinSrc))
            {
                case ID_BUTTON_0:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome(WM_HBKWIN);
                                                        break;
                                        }
                        break;
            }
                        break;
                       
        default:
            WM_DefaultProc(pMsg);
            break;
      }
}
static void _CbRvDm04(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        DrwBmpPara_t *ptBmp;

    switch (pMsg->MsgId)
    {
            case WM_PAINT:
            {
                    DEBUG("\n");
                        GUI_DrawBitmap(&(g_tRwDm.hPic[24]), 0, 0);
                        break;
            }
        case WM_INIT_DIALOG:
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _CbArtBtn0);
            break;

        case WM_NOTIFY_PARENT:
            switch(WM_GetId(pMsg->hWinSrc))
            {
                case ID_BUTTON_0:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome(WM_HBKWIN);
                                                        break;
                                        }
                        break;
            }
                        break;
                       
        default:
            WM_DefaultProc(pMsg);
            break;
      }
}

static void _CbRvDm05(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        DrwBmpPara_t *ptBmp;

    switch (pMsg->MsgId)
    {
            case WM_PAINT:
            {
                    DEBUG("\n");
                        GUI_DrawBitmap(&(g_tRwDm.hPic[25]), 0, 0);
                        break;
            }
        case WM_INIT_DIALOG:
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        WM_SetHasTrans(hItem);
                        WM_SetCallback(hItem, _CbArtBtn0);
            break;

        case WM_NOTIFY_PARENT:
            switch(WM_GetId(pMsg->hWinSrc))
            {
                case ID_BUTTON_0:
                                        switch(pMsg->Data.v)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        RvDmHome(WM_HBKWIN);
                                                        break;
                                        }
                        break;
            }
                        break;
                       
        default:
            WM_DefaultProc(pMsg);
            break;
      }
}

void RvDmHome(WM_HWIN hParent)
{
        iFlgInit = 0;
    GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _CbRvDmHome, hParent, 0, 0);
}

void RvDmHome01(WM_HWIN hDel,WM_HWIN hParent)
{
        WM_DeleteWindow(hDel);
    GUI_CreateDialogBox(_aArt, GUI_COUNTOF(_aArt), _CbRvDm01, hParent, 0, 0);
}
void RvDmHome02(WM_HWIN hDel,WM_HWIN hParent)
{
        WM_DeleteWindow(hDel);
    GUI_CreateDialogBox(_aArt, GUI_COUNTOF(_aArt), _CbRvDm02, hParent, 0, 0);
}
void RvDmHome03(WM_HWIN hDel,WM_HWIN hParent)
{
        WM_DeleteWindow(hDel);
    GUI_CreateDialogBox(_aArt, GUI_COUNTOF(_aArt), _CbRvDm03, hParent, 0, 0);
}
void RvDmHome04(WM_HWIN hDel,WM_HWIN hParent)
{
        WM_DeleteWindow(hDel);
    GUI_CreateDialogBox(_aArt, GUI_COUNTOF(_aArt), _CbRvDm04, hParent, 0, 0);
}
void RvDmHome05(WM_HWIN hDel,WM_HWIN hParent)
{
        WM_DeleteWindow(hDel);
    GUI_CreateDialogBox(_aArt, GUI_COUNTOF(_aArt), _CbRvDm05, hParent, 0, 0);
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2021-2-25 16:37:01 | 显示全部楼层
wen 发表于 2021-2-25 10:27
#define DEBUG(fmt, arg...)         printf("%s_%d:" fmt,__func__,__LINE__, ##arg)

你测试的两个都刷新了,仅仅都执行了你测试的这个 DEBUG("\n")吧
特别注意,实际上根据GUI的裁剪机制,有些地方虽然执行了WM_PAINT,但是它并没有对裁剪区以外的地方执行实际更新。你可以在里面做个GUI_DispString计数看看同步更新不
回复

使用道具 举报

100

主题

94

回帖

394

积分

高级会员

积分
394
 楼主| 发表于 2021-2-25 16:59:41 | 显示全部楼层
eric2013 发表于 2021-2-25 16:37
你测试的两个都刷新了,仅仅都执行了你测试的这个 DEBUG("\n")吧
特别注意,实际上根据GUI的裁剪机制, ...

没有听明白:
1.一个按钮被按下,每个按钮下的WM_PAINT 都被执行了,也就是 GUI_DrawBitmap 都被执行了,这个不就是全部更新么?难道说 GUI_DrawBitmap 内部有过滤?
2.GUI_DispString 这个如何使用,可以验证我的困惑?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2021-2-25 17:05:09 | 显示全部楼层
wen 发表于 2021-2-25 16:59
没有听明白:
1.一个按钮被按下,每个按钮下的WM_PAINT 都被执行了,也就是 GUI_DrawBitmap 都被执行了 ...

这就是裁剪机制的作用,GUI_DispStringAt更方便,直接每个按钮的WM_PAINT消息里面调用下,做个简单的计数
回复

使用道具 举报

5

主题

244

回帖

259

积分

高级会员

积分
259
发表于 2021-2-26 09:36:06 | 显示全部楼层
我感觉会不会是所有对话框的ID号都是一样的原因,试试把每个对话框的ID号都设置成不一样的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 06:14 , Processed in 0.278286 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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