我正在使用裸机C应用程序中的ARM Cortex-M3 Keil uv4 IDE。我创建了一个目前使用英语的GUI,但我想让用户能够在手机上使用其他语言。
我创建了一个结构,其中包含所有使用的单词,名为string_table_t。
struct string_table_t
{
char *word1;
char *word2;
char *word3;
};
我的思维过程是使用不同语言的纯文本文件以及每个语言中包含的单词列表。然后我会做一个加载函数,它将字符串表的指针与实际的单词链接起来。
现在,我的初始菜单是通过定义它来静态创建的。它基于Altium软件平台。
// Test structure
struct string_table_t string_table = {"Main Menu","test1","test2"};
form_t mainmenu_form =
{
.obj.x = 0,
.obj.y = 0,
.obj.width = 240,
.obj.height = 320,
.obj.draw = form_draw,
.obj.handler = mainmenu_form_handler,
.obj.parent = NULL,
.obj.agui_index = 0,
.obj.visible = __TRUE,
.obj.enabled = __TRUE,
.caption.x = 0,
.caption.y = 0,
.caption.text = "Main Menu",
.caption.font = &helveticaneueltstdltext18_2BPP,
.caption.color = RGB(230,230,230),
.caption_line_color = RGB(241,101,33),
.caption.fontstyle = FS_NONE,
.caption.align = ALIGN_CENTRE,
.captionbarcolor = RGB(88,89,91),
.children = mainmenu_children,
.n_children = 4,
.relief = RELIEF_NONE,
.color = RGB(65,64,66),
};
我想要做的是用string_table.word1替换caption.text的“主菜单”。因此,如果我加载不同的语言集,菜单将自动指向正确的char数组。当前执行此操作会导致错误表达式必须具有常量值。
现在,我可以通过在菜单组件中保留文本null并添加:
来实现此功能Link_pointer_to_menu() {
mainmenu_form.caption.text = string_table.Main_menu_text;
}
这将编译和工作,但我宁愿不必拥有100个左右的这些语句。有更好的方法吗?
答案 0 :(得分:2)
我会推荐类似的东西:
enum MyWords
{
msgHello,
msgOpen,
msgClose,
msgMainMenu,
num_Messages,
};
char *string_table_t[num_Messages];
您应该编写加载语言文件的代码并在此数组中指定指针。在你的代码之后:
.caption.text = string_table_t[msgMainMenu];
这个想法是你给每个字符串一个符号名称,它是字符串表中的一个偏移量。之后,您将此偏移量用作表格的索引。