0

我正在裸机 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),
};

我想要做的是将caption.text 的“主菜单”替换为string_table.word1。因此,如果我加载不同的语言集,菜单将自动指向正确的字符数组。当前执行此操作会导致错误表达式必须具有常量值。

现在,我可以通过在菜单组件中保留文本为空并添加:

Link_pointer_to_menu() {
    mainmenu_form.caption.text = string_table.Main_menu_text;
}

这将编译和工作,但我宁愿不必有 100 条左右的这些语句。有没有更优化的方法来做到这一点?

4

1 回答 1

2

我会推荐这样的东西:

enum MyWords
{
    msgHello,
    msgOpen,
    msgClose,
    msgMainMenu,
    num_Messages,
};

char *string_table_t[num_Messages];

您应该编写代码来加载您的语言文件并在此数组中分配指针。之后在您的代码中:

.caption.text = string_table_t[msgMainMenu];

这个想法是你给每个字符串一个符号名称,它是字符串表中的一个偏移量。之后,您将此偏移量用作表的索引。

于 2013-09-17T19:17:53.450 回答