一個應用程式是由一個或多個視窗構成的。
視窗建立過程(hello sprd):
(1)建立視窗TABLE()
宏 WINDOW_TABLE定義了視窗資料資訊表,在window_parse.h
WINDOW_TABLE(MMI_HELLO_SPRD_WIN_TAB)=
{
WIN_ID(MMI_HELLO_SPRD_WIN_ID),//視窗ID
WIN_FUNC((uint32)HandleHelloSprdWinMsg), //處理函數
WIN_TITLE(TXT_HELLO_TITLE),//視窗標題
WIN_SOFTKEY(STXT_OK, TXT_NULL, STXT_RETURN),
END_WIN
};
(2)註冊視窗ID
暫放於MMI_APP/COMMON/H/mmi_id.def中
WIN_ID_DEF(MMI_HELLO_SPRD_WIN_ID,"MMI_HELLO_SPRD_WIN_ID")
(3)MMK位於mmk_app.h中
在idle視窗的處理函數裡面加case_msg_app_ok裡加一句:
MMK_CreateWin((uint32*)MMI_HELLO_SPRD_WIN_TAB,PNULL);
(4)寫視窗處理函數,否則是一個空視窗 不會顯示。(視窗回呼函數)
首先要申明,LOCAL MMI_RESULT_E HandleHelloSprdWinMsg(
MMI_WIN_ID_T win_id,
MMI_MESSAGE_ID_E msg_id,
DPARAM param
);
然後函數實現:視窗的處理函數其實就是一個大的CASE語句,主要處理來自於系統的內部和外部訊息。
LOCAL MMI_RESULT_E HandleHelloSprdWinMsg(
MMI_WIN_ID_T win_id,
MMI_MESSAGE_ID_E msg_id,
DPARAM param
)
{ MMI_RESULT_E recode=MMI_RESULT_TRUE;
switch(msg_id)
{
case MSG_OPEN_WINDOW: //開啟視窗的訊息
break;
case MSG_FULL_PAINT: //重新整理視窗訊息
{
GUI_LCD_DEV_INFO lcd_dev_info ={GUI_MAIN_LCD_ID,GUI_BLOCK_MAIN};
GUI_POINT_T start_point={1,1};
GUI_RECT_T rect={0,0,239,319}; //全屏地區
MMI_STRING_T text_str={0};
MMIRES_GetText(TXT_HELLO_SPRD,win_id,&text_str);
GUI_FillRect(&lcd_dev_info,rect,MMI_WHITE_COLOR);
start_point.x=1;
start_point.y=30;
LCD_DisplayString(&lcd_dev_info,start_point,text_str.wstr_ptr,text_str.wstr_len,0,MMI_BLACK_COLOR,SONG_FONT_16,0);//顯示字串介面
start_point.x=1;
start_point.y=50;
GUIRES_DisplayImg(&start_point,PNULL,PNULL,win_id,HELLO_SPRD_TEST,&lcd_dev_info);
HelloDrawLine();
HelloDrawRect();
HelloFillRect();
}
break;
case MSG_APP_OK:
MMK_CreateWin((uint32*)MMI_TEST_MENU_WIN_TAB,PNULL);
break;
case MSG_GET_FOCUS: //視窗獲得焦點
break;
case MSG_LOSE_FOCUS: //視窗失去焦點
break;
case MSG_APP_CANCEL: //////2010-05-10
MMK_CloseWin(MMI_HELLO_SPRD_WIN_ID);
break;
case MSG_CLOSE_WINDOW: //關閉視窗訊息
break;
default:
recode=MMI_RESULT_FALSE;
break;
}
return recode;
}
總結一下一個視窗的建立步驟:
(1)建立視窗TABLE
(2) 註冊視窗ID
(3)調用MMK_createWin建立視窗
(4)實現視窗處理函數
關於部分CASE語句的訊息定義:
MSG_OPEN_WINDOW:開啟視窗
MSG_GET_FOCUS:視窗獲得焦點
MSG_FULL_PAINT:視窗重新整理
MSG_LOSE_FOCUS:視窗失去焦點
MSG_CLOSE_WINDOW:關閉視窗
MSG_APP_CANCEL:右鍵訊息(取消或返回)
資源(靜態資源和動態資源)
包括:字串、圖片、菜單、字型檔、聲音等。
資源工程定義檔案:mmi_res_prj_def.h
模組資源ID定義檔案:例如common模組common_mdu_def.h檔案
添加字串資源:
(1)在資源檔夾,開啟STR_TABLE.xls
檔案末尾處添加(ID,MAXLENGTH,ENGLISH)
(2)開啟common_mdu_def.h
添加res_add_string(TXT_HELLO_SPRD,"HELLO SPRD")
字串資源的使用:
{
GUI_POINT_T start_point={1,1,};
GUI_RECT_T rect={0,0,239,319};
MMI_STRING_T text_str={0};//定義字串資源資訊
MMIRES_GetText(TXT_HELLO_SPRD,win_id,&text_str);//擷取字串資源資訊
GUI_FILLrect(&lcd_dev_info,rect,MMI_WHITE_COLOR);
LCD_DisplayString(&lcd_dev_info, start_point,text_str.wstr_ptr,
text_str.wstr_len,0,MMI_BLACK_COLOR,SONG_FONT_16,0);
}
添加圖片資源:
(1)將圖片儲存於相應模組的MS_Code\MS_MMI\source\resource\mmi_res_240x320\common\MMI_RES_DEFAULT\IMAG\Common
(2)在common_mdu_def.h中添加(注意路徑)
RES_ADD_IMG(HELLO_SPRD_TEST,"\\MMI_RES_##\\IMAG\\Common\\HELLO_SPRD_TEST.BMP",IMG_CMP_BMP_16_565_RAW,0)
(3){
start_point.x=1;
start_point.y=50;
GUIRES_DisplayImg(&start_point,PNULL,PNULL,win_id,HELLO_SPRD_TEST,&lcd_dev_info);
}
添加菜單資源:
(1)mmi_menutable.c
//添加於5月17
#define MENU_DEF(_TABLEID, _ITEMPTR, _STYLE, _TITLESTR, _TITLE_ICON, _TITLE_NUMICON, _TITLE_BACKGROUND, \
_ITEMCOUNT) \
_ITEMPTR, _STYLE, _TITLESTR, _TITLE_ICON, _TITLE_NUMICON, _TITLE_BACKGROUND, _ITEMCOUNT,
const GUIMENU_ITEM_T menu_hello_table[]=
{
{ID_HELLO_TEST1,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST1,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
{ID_HELLO_TEST2,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST2,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
{ID_HELLO_TEST3,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST2,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
(2)mmi_menutable.def中添加菜單組ID定義
MENU_DEF( MENU_HELLO_TABLE, menu_hello_table, GUIMENU_STYLE_THIRD, TXT_NULL,IMAGE_COMMON_TITLE_BAR, IMAGE_NULL,IMAGE_NULL, GUIMENU_ITEM_NUM(menu_hello_table))
(3)加入菜單ID
typedef enum//菜單ID
{
ID_HELLO_TEST1,
ID_HELLO_TEST2,
ID_HELLO_TEST3,
ID_HELLO_TOTAL
}MMI_HELLO_MENU_ID_E;
(4) 在mainapp.c裡面加入
WINDOW_TABLE(MMI_TEST_MENU_WIN_TAB)=
{
WIN_ID(MMI_TEST_MENU_WIN_ID),
WIN_FUNC((uint32)HandleTestMenuWinMsg),
WIN_TITLE(TXT_NULL),
CREATE_MENU_CTRL(0,MMI_CLIENT_RECT_TOP,MMI_MAINSCREEN_RIGHT_MAX_PIXEL,MMI_CLIENT_RECT_BOTTOM,MENU_HELLO_TABLE,MMI_TEST_MENU_CTRL_ID),
WIN_SOFTKEY(STXT_OK,TXT_NULL,STXT_RETURN),
END_WIN
};
(1)查看功能表項目資料定義:const GUIMENU_ITEM_T menu_settings[] =
有助於瞭解菜單的含義。在mmi_menutable.c檔案內
菜單組資料:
首先定義該檔案中MENU_DEF宏中取那些資料:
#define MENU_DEF(...)....
const GUIMENU_GROUP_T menu_table[]={} //這個如果是另增模組就需要,
否則加在別的模組的話會引起重定義錯誤。
(2)定義菜單組ID和菜單組資料
MENU_DEF(...)...//定義菜單資料資訊宏
定義菜單資料資訊(數組),const GUIMENU_ITEM_T menu_hello_table[]=
{
{ID_HELLO_TEST1,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST1,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
{ID_HELLO_TEST2,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST2,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
{ID_HELLO_TEST3,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST2,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
};
(3)定義功能表項目ID
typedef enum {
ID_HELLO_TSET1,
ID_HELLO_TSET2,
ID_HELLO_TSET3,
ID_HELLO_Total
}mmi_hello_menu_id_e;
(4)建立視窗列表
window_table(mmi_test_menu_win_tab)={}
(5)
case MSG_APP_OK:
MMK_CreateWin((uint32*)MMI_TEST_MENU_WIN_TAB,PNULL);
為視窗增加處理函數handletestMenuWinMsg()
設定訊息的ACTIVE狀態,否則接收不到訊息。
case MSG_OPEN_WINDOW:
MMK_SetAtvCtrl(win_id,MMI_TEST_MENU_CTRL_ID);
如果添加新模組的話 可以將ID分離開來 建一個sample_id.h檔案
window id
typdef enum{
MMIHELLO_WIN_ID_START=(MMI_MODULE_SAMPLE<<16),
MMI_HELLO_SPRD_WIN_ID,
MMI_TEST_MUNE_WIN_ID,
MMIHELLO_MAX_WIN_ID
}MMIHELLO_WINDOW_ID_E;
CONTROL ID
typedef enum
{
MMIHELLO_CTRL_ID_START=MMIHELLO_MAX_WIN_ID,
MMI_TEST-menu_ctrl_id,
mmihello_max_ctrl_id
}mmihello_control_id_e;