小学生
最后登录1970-1-1
在线时间 小时
注册时间2021-1-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消息,毕竟这个消息是发给父窗口的,那怎么处理按键消息?像按下松开等这些消息怎么响应呢?有些不太懂,请教各位。
|
|