2011-11-15 5 views
1

FLTK를 사용하고 있습니다. 나는 사용자가 어떤 행동을 수행하기 위해 클릭 할 수있는 다양한 버튼이있는 창을 가지고있다. 내 int main()에서 나는 이들 모두를 다루기 위해 switch 문을 가지고있다.FLTK 창 닫기

case Exit_program: 
    cout << "save files and exit\n"; 
    do_save_exit(sw); 

이 두 개의 버튼 예 (종료)없이 (하지 출구)와 종료 확인 창을 생성하는 do_save_exit 기능 간다 : 사용자가 종료를 클릭하면 스위치 문은 설정과 같이합니다. 예 버튼이있어 프로그램을 종료하지만 버튼이 없다는 것은 확인 창을 숨겨야 함을 의미합니다. 이것은 다음과 같은 기능입니다 :

void yes(Address addr, Address) 
{ 
    exit(0); 
} 
void no(Address addr, Address) 
{ 

} 
void do_save_exit(Window& w) 
{ 
    Window quit(Point(w.x()+100, w.y()+100), 250, 55, "Exit confirmation"); 
    Text conf(Point(15,15),"Do you really want to save and exit?"); 
    Button yes(Point(60, 20),35,30,"Yes",yes); 
    Button no(Point(140, 20),35,30,"No",no); 
    quit.attach(conf); 
    quit.attach(yes); 
    quit.attach(no); 
    wait_for_main_window_click(); 
} 

문제는, 버튼을 클릭하면 무효화됩니다.하지만 아무데도 갈 수 없습니다. Quit.hide()를하고 싶지만 no 함수는 종료 창 (범위 외)을 보지 못합니다. 어떻게해야합니까? 고맙습니다.

P.S : 포인터를 사용하여 종료 창을 사용한 다음 포인터를 사용하여 함수를 사용하지 않고 창을 종료하는 방법에 대해 정확히 설명하지는 않았습니다.

답변

3

아마도 모달 (즉, 대화 상자) 창을 사용해야합니다. 당신이 오류 또는 경고를하지 않는 빌드 할 때 등, <FL/fl_ask.h>

if (fl_ask("Do you really want to save and exit?")) 
    save_and_exit(); 

헤더 또한 팝업의 글꼴, 제목에 대한 기능을 가지고에서

+0

멋진 기능 : 정말 고마워. 이 머리카락을 알아 내기 위해 머리를 찢어 내고 있었다. – Richard

0

봐? 문제는 아마도 전역 함수 이름이 yes이고 no이고 로컬 변수는 똑같은 것입니다. 변수의 이름을 바꾸십시오.

2

Fl_Window 콜백은 윈도우 닫기를 시도 할 때 호출됩니다. 기본 콜백은 창을 숨 깁니다 (모든 창을 숨기면 응용 프로그램이 종료됩니다).

// This window callback allows the user to save & exit, don't save, or cancel. 
static void window_cb (Fl_Widget *widget, void *) 
{ 
    Fl_Window *window = (Fl_Window *)widget; 

    // fl_choice presents a modal dialog window with up to three choices. 
    int result = fl_choice("Do you want to save before quitting?", 
          "Don't Save", // 0 
          "Save",  // 1 
          "Cancel"  // 2 
          ); 
    if (result == 0) { // Close without saving 
     window->hide(); 
    } else if (result == 1) { // Save and close 
     save(); 
     window->hide(); 
    } else if (result == 2) { // Cancel/don't close 
     // don't do anything 
    } 
} 

는 사용자가 설정 어디서든 윈도우의 콜백을 설정하여 Fl_Window, 예를 들면 : 당신이 당신의 자신의 창 콜백을 설정하면 창을 숨기하지 않도록, 당신은이 동작을 재정의 할 수 있습니다 귀하의 메인 기능 :