|
过年在家闲来无事,想深入学习下UCGUI的消息机制,于是找了个简单的例程改了改,想把对话框里控件接收消息的次数都打印出来,但其结果却和我的预期有点不一样。
首先我使用对话框资源列表创建了一个对话框,对话框包含了几个控件,然后在对话框回调函数的初始化消息里再创建一个按钮控件,接着编译、下载、运行。。。。对话框显示
正常。。。。。但问题是通过对话框资源列表创建的按钮控件能正常接收消息,唯有在对话框回调函数初始化消息里创建的那个按钮却无法接受任何消息,何解??。。。。。
难道通过资源列表创建的对话框和通过其它方式创建的对话框在消息处理上有区别??请版主指点一二。。。。。。。。。。
程序代码如下(红色部分代码):
int m=0,n=0,l=0,k=0,j=0,p=0,q=0,a=0,b=0,c=0;/*定义全局变量,用于记录接收到的消息次数*/
char tmp[50];
/**************************************************************
*对话框资源列表
**************************************************************/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "Message Loop...", 0, 50, 10, 300, 350, FRAMEWIN_CF_MOVEABLE },
{ BUTTON_CreateIndirect, "OK", GUI_ID_OK, 10, 10, 60, 32 },
{ EDIT_CreateIndirect, NULL, GUI_ID_EDIT0, 100, 10, 100, 15, 0, 50 },
{ CHECKBOX_CreateIndirect, NULL, GUI_ID_CHECK0, 260, 10, 0, 0 },
{ TEXT_CreateIndirect, "", GUI_ID_TEXT1, 10, 100, 280, 32 },
{ TEXT_CreateIndirect, "", GUI_ID_TEXT2, 10, 120, 280, 32 },
{ TEXT_CreateIndirect, "", GUI_ID_TEXT3, 10, 140, 280, 32 },
{ TEXT_CreateIndirect, "", GUI_ID_TEXT4, 10, 160, 280, 32 },
{ TEXT_CreateIndirect, "", GUI_ID_TEXT5, 10, 180, 280, 32 },
{ TEXT_CreateIndirect, "", GUI_ID_TEXT6, 10, 200, 280, 32 },
{ TEXT_CreateIndirect, "", GUI_ID_TEXT7, 10, 220, 280, 32 },
{ TEXT_CreateIndirect, "", GUI_ID_TEXT8, 10, 240, 280, 32 },
{ TEXT_CreateIndirect, "", GUI_ID_TEXT9, 10, 260, 280, 32 },
};
/**************************************************************
*桌面回调函数
**************************************************************/
static void _cbBkWindow(WM_MESSAGE * pMsg) {
switch (pMsg->MsgId) {
case WM_PAINT:
GUI_SetBkColor(GUI_BLUE);
GUI_Clear();
break;
default:
WM_DefaultProc(pMsg);
}
}
/**************************************************************
*对话框回调函数
**************************************************************/
static void _cbCallback(WM_MESSAGE * pMsg) {
int NCode, Id;
WM_HWIN hDlg, htext1,htext2,htext3,htext4,htext5,htext6,htext7,htext8,htext9;
BUTTON_Handle Button1;
hDlg = pMsg->hWin;
switch (pMsg->MsgId) {
case WM_PAINT:
m++;
htext1 = WM_GetDialogItem(hDlg, GUI_ID_TEXT1);
sprintf(tmp,"WM_PAINT: %d",m);
TEXT_SetText(htext1,tmp);
break;
case WM_INIT_DIALOG:
p++;
htext2 = WM_GetDialogItem(hDlg, GUI_ID_TEXT2);
sprintf(tmp,"WM_INIT_DIALOG: %d",p);
TEXT_SetText(htext2,tmp);
/*在初始化对话框的时候创建一个按钮*/
Button1=BUTTON_CreateEx(200,100,60,32,hDlg,WM_CF_SHOW,NULL,GUI_ID_CANCEL);
BUTTON_SetText(Button1,"Cancel");
break;
case WM_NOTIFY_PARENT:
n++;
htext3 = WM_GetDialogItem(hDlg, GUI_ID_TEXT3);
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
sprintf(tmp,"WM_NOTIFY_PARENT: %d",n);
TEXT_SetText(htext3,tmp);
switch (NCode) {
case WM_NOTIFICATION_VALUE_CHANGED:
l++;
htext4 = WM_GetDialogItem(hDlg, GUI_ID_TEXT4);
sprintf(tmp,"VALUE_CHANGED: %d",l);
TEXT_SetText(htext4,tmp);
break;
case WM_NOTIFICATION_RELEASED:
q++;
htext5 = WM_GetDialogItem(hDlg, GUI_ID_TEXT5);
sprintf(tmp,"WM_NOTIFICATION_RELEASED: %d",q);
TEXT_SetText(htext5,tmp);
if (Id == GUI_ID_OK) {
j++;
htext6 = WM_GetDialogItem(hDlg, GUI_ID_TEXT6);
sprintf(tmp,"OK: %d",j);
TEXT_SetText(htext6,tmp);
//GUI_EndDialog(hDlg, 0);
}
if (Id == GUI_ID_EDIT0) {
a++;
htext7 = WM_GetDialogItem(hDlg, GUI_ID_TEXT7);
sprintf(tmp,"EDIT0: %d",a);
TEXT_SetText(htext7,tmp);
}
if (Id == GUI_ID_CHECK0) {
b++;
htext8 = WM_GetDialogItem(hDlg, GUI_ID_TEXT8);
sprintf(tmp,"CHECK0: %d",b);
TEXT_SetText(htext8,tmp);
}
if (Id == GUI_ID_CANCEL) { //点击按钮的时候,消息无法传递到这里!!!!1
c++;
htext9 = WM_GetDialogItem(hDlg, GUI_ID_TEXT9);
sprintf(tmp,"CANCEL: %d",c);
TEXT_SetText(htext9,tmp);
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
/******************************************************************
* 主函数
****************************************************************/
void MainTask(void) {
GUI_Init();
WM_SetCallback(WM_HBKWIN, _cbBkWindow);
WM_SetCreateFlags(WM_CF_MEMDEV);
GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
while(1) {
GUI_Delay(150);
}
}
运行效果如下:
这是没有任何点击时接收到的消息次数
这是点击对话框中所有按钮后的,接收到的消息次数,但唯独点击CANCEL按钮时没有任何消息。
|
|