2015-09-23 102 views
0

有一个问题困扰了我很多。
我使用C语言在嵌入式设备中显示GUI。就像下面的例子。如何降低GUI程序的复杂度

 
  title 
1.xxxx 2.xxxx 
3.xxxx 4.xxxx 
5.xxxx 6.xxxx  

我使用键盘选择我need.but该项目的项目往往有是的子项,我要画菜单,设定功能again.Just像follwing节目。

 
  title             title             title 
1.xxxx 2.xxxx  press 1  1.xxxx 2.xxxx press 2   1.xxxx 2.xxxx 
3.xxxx 4.xxxx --------------> 3.xxxx 4.xxxx --------------> 3.xxxx 4.xxxx 
5.xxxx 6.xxxx       5.xxxx 6.xxxx       5.xxxx 6.xxxx  

现在我使用下面的代码寺设置我需要的功能。

GrawAndGetKeyCode("0.xxxx||1.xxxx||2.xxxx||3.xxxx||4.xxxx", "title", &nSelect); 
switch(nSelect) 
{ 
    case 0: 
     fuction(); 
     break; 
    case 1: 
     fuction(); 
     break; 
    case 2: 
     fuction(); 
     break; 
    case 3: 
     fuction(); 
     break; 
    case 4: 
     fuction(); 
     break; 
    default: 
     break; 
} 

我不知道是否有什么办法可以使用menu1.item1.subitem2()找出我需要的功能?

非常感谢!

+0

switch语句的要点是什么? –

+4

您可能想了解[指向函数的指针](http://en.cppreference.com/w/c/language/pointer#Pointers_to_functions),它可以放在数组中,并且可以通过例如'nSelect '。 –

+1

什么是'menu1.item1.subitem2()'?你的问题不清楚。 –

回答

1

这样一个简单的菜单系统可以使用简单的状态机来实现。

也许这样的事情(警告:伪上下的代码):

typedef void (*handler_t)(void); // Menu handler function type 

handler_t * current_handlers; 
char *current_menu; 

// The top-level menu 
handler_t top_menu_handlers[] = { 
    top_menu_1, 
    top_menu_2, 
    top_menu_3 
}; 

char *top_menu = "..."; // Menu text for the top menu 

// One sub-menu 
handler_t sub_menu_1_handlers[] = { 
    sub_menu_1_1, 
    sub_menu_1_2, 
    sub_menu_1_3 
}; 

char *sub_menu_1 = "..."; 

// Another sub-menu 
handler_t sub_menu_2_handlers[] = { 
    sub_menu_2_1, 
    sub_menu_2_2, 
    sub_menu_2_3 
}; 

char *sub_menu_2 = "..."; 

// ... 

// Initialization 
current_handlers = top_menu_handlers; 
current_menu = top_menu; 

// The state machine 
for (;;) // Infinite loop 
{ 
    clear_screen(); 
    print_menu(current_menu); 

    int selection = get_input(); 

    current_handlers[selection](); // Call menu function 
} 

// ... 

void top_menu_1(void) 
{ 
    // When user selects `1` in the top menu, go to first sub-menu 
    current_handlers = sub_menu_1_handlers; 
    current_menu = sub_menu_1; 
} 

// ... 
void sub_menu_1_3(void) 
{ 
    // When the user select `3` in the first sub-menu, go back to top menu 
    current_handlers = top_menu_handlers; 
    current_menu = top_menu; 
} 

这是一个很大的工作,以初步建立了,但后来它使代码更普遍,而且它更容易添加新的替代品或菜单。最重要的是,它可以更加自动化(例如,通过将菜单树变成实际的树结构,并使状态机代码处理菜单变化而不是使处理函数改变它)。

0

您可能有一个菜单项的结构,每个结构都包含一个要显示的标签和一个要调用的函数指针。然后,你的DrawMenuAndExecute函数可能需要一个数组menu_item并绘制它们,接受输入并执行相应的函数。这是一个工作示例:

#include <stdio.h> 
#include <stdlib.h> 

typedef void (* MENUFUNCPTR)(); 

struct menu_item { 
    const char *menu_item; 
    MENUFUNCPTR func; 
}; 

void DrawMenuAndExecute(struct menu_item *items, size_t n) { 
    size_t i; 
    int opt; 
    int cont = 1; 
    // draw the menu 
    for (i = 0; i < n; ++i) { 
    printf("%3d: %s\n", (int)(i+1), items[i].menu_item); 
    } 
    printf("Your selection: "); 
    while (cont) { 
    scanf("%d", &opt); 
    if (opt > 0 && opt <= n) { 
     cont = 0; 
    } 
    else { 
     printf("Wrong selection, your selection again: "); 
    } 
    } 
    opt--; 
    if (items[opt].func != NULL) { 
    (*(items[opt].func))(); 
    } 
} 

void main_menu(); 
void item1_item1(); 
void item1_item2(); 
void item1(); 
void item2(); 
void item3(); 
void item4(); 

void main_menu() { 
    struct menu_item items [] = { 
    { "Item 1 (has submenu)", &item1 }, 
    { "Item 2 (count to ten)", &item2 }, 
    { "Item 3 (write something)", &item3 }, 
    { "Exit", &item4 } 
    }; 
    DrawMenuAndExecute(items, 4); 
} 

void item1_item1() { 
    printf("Hello, how're you? (since I don't care, I won't let you type.)\n"); 
    item1(); 
} 

void item1_item2() { 
    main_menu(); 
} 

void item1() { 
    // item1 has a sub menu 
    struct menu_item items [] = { 
    { "Write something", &item1_item1 }, 
    { "Previous Menu", &item1_item2 } 
    }; 
    DrawMenuAndExecute(items, 2); 
} 

void item2() { 
    int i = 1; 
    for (; i <= 10; ++i) { 
    printf("%d ", i); 
    } 
    printf("\n"); 
    main_menu(); 
} 

void item3() { 
    printf("Something.\n"); 
    main_menu(); 
} 

void item4() { 
    exit(0); 
} 

int main(int argc, char **argv) { 
    main_menu(); 
}