全志ARM926 Melis2.0系统的开发指引⑧

全志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

相关推荐
矛取矛求2 小时前
Linux如何更优质调节系统性能
linux
lb36363636363 小时前
介绍一下数组(c基础)(详细版)
c语言
李元豪3 小时前
【智鹿空间】c++实现了一个简单的链表数据结构 MyList,其中包含基本的 Get 和 Modify 操作,
数据结构·c++·链表
UestcXiye3 小时前
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
c++·计算机网络·ip·tcp
内核程序员kevin3 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
一丝晨光4 小时前
编译器、IDE对C/C++新标准的支持
c语言·开发语言·c++·ide·msvc·visual studio·gcc
丶Darling.5 小时前
Day40 | 动态规划 :完全背包应用 组合总和IV(类比爬楼梯)
c++·算法·动态规划·记忆化搜索·回溯
Ztiddler5 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh
小小不董5 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba