UC/GUI移植 总结之回调函数
醉中天 2011-06-14 18:18
定义你自己的消息:
#define MY_MESSAGE_AAA WM_USER+0
#define MY_MESSAGE_BBB WM_USER+1
在这里
这是说明书给出的回调机制
下面分析一下典型的数字面板输入机制:
现在主函数中加载 hNumPad = GUI_CreateDialogBox(_aDialogNumPad,
GUI_COUNTOF(_aDialogNumPad),
_cbDialogNumPad, WM_HBKWIN, 0, 0); /* Create the numpad dialog *///该函数产生了数字面板
//对应回调函数_cbDialogNumPad
static void _cbDialogNumPad(WM_MESSAGE * pMsg) {
GUI_RECT r;
int i, NCode, Id, Pressed = 0;
WM_HWIN hDlg, hItem;
hDlg = pMsg->hWin; // 获得窗口的句柄
switch (pMsg->MsgId) { //根据窗口的消息类型执行相应的内容
WM_GetClientRect(&r);
GUI_SetColor(GUI_RED);
GUI_DrawRect(r.x0, r.y0, r.x1, r.y1); /* Draw rectangle around it */
/* Draw the bright sides */
GUI_SetColor(0xffffff);
GUI_DrawHLine(r.y0 + 1, r.x0 + 1, r.x1 - 2); /* Draw top line */
GUI_DrawVLine(r.x0 + 1, r.y0 + 1, r.y1 - 2);
/* Draw the dark sides */
GUI_SetColor(0x555555);
GUI_DrawHLine(r.y1-1, r.x0 + 1, r.x1 - 1);
GUI_DrawVLine(r.x1-1, r.y0 + 1, r.y1 - 2);
break;
case WM_INIT_DIALOG: //窗口的初始化 控件的各种属性 颜色 文本
for (i = 0; i < GUI_COUNTOF(_aDialogNumPad) - 1; i++) {
hItem = WM_GetDialogItem(hDlg, GUI_ID_USER + i); //返回一个对话框中控件的句柄 根据此句柄 设置控件的属性句柄是根据控件的ID号得到的
BUTTON_SetFocussable(hItem, 0); /* Set all buttons non focussable */
BUTTON_SetBkColor(hItem,0,GUI_BLUE);
switch (i) {
case 13:
BUTTON_SetBitmapEx(hItem, 0, &_bmArrowLeft, 15, 10); /* Set bitmap for arrow left button (unpressed) */
BUTTON_SetBitmapEx(hItem, 1, &_bmArrowLeft, 15, 10); /* Set bitmap for arrow left button (pressed) */
break;
case 14:
BUTTON_SetBitmapEx(hItem, 0, &_bmArrowRight, 15, 10); /* Set bitmap for arrow right button (unpressed) */
BUTTON_SetBitmapEx(hItem, 1, &_bmArrowRight, 15, 10); /* Set bitmap for arrow right button (pressed) */
break;
}
}
hItem = WM_GetDialogItem(hDlg, GUI_ID_USER + 12);
break;
case WM_NOTIFY_PARENT: //通知父窗口控件发生了改变
Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ // 得到窗口控件的ID号
NCode = pMsg->Data.v; /* Notification code */// 控件的消息类型
switch (NCode) {
case WM_NOTIFICATION_CLICKED:
Pressed = 1;
case WM_NOTIFICATION_RELEASED:
if ((Id >= GUI_ID_USER) && (Id <= (GUI_ID_USER + GUI_COUNTOF(_aDialogNumPad) - 1))) {
int Key;
if (Id < GUI_ID_USER + 11) {
char acBuffer[10];
BUTTON_GetText(pMsg->hWinSrc, acBuffer, sizeof(acBuffer)); /* Get the text of the button */
Key = acBuffer[0];
} else {
Key = _aKey[Id - GUI_ID_USER - 11]; /* Get the text from the array */
}
GUI_SendKeyMsg(Key, Pressed); /* Send a key message to the focussed window */ //很关键的地方点击按钮之后要发送键值
}
break;
}
default:
WM_DefaultProc(pMsg);
}
}
从上面的程序可以看出回调函数工作过程可以归结为如下过程:1.获取窗口的句柄 1.根据窗口的消息类型作出相应的判断:WN_PAINT:窗口的. WM_INIT_DIALOG:初始化窗口控件 要根据控件的ID号得到控件句柄 从而根据句柄 设置控件的各种属性 ;;;;;WM_NOTIFY_PARENT:根据 WM_GetId(pMsg->hWinSrc); 得到变化控件的ID号,根据pMsg->Data.v,得到控件的消息类型 根据不同的控件发送GUI_SendKeyMsg(Key, Pressed); 键值。
文本的内容自会出现在另一个窗口的文本框中