|
在窗口中建立DropDown控件,一旦该控件聚焦,则按键消息只能传到该控件,传不到其所在窗口
因此通过建立控件本身的回调函数更改按键的传递。
这里GUI_KEY_DOWNSIDE是想让聚焦点移到下一个DropDown控件的
使用WM_SendMessageNoPara的方式可以正常运行
使用WM_SendMessage的方式到达预期位置执行代码后死机,找不出什么原因。
由于模块化的需要,得使用WM_SendMessage的方式,但是不知道怎么办,求版主帮帮忙,谢谢~ ~
/****************DropDown控件回调函数*************************/
void _cbDropDown(WM_MESSAGE * pMsg)
{
WM_MESSAGE Msg;
static LISTBOX_Handle hListbox;
switch (pMsg->MsgId)
{
case WM_KEY:
switch(((WM_KEY_INFO*)(pMsg->Data.p))->Key)
{
case GUI_KEY_DOWNSIDE:
// WM_SendMessageNoPara(WM_GetParent(pMsg->hWin), MSG_DROPDOWN_DOWN); // 使用WM_SendMessageNoPara的方式
Msg.MsgId = WM_KEY;
Msg.hWin = WM_GetParent(pMsg->hWin);
Msg.hWinSrc = pMsg->hWin;
((WM_KEY_INFO*)(Msg.Data.p))->Key = GUI_KEY_DOWNSIDE; // 让按键消息GUI_KEY_DOWNSIDE传到其父窗口
WM_SendMessage(WM_GetParent(pMsg->hWin), &Msg); // 使用WM_SendMessage的方式
break;
default:
break;
}
break;
}
DROPDOWN_Callback(pMsg);
}
/*******************DropDown控件所在窗口*****************/
static void _cbWindowNewFile (WM_MESSAGE * pMsg)
{
static DROPDOWN_Handle hDropDown;
switch (pMsg->MsgId)
{
case WM_CREATE:
hDropDown = DROPDOWN_CreateEx(100, 100, 100, 28, pMsg->hWin, WM_CF_SHOW, 0, ID_DROPDOWN_0);
WM_SetCallback(hDropDown, _cbDropDown); // 调用DropDown控件的回调函数
DROPDOWN_SetFont(hDropDown, GUI_FONT_24B_ASCII);
DROPDOWN_AddString(hDropDown, "Item1");
DROPDOWN_AddString(hDropDown, "Item2");
DROPDOWN_SetListHeight(hDropDown, 60);
break;
case WM_KEY:
switch(((WM_KEY_INFO*)(pMsg->Data.p))->Key)
{
case GUI_KEY_DOWNSIDE:
(do something); // 使用WM_SendMessage的方式可以跑到这里,但是执行完后死机
break;
default:
break;
}
break;
case MSG_DROPDOWN_DOWN:
(do something); // 使用WM_SendMessageNoPara的方式可以跑到这里,而且效果OK
break;
default:
WM_DefaultProc(pMsg);
break;
}
} |
|