對(duì)于GUI程序,界面上會(huì)呈現(xiàn)許多圖片和文字信息。圖片一般都是運(yùn)行時(shí)從外部載入的,更換比較容易。然而,文字信息大多情況下都是直接寫在程序代碼中的。這種情況下,如果想更換文字,就需要重新編譯程序,非常不方便。這里介紹一種程序界面文字換膚方法,可以無(wú)須重新編譯程序而實(shí)現(xiàn)方便的文字換膚功能,可用于OEM或多語(yǔ)言情形。
1、字典庫(kù)
所有界面中呈現(xiàn)的文字都存儲(chǔ)在該典庫(kù)中,它是一個(gè)獨(dú)立于程序的文件。文件可以是純文本的、加密文本的、動(dòng)態(tài)鏈接庫(kù)或其他任何形式。程序運(yùn)行時(shí),從字典庫(kù)中讀取所需的文字信息。因此,當(dāng)需要修改相關(guān)界面文字時(shí),只需要修改字典庫(kù),然后發(fā)布即可,應(yīng)用程序不需要修改和重新編譯。例如app.dic:
[app]
APP_NAME=程序名
APP_CAPTION=程序標(biāo)題
APP_VERSION=程序版本
APP_COPYRIGHT=程序版權(quán)
2、字典庫(kù)訪問接口API
這里的API主要只有一個(gè),即從字典庫(kù)中提取文字信息。函數(shù)原型可以如下:
char *get_dictionary(char *dictionary, char *section, char *key);
其中,dictionary是字典文件名;section是分節(jié)名,如上面的[app];key為指定的文字信息標(biāo)識(shí);返回值為字典庫(kù)中對(duì)應(yīng)的文字信息。至于具體實(shí)現(xiàn),可以根據(jù)實(shí)際情況而定。其實(shí),很多開發(fā)工具都提供了類似的API,我們只要在其基礎(chǔ)上作簡(jiǎn)單封裝即可。
3、程序中調(diào)用
程序中需要使用文字信息時(shí),直接調(diào)用get_dictionary()即可得到所需的文字??荚?大提示某些情況下需要使用常量形式的文字信息,比如初始化結(jié)構(gòu)或類時(shí)。這時(shí),使用API就不可以了。但我們可以使用宏定義來(lái)達(dá)到此類目的,宏的定義與如下形式相似:
#define GET_DICTIONARY(key) get_dictionary("app.dic", "app", key)
這樣,不管是常量還是變量字符串,我們都可以使用GET_DICTIONARY來(lái)給賦值。
4、一個(gè)簡(jiǎn)單的例子
/*
* demo.dic
*/
[demo]
DEMO_ZH=這是一個(gè)演示
DEMO_US=this is a demo
/*
* dict.h
*/
#ifndef _DICT_H
#define _DICT_H
inline char *get_dictionary(char *dictionary, char *section, char *key)
{
//根據(jù)具體情況實(shí)現(xiàn)
}
#endif
/*
* demo.c
*/
#include "dict.h"
#define GET_DICTIONARY(key) get_dictionary("demo.dic", "demo", key)
int main(int argc, char *argv[])
{
printf("%s\n", GET_DICTIONARY("DEMO_ZH"));
printf("%s\n", GET_DICTIONARY("DEMO_US"));
return 0;
}
1、字典庫(kù)
所有界面中呈現(xiàn)的文字都存儲(chǔ)在該典庫(kù)中,它是一個(gè)獨(dú)立于程序的文件。文件可以是純文本的、加密文本的、動(dòng)態(tài)鏈接庫(kù)或其他任何形式。程序運(yùn)行時(shí),從字典庫(kù)中讀取所需的文字信息。因此,當(dāng)需要修改相關(guān)界面文字時(shí),只需要修改字典庫(kù),然后發(fā)布即可,應(yīng)用程序不需要修改和重新編譯。例如app.dic:
[app]
APP_NAME=程序名
APP_CAPTION=程序標(biāo)題
APP_VERSION=程序版本
APP_COPYRIGHT=程序版權(quán)
2、字典庫(kù)訪問接口API
這里的API主要只有一個(gè),即從字典庫(kù)中提取文字信息。函數(shù)原型可以如下:
char *get_dictionary(char *dictionary, char *section, char *key);
其中,dictionary是字典文件名;section是分節(jié)名,如上面的[app];key為指定的文字信息標(biāo)識(shí);返回值為字典庫(kù)中對(duì)應(yīng)的文字信息。至于具體實(shí)現(xiàn),可以根據(jù)實(shí)際情況而定。其實(shí),很多開發(fā)工具都提供了類似的API,我們只要在其基礎(chǔ)上作簡(jiǎn)單封裝即可。
3、程序中調(diào)用
程序中需要使用文字信息時(shí),直接調(diào)用get_dictionary()即可得到所需的文字??荚?大提示某些情況下需要使用常量形式的文字信息,比如初始化結(jié)構(gòu)或類時(shí)。這時(shí),使用API就不可以了。但我們可以使用宏定義來(lái)達(dá)到此類目的,宏的定義與如下形式相似:
#define GET_DICTIONARY(key) get_dictionary("app.dic", "app", key)
這樣,不管是常量還是變量字符串,我們都可以使用GET_DICTIONARY來(lái)給賦值。
4、一個(gè)簡(jiǎn)單的例子
/*
* demo.dic
*/
[demo]
DEMO_ZH=這是一個(gè)演示
DEMO_US=this is a demo
/*
* dict.h
*/
#ifndef _DICT_H
#define _DICT_H
inline char *get_dictionary(char *dictionary, char *section, char *key)
{
//根據(jù)具體情況實(shí)現(xiàn)
}
#endif
/*
* demo.c
*/
#include "dict.h"
#define GET_DICTIONARY(key) get_dictionary("demo.dic", "demo", key)
int main(int argc, char *argv[])
{
printf("%s\n", GET_DICTIONARY("DEMO_ZH"));
printf("%s\n", GET_DICTIONARY("DEMO_US"));
return 0;
}