Symbian資源文件淺析

一、何爲資源文件:
在symbian應用程序中,資源文件指的是後綴名爲.rss的文件,每個應用程序至少要有一個與之關聯的資源文件。資源編譯器rcomp編譯資源文件後,生成一個.rsc二進制文件和一個相伴的頭文件(.rsg)。這樣在應用程序框架啓動應用程序時,會打開這個二進制文件,藉助在.rsg文件中創建的資源標誌符,根據需要把各個資源加載到C++代碼中。

二、資源文件的作用:
在資源文件中指定用戶界面的佈局,如常用組件菜單、對話框、列表等在界面上的排列樣式,另外還可以在其中指定界面上用戶可見的文本信息。當然,這些可見文本並不一定通過字符串在.rss資源文件中定義,我們一般在.loc本地文件中定義,而只需在.rss資源文件中將.loc本地文件引入(include)即可。

三、與資源文件有關的系統頭文件及其他文件:
在資源文件中,往往會引入許多頭文件,這包括系統頭文件和用戶自定義的頭文件。其中系統頭文件的目錄爲:“SDK目錄/ Epoc32/include/”,以#inlude < >形式引入;用戶頭文件的目錄爲“工程目錄/inc/”,以#include ” ”形式引入。比如HelloWorld.rss中的引入文件如下:
#include <eikon.rh>
#include "HelloWorld.hrh"
#include "HelloWorld.loc"
#include <avkon.rsg>
#include <avkon.rh>
#include <avkon.mbg>
可以看出,資源文件中引入的文件的擴展名一般不是.h。
那麼這些頭文件在資源文件起到什麼作用呢?
經查看它們的源文件得出:
eikon.rh、avkon.rh還有uikon.rh:這些系統頭文件主要用於定義一些資源的結構,即在其中定義了許多的STRUCT,在這些STRUCT中,有的項在給出聲明的同時進行了默認初始化值,而有的僅僅是給出了聲明。eikon.rh主要是一些通用的STRUCT,如STRUCT POINT TIME CLOCK等;uikon.rh主要是一些基本的組件STRUCT定義;avkon.rh主要是S60特有的組件STRUCT定義。
擴展名比較特殊的系統頭文件:
avkon.rsg:這個文件裏全是define語句,比如:
#define R_AVKON_MENUPANE_EMPTY 0x8cc0002
#define R_AVKON_MENUPANE_EXIT 0x8cc0003
#define R_AVKON_MENUPANE_APP_DEFAULT 0x8cc0004
#define R_AVKON_MENUPANE_VIEW_DEFAULT 0x8cc0005
#define R_AVKON_MENUPANE_FEP_DEFAULT 0x8cc0006
#define R_AVKON_MENUPANE_EDITTEXT_DEFAULT 0x8cc0007
#define R_AVKON_MENUPANE_LANGUAGE_DEFAULT 0x8cc0008
像是一些資源標誌符的定義,用16進制數對avkon裏面的所有資源進行定義。跟編譯.rss資源文件時生成的.rsg文件一個擴展名。
avkon.mbg:這個文件只定義了一個枚舉變量TmbmAvkon,如下:
enum TMbmAvkon
{
EMbmAvkonQgn_graf_tab_21,
EMbmAvkonQgn_graf_tab_21_mask,
EMbmAvkonQgn_graf_tab_22,
EMbmAvkonQgn_graf_tab_22_mask,
EMbmAvkonQgn_graf_tab_31,
EMbmAvkonQgn_graf_tab_31_mask,
。。。
}
HelloWorld.hrh:這是一類具有代表性的資源頭文件,有用戶自定義的,也有系統的。這類文件可以包含enum定義,意味着可以在資源文件.rss和C++源文件.cpp之間共享一個只包含enum定義的頭文件,這是定義在兩種類型的文件間共享的值的常用方法。內容如下:
#ifndef HELLOWORLD_HRH
#define HELLOWORLD_HRH
enum ThelloWorldCommandIds //爲菜單命令定義枚舉值
{
EHelloWorldCmdAppTest = 1
};
#endif // HELLOWORLD_HRH
HelloWorld.loc:.loc 文件用於放置本地化的語言文字,比如你可以分別爲中文和英文創建一個 .loc 文件,一個用於存放英文文本,一個用於存放中文文本。內容如下:
// LOCALISATION STRINGS
#define qtn_appl_test "YanHaitao"
// menu exit
#define qtn_appl_exit "Exit"
// example caption strings for app
#define qtn_app_caption_string "YanHaitao"
#define qtn_app_short_caption_string "YanHaitao"
// Localized string for r_message_text
#define R_MESSAGE_TEXT_STRING "Hello World!"
這其中的qtn_appl_test等變量,都能在.rss文件中找到,這個文件是對這些變量的賦值。
本地文件如果要使用中文,那麼使用CHARACTER_SET UTF8指定資源字符集,另外需要注意的是,rss文件和loc等相關文件也需要保存爲UTF-8格式,具體的使用Windows的記事本,EditPlus都可以。

四、資源文件的結構:
介紹完與資源文件相關的文件後,我們來看看一個資源文件的具體結構:
它由兩部分構成,分別稱爲頭部和主體。
1、頭部:含有前面我們所說的包含語句和一些資源文件標準信息。
(1)名字:用NAME語句定義,該語句必須是資源文件中第一個有意義的行,即除去註釋和空白語句,也就是說,這條語句要位於include包含語句之前,後面沒有分號。該語句指定一個由1到4個字符組成的名字,並建議使用大寫字符。如果應用程序使用了多個資源文件的話,那麼可以通過它進行區分。
如:NAME HELL
(2)include包含語句:允許使用其他地方定義的符號和結構。
(3)簽名:它的內容實際上被忽略,但必須有這條語句,否則加載資源時便報錯。一般將實際內容置爲空,如:RESOURCE RSS_SIGNATURE { } ,後面沒有分號。
(4)文檔名緩衝:指定應用程序默認文檔名的TBUF資源。大部分程序不使用文檔,但仍然必須包含此資源,否則加載資源失敗。不需指定文件的擴展名,因爲S60本地文檔不使用擴展名。如:RESOURCE TBUF { buffer=”HelloWorld”;}
在這裏的文件名將作爲參數傳遞給CAknDocument類的OpenFileL(TBool aDoOpen, const TDesC& aFilename, RFs& aFs)方法。這允許一個應用程序在運行時打開一個默認的文檔。如果這裏的值爲空那麼程序默認文檔名和應用程序名一致。
(5)應用程序信息資源:這個資源比較重要。EIK_APP_INFO資源爲應用程序指定各種標準控件。如狀態面板等,通常會創建一個爲狀態面板指定新內容的資源,然後使用EIK_APP_INFO資源的status_pane字段引用它。如:
RESOURCE EIK_APP_INFO
{
hotkeys = r_HelloWorld_hotkeys;
menubar = r_HelloWorld_menubar;
cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;
}
注意:頭部中定義的各種資源都沒有資源名。
2、主體:
定義了應用程序中將要使用的資源。
它的定義格式如下:
RESOURCE STRUCTNAME resource-name
{
resource-initializer-list
}
在這裏STRUCTNAME應替換爲具體的資源結構類型,而這些資源結構類型就在我們前面提到的eikon.rh、uikon.rh、avkon.rh中進行定義的。
資源名resource-name必須小寫,通常以r_開頭,而在C++文件中使用他們時必須大寫,這和資源編譯器工作方式有關。
例如:
RESOURCE HOTKEYS r_HelloWorld_hotkeys
{
control =
{
HOTKEY { command = EAknCmdExit; key=''e''; }
};
}
下面具體研究一下,具體資源的定義方法和過程。
初始化字段有三種不同方式:簡單初始化器、數組初始化器、結構初始化器。
如下:
RESOURCE STRUCT r_my_example_struct
{
simple=EeikCtLabel; //簡單初始化器,分配單個值或字符串
array={1,2,3}; //數組初始化器,大括號,元素用逗號隔開
structmember=OTHERSTRUCT //結構初始化器,編譯器不進行類型檢查,要小心
{
simple1=”hello”;
simple2=”goodbye”;
}
}
針對具體資源定義的說明:
(1)字符串資源:
可以使用TBUF資源將字符串包含在資源文件中。通常,會在一個.loc文件中或是在指定語言的.lxx文件中定義字符串文字,而不是在.rss文件中定義它們,只需在.rss文件中將.loc文件包含進來即可。
.lxx文件中的xx應該替換爲e32std.h中的Tlanguage枚舉定義的兩位數字區域設置碼,之後按照.mmp項目文件中設置的當前生成區域設置把.lxx文件包含到.loc文件中。看一個定義了.lxx文件的.loc文件實例:
#ifdef LANGUAGE_01
#include “MyApp.101”
#endif
#ifdef LANGUAGE_02
#include “MyApp.l02”
#endif
最後,.101和.102文件以各自的語言定義字符串,比如:
#define STR_HELL0 “Hello World”
爲了確保編譯資源時將使用正確的字符串,應該在.mmp文件中包含一行或多行LANG語句,導致生成兩個二進制資源文件:.r01和.r02。
LANG 01
LANG 02
(2)標點:介紹如何使用標點符號
a、所有賦值語句之後都應該有分號
b、列表中的元素以逗號分隔
c、資源定義後以及列表中最後一個元素之後不應有分號
舉例:
RESOURCE AVKON_VIEW r_myapp_view
{
menubar=r_myapp_menubar;//賦值語句後有分號
cba=r_myapp_cba;//賦值,需要分號
} //資源定義結尾,無需分號

RESOURCE TAB_GROUP r_myapp_tabgroup
{
tab_width=EaknTabWidthWithTwoTabs;
active=0;
tabs={
TAB //列表中的第一個TAB STRUCT
{
id=EnavigationPaneTab1;
txt=TAB1_TEXT;
}, //列表元素之間用逗號分隔
TAB
{
id=EnavigationPaneTab2;
txt=TAB2_TEXT;
} //列表結尾無需分號
}; //將列表賦值給tabs,需要分號。
}
(3)創建資源結構:
RESOURCE語句用於創建特定資源的實例,而STRUCT語句則用於定義資源類型,創建的所有STRUCT定義都應改保存在一個擴展名爲.rh的文件中。
注意:STRUCT的名字必須全部爲大寫,不能含有空格,且必須以字母字符開始。
常用STRUCT字段類型:
BYTE、WORD、LONG、DOUBLE、TEXT、LTEXT、BUF、BUF8、BUF<n>、LINK、LLINK、SRLINK、STRUCT等
除簡單字段外,還可以把字段定義爲一個由相同類型的值組成的數組,在字段名後添加一對方括號即可。如:
STRUCT MENU_PANE
{
STRUCT items[ ];
LLINK extension=0;
}

 
發佈了14 篇原創文章 · 獲贊 0 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章