野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19978|回复: 2

emWin的控件消息回调问题

[复制链接]
发表于 2021-1-20 13:46:20 | 显示全部楼层 |阅读模式
各位大神,大家好,我最近在学emWin的东西,遇到一个问题不太明白,就是我们使用框架窗口控件创建了一个窗口,并在上面创建了其他的控件,包括按钮,输入框等。按照例程中的代码,在处理消息回调的时候,是在框架窗口的消息回调中处理所有的该框架下的消息。如下: static void _cbDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hItem;
int NCode;
int Id;
switch (pMsg->MsgId) {
case WM_INIT_DIALOG:
/* 初始化框架窗口控件 */
hItem = pMsg->hWin;
FRAMEWIN_SetTitleHeight(hItem, 32);
FRAMEWIN_SetFont(hItem, GUI_FONT_32_1);
FRAMEWIN_SetText(hItem, "STemWIN@EmbedFire STM32F429");
/* 初始化 Button0 */
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
BUTTON_SetFont(hItem, GUI_FONT_24B_ASCII);
break;
case WM_NOTIFY_PARENT:
/* 获取控件 ID */
Id = WM_GetId(pMsg->hWinSrc);
/* 获取消息内容 */
NCode = pMsg->Data.v;
    switch (Id) {
      case ID_BUTTON_0: // Notifications sent by 'Button'
      switch (NCode) {
        case WM_NOTIFICATION_CLICKED:
        break;
        case WM_NOTIFICATION_RELEASED:
        break;
       }
     break;
    }
break;
default:
WM_DefaultProc(pMsg);
break;
}
}

这里是在对话框窗口中捕获WM_NOTIFY_PARENT消息,然后根据消息ID和消息内容区分是点击还是松开等。这里我能找到依据就是控件被点击之后会发送WM_NOTIFY_PARENT消息给父窗口,并且将通知代码放到消息内容结构体里。这是其一。
第二点,我们也可以给某个控件例如上面的Button_0单独指定消息回调函数,这个我看到一搬在自绘按钮代码中出现响应WM_PAINT消息,在对话框的初始化消息即WM_INIT_DIALOG中使用WM_SetCallback()函数设置控件的回调函数。
那么问题来了,当我们重新设置回调函数之后,按钮的消息是不是就直接发给了自己的回调函数?那既然发给自己了,自然就不会发送WM_NOTIFY_PARENT消息,毕竟这个消息是发给父窗口的,那怎么处理按键消息?像按下松开等这些消息怎么响应呢?有些不太懂,请教各位。


回复

使用道具 举报

 楼主| 发表于 2021-1-20 14:15:23 | 显示全部楼层
我刚自己测试了下,发现响应WM_TOUCH消息可以实现部分功能,请问这样正确么?还是有更好办法?
回复 支持 反对

使用道具 举报

发表于 2021-1-21 09:30:25 | 显示全部楼层
本帖最后由 ZZZ_XXJ 于 2021-1-21 09:38 编辑

如果没有自定义回调,那么button响应点击动作的时候,首先在自己的回调里处理,比如WM_PAINT重绘,WM_TOUCH响应触摸之类的,然后在某一个消息中发送WM_NOTIFY_PARENT给父窗口。
重写的控件自定义回调,基本只用到WM_PAINT消息重绘外观,其他的消息会回到默认的BUTTON_Callback中继续处理,控件自定义回调都会有一个default分支,就是这个道理。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-15 06:11 , Processed in 0.029977 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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