硬汉嵌入式论坛

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

[emWin] 使用WM_InvalidateWindow为什么没有重绘窗口

[复制链接]

12

主题

16

回帖

52

积分

初级会员

积分
52
发表于 2018-6-7 10:45:13 | 显示全部楼层 |阅读模式
主要功能:按键控件按下,改变窗口的背景颜色。               
现象:按键按下,颜色不改变,通过打印发现并没有发送WM_PAINT。拖动窗口,可以触发重绘,颜色变化正常。
代码如下:
  1. static void _cbDialog(WM_MESSAGE * pMsg) {
  2.   int NCode;
  3.   int Id;

  4.   switch (pMsg->MsgId) {
  5.   case WM_NOTIFY_PARENT:
  6.     Id    = WM_GetId(pMsg->hWinSrc);
  7.     NCode = pMsg->Data.v;
  8.     switch(Id) {
  9.     case ID_BUTTON_0: // Notifications sent by 'Button'
  10.       switch(NCode) {
  11.       case WM_NOTIFICATION_CLICKED:               
  12.                 g_iOffColor++;
  13.                 if (g_iOffColor == 3)
  14.                 {
  15.                         g_iOffColor = 0;
  16.                 }
  17.                 printf("g_iOffColor = %d, pMsg->hWin = %d\n", g_iOffColor, pMsg->hWin);
  18.                 WM_InvalidateWindow(pMsg->hWin); // 窗口无效
  19.         break;
  20.       case WM_NOTIFICATION_RELEASED:
  21.         break;
  22.       }
  23.       break;
  24.     }
  25.     break;
  26.   // USER START (Optionally insert additional message handling)
  27.   case WM_PAINT:  // 重绘
  28.         printf("WM_PAINT\n");
  29.         GUI_SetBkColor(g_auicolor[g_iOffColor]);
  30.         GUI_Clear();
  31.         break;
  32.   // USER END
  33.   default:
  34.     WM_DefaultProc(pMsg);
  35.     break;
  36.   }
  37. }

  38. WM_HWIN CreateFramewin(void) {
  39.   WM_HWIN hWin;

  40.   hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  41.         printf("hWin = %d\n", hWin);
  42.   return hWin;
  43. }
复制代码


回复

使用道具 举报

12

主题

16

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2018-6-7 11:55:01 | 显示全部楼层
已解决,参考:http://www.openedv.com/posts/list/49346.htm
做如下修改:
  1. WM_InvalidateWindow(WM_GetClientWindow(pMsg->hWin));
复制代码

但v6教程的36.7节为什么是直接无效窗口句柄,而不是无效客户区呢?
回复

使用道具 举报

12

主题

16

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2018-6-7 14:40:36 | 显示全部楼层
若通过GUI_CreateDialogBox创建的对话框,这个函数中指定的回调函数只是对话框客户区窗口的回调函数(见V6教程42.5节)。
如何理解上句话?
如果对话框的主体是框架窗口FrameWin,那么对话框客户区窗口就是框架窗口的客户区窗口。
如果对话框的主体是窗口Window,那么对话框客户区窗口就是此窗口。
这也就可以理解一楼调用WM_InvalidateWindow(pMsg->hWin);为什么不行?
因为这里无效的是整个对话框,而这个对话框并没有设置回调函数,猜测是用默认的回调函数处理WM_PAINT,它并不会改变背景颜色。我设置的回调函数是给客户区用的,所以无效窗口的时候应传入客户区的句柄,也就是:WM_GetClientWindow(pMsg->hWin)返回的句柄。这样一来,下一次的GUI_Exec才会触发我自己设置的回调函数里的WM_PAINT消息。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2018-6-7 19:38:36 | 显示全部楼层
你要充分理解对话框上框架窗口控件FramWin和窗口控件Window的区别才行,教程里面已经讲解非常清楚,细细品味下。

框架FramWin是由主窗口和客户区窗口组成的,我们操作无效化,还有emWin定时器,发送自定义消息,这三个情况务必,务必要是发给客户区窗口的。
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
发表于 2020-4-13 15:56:13 | 显示全部楼层
eric2013 发表于 2018-6-7 19:38
你要充分理解对话框上框架窗口控件FramWin和窗口控件Window的区别才行,教程里面已经讲解非常清楚,细细品 ...

分頁的 page3 每秒收到資料後,會進行          
          case MSG_TCPSendFrame:
                        WM_InvalidateWindow(hWin);       
          break;

我把 Dialog 視窗移來移去,以下畫面都會被裁切...
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-4-14 11:49:25 | 显示全部楼层
fcdxsdxsza 发表于 2020-4-13 15:56
分頁的 page3 每秒收到資料後,會進行          
          case MSG_TCPSendFrame:
                        WM_InvalidateWindow(h ...

在你的另一个帖子里面我们集中交流。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 05:39 , Processed in 0.228748 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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