硬汉嵌入式论坛

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

[emWin] EMWIN发送WM_PAINT给自身来刷新窗口

[复制链接]

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-11-23 15:24:11 | 显示全部楼层 |阅读模式
本帖最后由 1370773758 于 2023-11-23 15:26 编辑

目前需要在窗口上点击一个目标区域来达到窗口外围线条的切换。

在对话框的 WM_NOTIFY_RARENT 消息下检测松开

static void _cbDialog(WM_MESSAGE * pMsg) {

  // USER START (Optionally insert additional variables)
    int   NCode;
  //int   Id;

  // USER END
  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    // USER START (Optionally insert additional code for further widget initialization)
    HomeViewInit(pMsg);
    // USER END
    break;
    // USER START (Optionally insert additional message handling)
  case WM_NOTIFY_PARENT:
    NCode = pMsg->Data.v;
    switch(NCode)
    {
    case WM_NOTIFICATION_CLICKED:
       HomeViewOnClick(pMsg);
       break;
    case WM_NOTIFICATION_MOVED_OUT:
       HomeViewOnMoveOut(pMsg);
       break;
    case WM_NOTIFICATION_RELEASED:
        HomeViewOnRelease(pMsg);
       break;
    }
    break;
  case WM_PAINT:


WM_NOTIFICATION_RELEASED消息中

case ID_SCALE_11:
    if(isLeftView == TRUE) break; //防止重复绘制
    isLeftView = TRUE;
    MESSAGE.MsgId = WM_PAINT;
    //WM_Invalidate(WM_GetClientWindow(pMsg->hWin));


    WM_SendMessageNoPara(WM_GetClientWindow(pMsg->hWin),WM_PAINT);  //窗口重绘
    break;
  case ID_SCALE_12:
    if(isLeftView == FALSE) break; //防止重复绘制
    isLeftView = FALSE;
    MESSAGE.MsgId = WM_PAINT;
    //WM_Invalidate(WM_GetClientWindow(pMsg->hWin));

    WM_SendMessageNoPara(WM_GetClientWindow(pMsg->hWin),WM_PAINT);  //窗口重绘
    break;
    }
   


直接使用窗口无效化WM_Invalidate()后面调用刷新能做到重刷界面的效果,但是图片较多刷得比较慢。
有没有更好的处理方法,比如说只在emwin回调处就处理完,目前几个函数在中断发送出去都是不能显示,猜测在中断在运行再发消息调用直接死机了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-11-23 21:20:25 | 显示全部楼层
除了WM_Invalidate(),还有个局部刷新API,可以设置刷新区大小。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2023-11-24 09:06:46 | 显示全部楼层
现在正在尝试用WM_InvalidateRect()函数刷新矩形区域,现在是要更改四周,图片在四周,单刷一片区域能做到我想要的效果,但4个矩形好像就不行了,还在尝试
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2023-11-24 09:24:17 | 显示全部楼层
谢谢硬汉哥,现在已经可以了
case ID_SCALE_12:
                if(isLeftView == FALSE) break; //防止重复绘制
                isLeftView = FALSE;

                WM_InvalidateRect(pMsg->hWin,&RECT1);
                GUI_Exec();
                WM_InvalidateRect(pMsg->hWin,&RECT2);
                GUI_Exec();
                WM_InvalidateRect(pMsg->hWin,&RECT3);
                GUI_Exec();
                WM_InvalidateRect(pMsg->hWin,&RECT4);
                GUI_Exec();
                break;
    }
这部分是按下屏幕按键消息执行部分,单纯的用WM_InvalidateRect()刷新一个区域是可以的,但是用2个以上整个界面都会刷新,在每个区域后面加个GUI_Exec()就没问题了
现在的效果是四周区域刷新而中间的图片不刷新
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 20:02 , Processed in 0.284258 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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