问题描述
#include <menu.h>
#include <stdlib.h>
ITEM **it;
MENU *me;
WINDOW *win;
void quit(void)
{
int i;
unpost_menu(me);
free_menu(me);
for(i=0; i<=4; i++)
{
free_item(it[i]);
}
free(it);
delwin(win);
endwin();
}
int main(void)
{
int ch;
initscr();
atexit(quit);
clear();
noecho();
curs_set(0);
cbreak();
nl();
keypad(stdscr,TRUE);
start_color();
init_pair(1,COLOR_WHITE,COLOR_BLUE);
init_pair(2,COLOR_BLUE,COLOR_YELLOW);
bkgd(COLOR_PAIR(1));
it = (ITEM **)calloc(5,sizeof(ITEM *));
it[0] = new_item("M1","Menueeintrag 1");
it[1] = new_item("M2","Menueeintrag 2");
it[2] = new_item("M3","Menueeintrag 3");
it[3] = new_item("Ende","Programm beenden");
it[4] = 0;
me = new_menu(it);
win = newwin(8,30,5,5);
set_menu_win (me,win);
set_menu_sub (me,derwin(win,4,28,3,2));
Box(win,0);
mvwaddstr(win,1,2,"***** Testmenü *****");
set_menu_fore(me,COLOR_PAIR(1)|A_REVERSE);
set_menu_back(me,COLOR_PAIR(1));
wbkgd(win,COLOR_PAIR(2));
post_menu(me);
mvaddstr(14,"Programm mittels Menü oder F1-Funktionstaste beenden");
refresh();
wrefresh(win);
while((ch=getch()) != KEY_F(1))
{
switch(ch)
{
case KEY_DOWN:
menu_driver(me,REQ_DOWN_ITEM);
break;
case KEY_UP:
menu_driver(me,REQ_UP_ITEM);
break;
case 0xA: /* Return- bzw. Enter-Taste -> ASCII-Code */
if(item_index(current_item(me)) == 3)
exit(0);
}
wrefresh(win);
}
return (0);
}
但是在我放置文字的位置,总是存在奇怪的未对准现象。当您查看菜单边框以及与帮助文本相同高度的终端右边框时,便可以看到它。
生成的程序的屏幕截图
解决方法
在“ Testmen ü”上出现的变音符号说明了这个故事:它可能被编码为UTF-8,使用两个字节:
252: 252 0374 0xfc text "\374" utf8 \303\274
如果 locale 设置是(例如)en_US
,那么这将告诉ncurses终端未使用UTF-8,它将假定该字符串实际上是ISO -8859-1。在这种情况下,它将把该字符的两个字节都计为屏幕上的单独单元格。
同时,终端可能正在使用UTF-8编码(并显示屏幕截图中所示的字符)。但是,如果语言环境设置与终端不符,则会看到类似的奇怪内容。