리눅스에서 ncurses 질문드립니다!
글쓴이: kungfumong / 작성시간: 수, 2016/06/08 - 10:08오후
#include <ncurses.h>
#include <stdlib.h>
#include <unistd.h>
#include <locale.h>
#define ESCAPE 27
#define ENTER 10
char *file_item[] = {"","처음으로", "종료",};
char *help_item[] = {"", "족보보기", "about"};
WINDOW **file_menu_list(int start_col)
{
int i;
WINDOW **items;
items=(WINDOW **)malloc(5 * sizeof(WINDOW *));
items[0]=newwin(4,19,1,start_col);
wbkgd(items[0], COLOR_PAIR(2));
box(items[0],ACS_VLINE, ACS_HLINE);
items[1]=subwin(items[0], 1, 17, 2, start_col+1);
items[2]=subwin(items[0], 1, 17, 3, start_col+1);
items[3]=subwin(items[0], 1, 17, 4, start_col+1);
items[4]=subwin(items[0], 1, 17, 5, start_col+1);
for (i =1; i < 5; i++)
wprintw(items[i], "%s",file_item[i]);
wbkgd(items[1], COLOR_PAIR(1));
wrefresh(items[0]);
return items;
}
void about_window() //help-about 메뉴
{
WINDOW *about;
about = newwin(6, 40, 5, 10);
box(about, ACS_VLINE, ACS_HLINE);
wmove(about, 1, 2);
wprintw(about, "섯다 Test Verson 0.1");
wmove(about, 2, 2);
wprintw(about, "Made : 공설민,김현영");
wmove(about, 3, 2);
wprintw(about, "Date : 2016.6.7");
wmove(about, 4, 2);
wprintw(about, "Press any key.. ");
wbkgd(about, COLOR_PAIR(3));
refresh();
wgetch(about);
delwin(about);
}
int check_quit() //종료할때
{
WINDOW *check;
int key;
check = newwin(3, 40, 5, 10);
wmove(check, 1, 2);
wprintw(check, "Exit program (y/n) ? ");
wbkgd(check, COLOR_PAIR(2));
box(check, ACS_VLINE, ACS_HLINE);
refresh();
key = wgetch(check);
delwin(check);
if (key == 'y')
return 1;
else
return 0;
}
WINDOW **help_menu_list(int start_col) //help리스트
{
int i;
WINDOW **items;
items=(WINDOW **)malloc(3 * sizeof(WINDOW *));
items[0]=newwin(4,19,1,start_col);
wbkgd(items[0], COLOR_PAIR(2));
box(items[0],ACS_VLINE, ACS_HLINE);
items[1]=subwin(items[0], 1, 17, 2, start_col+1);
items[2]=subwin(items[0], 1, 17, 3, start_col+1);
for (i = 1; i < 3; i++)
wprintw(items[i], "%s", help_item[i]);
wbkgd(items[1], COLOR_PAIR(1));
wrefresh(items[0]);
return items;
}
void delete_menu(WINDOW **items, int count)
{
int i;
for (i = 0; i < count; i++)
delwin(items[i]);
free(items);
}
int scroll_menu(WINDOW **items,int count,int menu_start_col, int index_num) //메뉴에서 키받음
{
int key;
int selected=0;
while (1)
{
key=getch();
if (key==KEY_DOWN || key==KEY_UP)
{
wbkgd(items[selected+1],COLOR_PAIR(2));
wnoutrefresh(items[selected+1]);
if (key==KEY_DOWN)
{
selected=(selected+1) % count;
}
else
{
selected=(selected+count-1) % count;
}
wbkgd(items[selected+1],COLOR_PAIR(1));
wnoutrefresh(items[selected+1]);
doupdate();
}
else if (key==ESCAPE) //esc
{
return -1;
}
else if (key==ENTER) //엔터
{
return selected;
}
}
}
void init_scr()
{
initscr();
start_color();
init_pair(1, COLOR_WHITE, COLOR_BLUE);
init_pair(2, COLOR_BLUE, COLOR_WHITE);
init_pair(3, COLOR_RED, COLOR_WHITE);
curs_set(2);
noecho();
keypad(stdscr, TRUE);
}
void make_menubar(WINDOW *menubar) //위에 보이는 메뉴값
{
wbkgd(menubar, COLOR_PAIR(2));
wattron(menubar, COLOR_PAIR(3));
waddstr(menubar, "메뉴");
wattron(menubar, COLOR_PAIR(3));
waddstr(menubar, "(a)");
wmove(menubar, 0, 20);
wattron(menubar, COLOR_PAIR(3));
waddstr(menubar, "Help");
wattron(menubar, COLOR_PAIR(3));
waddstr(menubar, "(h)");
wattron(menubar, COLOR_PAIR(3));
}
int main()
{
setlocale(LC_CTYPE,"ko_KR.utf-8");
WINDOW *win_menu,*win_status,*win_pan,*win_com,*win_player;
WINDOW *menubar, *statusbar, *about;
int key;
int i,row,col;
init_scr();
bkgd(COLOR_PAIR(1));
getmaxyx(stdscr,row,col);
menubar = subwin(stdscr, 1, 30, 0, 0);
statusbar = subwin(stdscr, 1, 79, 23, 1);
make_menubar(menubar);
move(2, 1);
printw("Press 'a' or 'h' to open the menus. ");
printw("ESC or 'q' quits.");
refresh();
/* 오른쪽 상태창 */
win_status = subwin(stdscr,row/2, col/6, 2, col-row/2-5);
box(win_status, 0, 0);
wrefresh(win_status);
/* 밑에 출력창 */
win_menu = subwin(stdscr,row/4, col-10, row/2+5, 1);
box(win_menu, 0, 0);
wrefresh(win_menu);
/* 컴퓨터 */
win_com = subwin(stdscr,3, 10, 2, col/2-2);
box(win_com, 0, 0);
wrefresh(win_com);
/* 플레이어 */
win_player = subwin(stdscr,3, 10, row/2, col/2-2);
box(win_player, 0, 0);
wrefresh(win_player);
while(1)
{
wrefresh(win_menu);
wrefresh(win_status);
wrefresh(win_com);
wrefresh(win_player);
WINDOW **menu_items;
int selected_item;
key = getch();
werase(statusbar);
wrefresh(statusbar);
if (key == 'a')
{
menu_items=file_menu_list(0);
selected_item = scroll_menu(menu_items, 4, 20, 0);
//delete_menu(menu_items, 5);
if (selected_item < 0)
wprintw(statusbar, "You haven't selected any item");
else
wprintw(statusbar, "You have selected menu item %d.", selected_item);
touchwin(stdscr);
refresh();
}
if (key == 'h')
{
menu_items=help_menu_list(20);
selected_item = scroll_menu(menu_items, 2, 0, 1);
//delete_menu(menu_items, 3);
if (selected_item == 1)
{
about_window();
}
if (selected_item < 0)
wprintw(statusbar, "You haven't selected any item");
}
if (key == ESCAPE || key == 'q')
{
if (check_quit() == 1)
break;
}
touchwin(stdscr);
refresh();
}
endwin();
}window로 화면만들고 배경색깔을 입혔습니다.
scanf받으니까 입력받은 값이 보이지가 않더군요
printw로 출력을 하면 아주 잘 보입니다!
scanw로 받을려고 해도, 명령어는 먹는데 현재 입력하는 값이 보이질 않아 사용자가 얼마만큼의 값을 입력했는지 알 수가 없습니다 ㅠ
좋은 방법 없을까요
Forums:


공부하시는 거라면 전체적으로 코드 분석을 하면서
공부하시는 거라면 전체적으로 코드 분석을 하면서 잘못된 것들부터 고치시고요.
숙제하시는 거라면 복붙한 코드 중에서 init_scr() 만이라도 분석하세요.
분석은 했는데..
급하다보니 수정하지 못하고 바로 원본을 썼네요..
소스분석은 다 했는데
말씀드렸다 싶이 배경 window로 가리니까 scanw나 scanf를 받았을때 입력하는 공간이 가려져 보이지 않습니다
댓글 달기