硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6349|回复: 3
收起左侧

[μCGUI] 关于UCGUI消息传递的疑惑

[复制链接]

79

主题

191

回帖

428

积分

高级会员

积分
428
发表于 2014-2-6 13:29:56 | 显示全部楼层 |阅读模式
过年在家闲来无事,想深入学习下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);
   }
}


运行效果如下:
这是没有任何点击时接收到的消息次数
1.jpg



这是点击对话框中所有按钮后的,接收到的消息次数,但唯独点击CANCEL按钮时没有任何消息。
2.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107778
QQ
发表于 2014-2-6 16:18:19 | 显示全部楼层
首先这种按钮的创建是不规范的,不能在这个位置创建。你可以在函数
GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
后面创建按钮。

具体是什么原因造成的,等我后天回去了试试看,再给你回复。
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
 楼主| 发表于 2014-2-11 10:37:43 | 显示全部楼层
顶一下。。。。。版主,开工了没??帮我看看这是么问题撒。另外我还想请教一下,我在对话框里创建了一个EDIT文本编辑小工具,想在点击此控件时调用显示数字键盘工具用于输入,此调用应该处理神马消息?我试验了“value changed”消息,貌似没效果。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107778
QQ
发表于 2014-2-11 20:42:41 | 显示全部楼层

回 天马行空 的帖子

天马行空:顶一下。。。。。版主,开工了没??帮我看看这是么问题撒。另外我还想请教一下,我在对话框里创建了一个EDIT文本编辑小工具,想在点击此控件时调用显示数字键盘工具用于输入,此调用应该处理神马消息?我试验了“value changed”消息,貌似没效果。 (2014-02-11 10:37) 
这个我还没有尝试过
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-14 10:38 , Processed in 0.272798 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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