Vra

Ek het probeer om Win32's te implementeer MessageBox gebruik GTK.Die toepassing wat SDL/OpenGL gebruik, so dit is nie 'n GTK-toepassing nie.

Ek hanteer die inisialisering (gtk_init) soort van goed binne die MessageBox funksioneer soos volg:

int MessageBox(HWND hwnd, const char* text, const char* caption, UINT type)
{
    GtkWidget *window = NULL;
    GtkWidget *dialog = NULL;

    gtk_init(&gtkArgc, &gtkArgv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), NULL);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
    // gcallback calls gtk_main_quit()
    gtk_init_add((GtkFunction)gcallback, NULL);

    if (type & MB_YESNO) {
        dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, text);
    } else {
        dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, text);
    }

    gtk_window_set_title(GTK_WINDOW(dialog), caption);
    gint result = gtk_dialog_run(GTK_DIALOG(dialog));

    gtk_main();

    gtk_widget_destroy(dialog);

    if (type & MB_YESNO) {
        switch (result) {
        default:
        case GTK_RESPONSE_DELETE_EVENT:
        case GTK_RESPONSE_NO:
            return IDNO;
            break;
        case GTK_RESPONSE_YES:
            return IDYES;
            break;
        }
    }

    return IDOK;
} 

Nou is ek geensins 'n ervare GTK-programmeerder nie, en ek besef dat ek waarskynlik iets verskriklik verkeerd doen.

My probleem is egter dat die laaste dialoog wat met hierdie funksie verskyn het, bly totdat die proses afloop.Enige idees?

Was dit nuttig?

Oplossing

Hmm, okay.Ek sal kode soos hierdie voorstel, dan:

typedef struct {
    int type;
    int result;
} DialogData;

static gboolean
display_dialog(gpointer user_data)
{
    DialogData *dialog_data = user_data;
    GtkWidget *dialog;

    if (dialog_data->type & MB_YESNO)
        dialog = gtk_message_dialog_new(...);
    else
        dialog = gtk_message_dialog_new(...);

    // Set title, etc.

    dialog_data->result = gtk_dialog_run(...);

    gtk_main_quit();  // Quits the main loop run in MessageBox()

    return FALSE;
}

int MessageBox(...)
{
    DialogData dialog_data;

    dialog_data.type = type;

    gtk_idle_add(display_dialog, &dialog_data);

    gtk_main();

    // Do stuff based on dialog_data.result
}

Die struktuur is omdat jy 'n paar stukke data moet deurgee.Die gtk_idle_add() oproep voeg 'n metode by wat uitgevoer moet word wanneer die hooflus loop en ledig is, en die FALSE terugkeer waarde van die display_dialog() oproep beteken dat dit net een keer uitgevoer word.Nadat ons die resultaat van die dialoog gekry het, verlaat ons die hooflus.Dit sal veroorsaak dat die gtk_main() in jou hoof MessageBox() metode om terug te keer, en jy sal van daar af toegang tot die resultaat kan kry.

Hoop dit help!

Ander wenke

Om 'n dialoogkassie met GTK+ te bestuur, gebruik 'n GtkDialog en gtk_dialog_run() in plaas daarvan om self 'n venster en 'n hooflus te bestuur.

EDIT / ADDENDUM:

Wat ek bedoel is "gebruik net":Ek verstaan ​​nie hoekom jy 'n venster skep wat jy nooit gebruik nie en 'n hooflus wat nutteloos lyk (ten minste van die stukkie kode wat jy geplaas het).Jy kan iets so kort skryf soos:

int MessageBox(HWND hwnd, const char* text, const char* caption, UINT type)
{
    GtkWidget *dialog ;

    /* Instead of 0, use GTK_DIALOG_MODAL to get a modal dialog box */

    if (type & MB_YESNO)
        dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, text );
    else
        dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, text );


    gtk_window_set_title(GTK_WINDOW(dialog), caption);
    gint result = gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy( GTK_WIDGET(dialog) );

    if (type & MB_YESNO)
    {
        switch (result)
        {
        default:
        case GTK_RESPONSE_DELETE_EVENT:
        case GTK_RESPONSE_NO:
            return IDNO;
        case GTK_RESPONSE_YES:
            return IDYES;
        }
        return IDOK;
    } 
}

N paar dinge:

Jy skep (en gebruik nie) 'n onnodige topvlak venster, genaamd window.Jy kan net hierdie reëls uitvee:

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), NULL);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);

Die vloei lyk ook nie heeltemal reg nie. gtk_main() begin die GTK-hooflus, wat blokkeer totdat iets dit verlaat. gtk_dialog_run() begin ook 'n hooflus, maar dit gaan uit sodra een van die knoppies geklik word.

Ek dink dit is dalk genoeg vir jou om die te verwyder gtk_init_add() en gtk_main() oproepe, en handel eenvoudig met die terugkeerwaarde.Ook die gtk_widget_destroy() oproep is onnodig, aangesien die dialoogvenster outomaties vernietig word wanneer gtk_dialog_run() terugkeer.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top