全志ARM926 Melis2.0系统的开发指引⑧
- 编写目的
-
- [12.5. 应用程序编写](#12.5. 应用程序编写)
-
- [12.5.1. 简单应用编写](#12.5.1. 简单应用编写)
-
- [12.5.1.1. 注册应用](#12.5.1.1. 注册应用)
- [12.5.1.2. 创建管理窗口](#12.5.1.2. 创建管理窗口)
- [12.5.1.3. 实现管理窗口消息处理回调函数](#12.5.1.3. 实现管理窗口消息处理回调函数)
- [12.5.1.4. 创建图层](#12.5.1.4. 创建图层)
- [12.5.1.5. 创建 framewin](#12.5.1.5. 创建 framewin)
- [12.5.1.6. 实现 framewin 消息处理回调函数](#12.5.1.6. 实现 framewin 消息处理回调函数)
- [-. 全志相关工具和资源](#-. 全志相关工具和资源)
-
- [-.1 全志固件镜像修改工具 ImageModify.exe 下载](#-.1 全志固件镜像修改工具 ImageModify.exe 下载)
- [-.2 全志固件USB刷机工具 PhoenixSuit 下载](#-.2 全志固件USB刷机工具 PhoenixSuit 下载)
- [-.3 全志Melis2.0 用户手册.pdf下载](#-.3 全志Melis2.0 用户手册.pdf下载)
- [-.4 全志melis2.0 sdk源码库下载](#-.4 全志melis2.0 sdk源码库下载)
编写目的
本文档是全志 Melis2.0 系统的开发指引文档,旨在协助开发者了解和掌握 Melis 系统,快速搭建 Melis系统的开发环境,将 Melis2.0 系统应用到产品开发中。
12.5. 应用程序编写
12.5.1. 简单应用编写
用户程序编写最基本的 6 个步骤:注册应用、创建管理窗口 manwin 并实现回调函数、创建图层、创建framewin 并实现回调函数。下面进行介绍。
12.5.1.1. 注册应用
新方案中,只有一个主应用,子应用由主应用启动,用户应用程序为子程序。主应用默认启动 home
子应用,并由 home 子应用启动其他子应用。因此 home 子应用定义了要切换的子应用 ID。
ROOT\livedesk\beetles\applets\lib\beetles_app.h 文件中定义了子应用 ID 枚举 root_home_id_t,添加项ID_HOME_TEST_APP。
c
typedef enum
{
ID_HOME_FM = 0,
ID_MEDIA_START,
ID_HOME_RECORD=ID_MEDIA_START,
ID_HOME_MOVIE,
ID_MEDIA_END,
ID_HOME_SETTING = ID_MEDIA_END,
ID_HOME_TEST_APP,
ID_MAX_NUM,
} root_home_id_t;
为方便窗口、图层创建,在 ROOT\livedesk\beetles\applets\lib\beetles_app.h 加入定义,窗口或图层创建时使用此名称以进行区分。
c
#define APP_TEST "app_test"
12.5.1.2. 创建管理窗口
管理窗口是所有应用的入口,负责接收消息。创建管理窗口时,id 参数请使用注册 ID 即 APP_TEST。用户也可以添加自定义结构体用于参数传递,即 create_info.attr 参数。
c
_s32 app_test_create(root_para_t *para)
{
__gui_manwincreate_para_t create_info;
test_app_ctrl_t *test_app_ctrl = NULL;
__log("****************************************************************************************\n");
__log("********************************** enter test app ************************************\n");
__log("****************************************************************************************\n");
test_app_ctrl = (test_app_ctrl_t)esMEMS_Balloc(sizeof(test_app_ctrl_t));
if( test_app_ctrl == NULL )
{
__msg("test app esMEMS_Balloc fail\n"); return NULL;
}
eLIBs_memset(test_app_ctrl, 0, sizeof(test_app_ctrl_t));
test_app_ctrl->test_app_font = para->font;
test_app_ctrl->root_type = para->root_type;
eLIBs_memset(&create_info, 0, sizeof(__gui_manwincreate_para_t));
create_info.name = APP_TEST;
create_info.hParent = para->h_parent;
create_info.ManWindowProc = (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)_app_test_proc);
create_info.attr = (void*)test_app_ctrl;
create_info.id = APP_TEST;
create_info.hHosting = NULL;
return(GUI_ManWinCreate(&create_info));
}
12.5.1.3. 实现管理窗口消息处理回调函数
消息处理函数为管理窗口中设置的回调函数,在发生消息传递时先被调用。主要集中处理
GUI_MSG_CREATE、GUI_MSG_DESTROY、GUI_MSG_CLOSE、GUI_MSG_KEY、GUI_MSG_TOUCH 等系统消息,也可以
处理用户自定义消息。
c
static __s32 _app_test_proc(__gui_msg_t *msg)
{
__s32 ret;
switch( msg->id )
{
case GUI_MSG_CREATE: /* 创建子窗口*/
layer = htouch_layer_create(); /* 创建图层*/
GUI_LyrWinSetTop(layer); /* 图层置顶*/
htouch_frmwin_create(msg->h_deswin, layer); /* 创建 framewin*/
return EPDK_OK;
/*释放在 create 中分配的资源,尽量在此回调中释放资源,而不要在退出消息循环后在释放资源*/
case GUI_MSG_DESTROY:
GUI_LyrWinDelete(layer);
return EPDK_OK;
/* 需要支持的桌面消息*/
case DSK_MSG_HOME: /* 回到主界面 */
case DSK_MSG_KILL: /* 强制杀掉该应用程序 */
ret = GUI_ManWinDelete(msg->h_deswin);
return ret;
case GUI_MSG_CLOSE:
GUI_ManWinDelete(msg->h_deswin);
dsk_load_app("main.app"); /* 回到主界面 */
return EPDK_OK; case GUI_MSG_KEY: /* 按键响应 */
if( msg->dwAddData1 == GUI_MSG_KEY_ESCAPE )
{
GUI_ManWinDelete(msg->h_deswin);
dsk_load_app("main.app"); return EPDK_OK;
}
break;
default: break;
}
return GUI_ManWinDefaultProc(msg);/*默认处理流程*/
}
12.5.1.4. 创建图层
此图层为应用程序显示区域,设置显示矩形区域位置和大小,设置区域格式为 ARGB 或者其他。图层成功创建完毕后将会返回图层句柄。
c
static H_LYR test_app_32bpp_layer_create(RECT *LayerRect)
{
H_LYR layer = NULL;
RECT LayerRect;
FB fb =
{
{0, 0}, /* size */
{0, 0, 0}, /* buffer */
{FB_TYPE_RGB, {PIXEL_COLOR_ARGB8888, 0, (__rgb_seq_t)0}}, /* fmt */
};
__disp_layer_para_t lstlyr =
{
DISP_LAYER_WORK_MODE_NORMAL, /* mode */
0, /* ck_mode */
0, /* alpha_en */
0, /* alpha_val */
1, /* pipe */
0xff, /* prio */
{0, 0, 0, 0}, /* screen */
{0, 0, 0, 0}, /* source */
DISP_LAYER_OUTPUT_CHN_DE_CH1, /* channel */
NULL /* fb */
};
__layerwincreate_para_t lyrcreate_info =
{
"APP_TEST",
NULL,
GUI_LYRWIN_STA_SUSPEND,
GUI_LYRWIN_NORMAL
};
fb.size.width = LayerRect->width;
fb.size.height = LayerRect->height;
fb.fmt.fmt.rgb.pixelfmt = PIXEL_COLOR_ARGB8888;
lstlyr.src_win.x = LayerRect->x;
lstlyr.src_win.y = LayerRect->y;
lstlyr.src_win.width = LayerRect->width;
lstlyr.src_win.height = LayerRect->height;
lstlyr.scn_win.x = LayerRect->x;
lstlyr.scn_win.y = LayerRect->y;
lstlyr.scn_win.width = LayerRect->width;
lstlyr.scn_win.height = LayerRect->height;
lstlyr.pipe = 1;
lstlyr.fb = &fb;
lyrcreate_info.lyrpara = &lstlyr;
layer = GUI_LyrWinCreate(&lyrcreate_info);
if( !layer )
{
__err("test app layer create error !\n");
}
return layer;
}
12.5.1.5. 创建 framewin
Framewin 需要传入创建的图层句柄,以操作图层。主要工作是绘图,如创建窗口绘图、按键或触摸改变焦点绘图等。这些工作在回调中实现。另外可以传入一些用户自定义结构体数据,即framewin_para.attr参数。
c
static H_WIN test_app_framewin_create(H_WIN h_parent, setting_general_para_t *para)
{
__gui_framewincreate_para_t framewin_para;
setting_general_para_t *general_para;
FB fb;
GUI_LyrWinGetFB(para->layer, &fb);
eLIBs_memset(&framewin_para, 0, sizeof(__gui_framewincreate_para_t));
framewin_para.name = "test_app win", framewin_para.dwExStyle = WS_EX_NONE;
framewin_para.dwStyle = WS_NONE|WS_VISIBLE;
framewin_para.spCaption = NULL;
framewin_para.hOwner = NULL;
framewin_para.id = GENERAL_MENU_ID;
framewin_para.hHosting = h_parent;
framewin_para.FrameWinPro= (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)htouch_frmwin_cb);
framewin_para.rect.x = 0;
framewin_para.rect.y = 0;
framewin_para.rect.width = fb.size.width;
framewin_para.rect.height = fb.size.height;
framewin_para.BkColor.alpha = 0;
framewin_para.BkColor.red = 0;
framewin_para.BkColor.green = 0;
framewin_para.BkColor.blue = 0;
framewin_para.attr = NULL
framewin_para.hLayer = para->layer;
return (GUI_FrmWinCreate(&framewin_para));
}
12.5.1.6. 实现 framewin 消息处理回调函数
在此回调中完成图层绘制。可以在 GUI_MSG_CREATE 或 GUI_MSG_PAINT 消息中绘制应用界面,图片、文字的使用和绘制请参考第 5 章中。处理按键消息 GUI_MSG_KEY 或触摸消息 GUI_MSG_TOUCH,更新焦点等。应用程序能处理父窗口发送的 GUI_MSG_COMMAND 自定义命令,并完成相应的绘制或其他响应,此外也能发送响应结果到父窗口或其他目标窗口。
c
static __s32 htouch_frmwin_cb(__gui_msg_t *msg)
{
switch( msg->id )
{
case GUI_MSG_CREATE:
{
htoutch_frmw_ctr *ctr;
button_para_t *para; ctr = esMEMS_Malloc(0, sizeof(htoutch_frmw_ctr));
if( !ctr )
{
__err(" frmwin malloc fail \n"); return EPDK_FALSE;
}
eLIBs_memset(ctr, 0, sizeof(htoutch_frmw_ctr));
para = &(ctr->para);
ctr->focus_size =get_res_them(&(para->focus_bmp), STYLEID,ID_HELLOTOUCH_FOCUS_PIC_BMP);
ctr->unfocus_size = get_res_them(&(para->unfocus_bmp), STYLEID,ID_HELLOTOUCH_UNFOCUS_PIC_BMP);
para->bmp_pos.x = 0;
para->bmp_pos.y = 0;
htouch_static_ctl_create(msg->h_deswin, para);
GUI_WinSetAddData( msg->h_deswin, (__u32)ctr);
return EPDK_OK;
}
case GUI_MSG_DESTROY:
{
htoutch_frmw_ctr *ctr = (htoutch_frmw_ctr *)GUI_WinGetAddData(msg->h_deswin);
free_res_them(ctr->para.focus_bmp, ctr->focus_size);
free_res_them(ctr->para.unfocus_bmp, ctr->unfocus_size);
esMEMS_Mfree(0, ctr);
return EPDK_OK;
}
case GUI_MSG_CLOSE:
{
GUI_FrmWinDelete(msg->h_deswin);
return EPDK_OK;
}
case GUI_MSG_COMMAND:
{
switch(LOSWORD(msg->dwAddData1))
{
case ID_WIDGET_STATIC:
{
switch( HISWORD(msg->dwAddData1) )
{
case BN_CLICKED:
{
__gui_msg_t msgex;
eLIBs_memset(&msgex, 0, sizeof(__gui_msg_t));
msgex.id = GUI_MSG_CLOSE;
msgex.h_srcwin = 0;
msgex.h_deswin = GUI_WinGetManWin(msg->h_deswin);
GUI_SendNotifyMessage(&msgex);
break;
}
}
break;
}
}
return EPDK_OK;
}
default:
break;
}
return GUI_FrmWinDefaultProc(msg);
}
-. 全志相关工具和资源
-.1 全志固件镜像修改工具 ImageModify.exe 下载
下载地址:
固件镜像修改工具 ImageModify.exe下载 ImageModify_20230906.rar
-.2 全志固件USB刷机工具 PhoenixSuit 下载
下载地址:
USB刷机工具 PhoenixSuit下载 PhoenixSuit_CN_V1.1.1_20230906.rar
-.3 全志Melis2.0 用户手册.pdf下载
下载地址:
全志Melis2.0 用户手册.pdf下载 documents_20230906_melis_v2.0.rar
-.4 全志melis2.0 sdk源码库下载
下载地址:
全志melis2.0 sdk源码库下载 melis2.0-sdk-release_20230906V2.0.rar