ncurses 프로그래밍 예제에서요 sub윈도우 하나만 없애는 방법..

mirr242의 이미지

ncurses 에서요 인터넷에 있던 예제를 공부하려고 제가 소스를 좀 바꿔봤는데요...

프로그램을 컴파일 해서 실행하고
a ---- '이름'에서 enter ----- 이름입력하고 enter ------- 열려있던 윈도우가 모두 종료
궁금한 점은 메인 윈도우에서 새로운 윈도우1을 만들고 이 윈도우1에서
윈도우 2를 생성한다고 했을때 윈도우 2만 사라지게 만들고 윈도우1은 계속 보이게 하려면 어떻게 해야 할까요?

아래는 소스 부분입니다.


#include <ncurses.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define ESCAPE 27 
#define ENTER 10 
char *student_item[] = {"", "이름: ", "학번", "전공", "학년"}; 
char *help_item[] = {"", "help", "about"}; 
char m_name[10]=""; 

WINDOW **student_menu_list(int start_col) 
{ 
        int i; 
        WINDOW **items; 

        items = (WINDOW **)malloc(5 * sizeof(WINDOW *)); 

        items[0] = newwin(6, 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", student_item[i]); 
        wbkgd(items[1], COLOR_PAIR(1)); 
        wrefresh(items[0]); 
        return items; 
} 

WINDOW **name_window(int start_col) 
{ 
        int i; 
        char *name_item[] = {"", "이름을 입력하시오", "이름: "}; 
        WINDOW **name; 

        name = (WINDOW **)malloc(3 * sizeof(WINDOW *)); 

        name[0] = newwin(4, 22, 2, start_col); 
        wbkgd(name[0], COLOR_PAIR(2)); 
        box(name[0], ACS_VLINE, ACS_HLINE); 

        name[1] = subwin(name[0], 1, 17, 3, start_col + 1); 
        name[2] = subwin(name[0], 1, 17, 4, start_col + 1); 

        for(i=1;i<3;i++) 
                wprintw(name[i], "%s", name_item[i]); 

        wbkgd(name[1], COLOR_PAIR(1)); 
        wgetnstr(name[0], m_name, 10); 
        wmove(name[0], 2, 8); 
        wprintw(name[0], "%s", m_name); 
        wgetch(name[0]); 
        werase(name[0]); 


        wrefresh(name[0]); 
        printf("error"); 

        return name; 
} 

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) 
{ 
        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) 
                { 
                        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, "File"); 
        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)); 
} 
                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, "File"); 
        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() 
{ 
        WINDOW *menubar, *statusbar, *about; 
} 

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() 
{ 
        WINDOW *menubar, *statusbar, *about; 
        int key; 
        init_scr(); 
        bkgd(COLOR_PAIR(1)); 
        menubar = subwin(stdscr, 1, 80, 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(); 
        while(1) 
        { 
                WINDOW **menu_items, **name_items; 
                int selected_item; 

                key = getch(); 
                werase(statusbar); 
                wrefresh(statusbar); 

                if(key == 'a') 
                { 
                        menu_items = student_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 if(selected_item == 0) 
                        { 
                                name_items = name_window(19); 
                                strcat(student_item[1], m_name); 
                                delete_menu(menu_items, 3); 
                        } 
                        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) 
                        { 

                        } 
                        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(); 
} 
 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.