1370773758 发表于 2023-11-23 15:24:11

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

本帖最后由 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回调处就处理完,目前几个函数在中断发送出去都是不能显示,猜测在中断在运行再发消息调用直接死机了。

eric2013 发表于 2023-11-23 21:20:25

除了WM_Invalidate(),还有个局部刷新API,可以设置刷新区大小。

1370773758 发表于 2023-11-24 09:06:46

现在正在尝试用WM_InvalidateRect()函数刷新矩形区域,现在是要更改四周,图片在四周,单刷一片区域能做到我想要的效果,但4个矩形好像就不行了,还在尝试

1370773758 发表于 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()就没问题了
现在的效果是四周区域刷新而中间的图片不刷新
页: [1]
查看完整版本: EMWIN发送WM_PAINT给自身来刷新窗口