首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请教, 以下代码为什么要二级消息处理呢

2014-01-09 
请问, 以下代码为什么要二级消息处理呢?主函数: hellocompass_scene_create() 中有 建立回调函数1(__MainP

请问, 以下代码为什么要二级消息处理呢?
主函数: hellocompass_scene_create() 中有 建立回调函数1(__MainProc函数), 回调函数1中有消息处理.

回调函数1中有__frmwin_create(), __frmwin_create中有建立回调函数2(__FrmwinProc). 回调函数2中有消息处理.

为什么要二级消息处理呢? 




#include "hellocompass_i.h"
#include "hellocompass_scene.h"

Activity * hellocompass_activity;

typedef struct __scene_para
{
H_LYR lyr;
H_WIN frmwin;
}__scene_para_t;

typedef struct __frmwin_para
{
HTHEME button_theme_fcs;
HTHEME button_theme_ufcs;
button_para_t button_para;
}__frmwin_para_t;

typedef struct __ui_para
{
   __u32   x;
    __u32   y;
    __u32   width;
    __u32   height;
__u32   reserved[32];
}__ui_para_t;

static __s32 __cmd_handle(__gui_msg_t* msg)
{
switch (LOSWORD(msg->dwAddData1))
{
case BTN_ID_ESCAPE:
{
if (HISWORD(msg->dwAddData1) == BN_CLICKED)
{
activity_finish(hellocompass_activity);
}
break;
}

default:
break;


return 0;
}

H_LYR __lyr_create(void)
{
__layerwincreate_para_t lyrcreate_info; 

FB pBarFB =
{
{800, 480}, 
{0, 0, 0},
{FB_TYPE_RGB, {PIXEL_COLOR_ARGB8888, 0, (__rgb_seq_t)0}}, 
};

__disp_layer_para_t lstlyr = 

DISP_LAYER_WORK_MODE_NORMAL, //mode  
0, //ck_mode
0, //alpha_en
190,//alpha_val
1, //pipe
0xff,//prio
{0, 0, 800, 480}, //scr_win
{0, 0, 800, 480},//src_win
DISP_LAYER_OUTPUT_CHN_DE_CH1, //channel
NULL //fb
};

eLIBs_memset(&lyrcreate_info, 0x0, sizeof(__layerwincreate_para_t));
pBarFB.size.width = 800; 
pBarFB.size.height =480;//
lstlyr.scn_win.x =0;//
lstlyr.scn_win.y =0;//
lstlyr.scn_win.width =800;
lstlyr.scn_win.height = 480;//
lstlyr.src_win.x =0;//
lstlyr.src_win.y =0;//
lstlyr.src_win.width =800;//
lstlyr.src_win.height = 480;//

lstlyr.fb = &pBarFB;
lyrcreate_info.name = "layer";
lyrcreate_info.lyrpara = &lstlyr;
lyrcreate_info.initsta = GUI_LYRWIN_STA_SLEEP;

return (GUI_LyrWinCreate(&lyrcreate_info));

}

__s32 __button_create(H_WIN parent, __s32 item_id, button_para_t *button_para, __ui_para_t position)
{
__gui_ctlwincreate_para_t ctlwin_create_info;
ctlwin_create_info.hParent    = parent;
..........
ctlwin_create_info.ctl_rect.width  = position.width;
ctlwin_create_info.ctl_rect.height = position.height;
return (GUI_CtrlWinCreate(&ctlwin_create_info));
}

static __s32 __FrmwinProc(__gui_msg_t  *msg)
{
__msg("msg->id = %d\n", msg->id);
switch(msg->id)
{
case GUI_MSG_CREATE:
{
__frmwin_para_t *frmwin_para;
__ui_para_t ui_para = {100, 100, 60, 50, 0};
.........
__button_create(msg->h_deswin, BTN_ID_ESCAPE, &frmwin_para->button_para, ui_para);
return EPDK_OK;
}
case GUI_MSG_DESTROY:
{
......
dsk_theme_close(frmwin_para->button_theme_fcs);
dsk_theme_close(frmwin_para->button_theme_ufcs);
......
return EPDK_OK;
}
case GUI_MSG_COMMAND:
{
//消息发往管理窗口处理
......
GUI_SendNotifyMessage(&msgex);
......
return EPDK_OK;
}
default:
{
break;
}
}

return GUI_ManWinDefaultProc(msg);
}

H_WIN __frmwin_create(H_WIN parent, H_LYR layer)
{
__gui_framewincreate_para_t framewin_para;
FB fb;
.......
framewin_para.FrameWinProc = (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)__FrmwinProc);
.......
return (GUI_FrmWinCreate(&framewin_para)); 
}

static __s32 __MainProc(__gui_msg_t  *msg)
{
__s32 ret;
switch(msg->id)
    {
case GUI_MSG_CREATE:
{
  __scene_para_t *scene_para;
scene_para = (__scene_para_t *)esMEMS_Malloc(0, sizeof(__scene_para_t));
      .....
scene_para->frmwin = __frmwin_create(msg->h_deswin, scene_para->lyr);
      .....
return EPDK_OK;
}
case GUI_MSG_DESTROY:
{
      .....
return EPDK_OK;
}
case GUI_MSG_COMMAND:
{
__cmd_handle(msg);
return EPDK_OK;
}
default:
{
break;
}


}

return GUI_ManWinDefaultProc(msg);
}

H_WIN hellocompass_scene_create(Activity *activity)
{
H_WINhManWin;
__gui_manwincreate_para_tcreate_info;
.....
create_info.hParent = activity_get_root_win(activity) ;
create_info.ManWindowProc= (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)__MainProc);
.....
return hManWin;
}

__s32 hellocompass_scene_delete(H_WIN hwnd)
{
return GUI_ManWinDelete(hwnd);
}

[解决办法]
重新编译下,代码用code包含起来。
[解决办法]
因为代码抽象通常都是一层一层的,上层只依赖直接相邻的下层,你只有根据代码设计的初衷去了解为什么2层

热点排行