MessageBox GTK uygulaması

oy
28

Ben Win32'nin uygulamaya çalışıyorlar MessageBoxkullanarak GTK. SDL / OpenGL kullanarak uygulama, yani bu bir GTK uygulaması değildir.

Ben başlatma (işlemek gtk_initiç malzeme) tür MessageBoxaşağıdaki şekilde fonksiyonu:

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

Şimdi, hiç deneyimli GTK programcı anlamına tarafından değilim ve ben muhtemelen korkunç yanlış bir şey yapıyorum farkındayız.

Ancak, benim sorunum bu fonksiyon işlem çıkar dek etrafında kalır geçen diyalog açıldı olmasıdır. Herhangi bir fikir?

Oluştur 02/08/2008 saat 00:27
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
16

Hmm tamam. Sonra, böyle bir kod öneririm:

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
}

Verilerin bir kaç parça etrafında geçmesi gerekiyor çünkü yapı olduğunu. gtk_idle_add()Çağrı ana döngü çalışırken çalıştırın ve boşta olan bir yöntem ekler ve FALSEdönüş değeri display_dialog()çağrısı yalnızca bir kez çalıştırıldığı anlamına gelir. Biz iletişim kutusundan sonuç almak sonra, ana döngü çıkın. Yani neden olacak gtk_main()ana yılında MessageBox()dönmek için yöntem ve oradan sonucunu erişmek mümkün olacak.

Bu yardımcı olur umarım!

Cevap 03/08/2008 saat 03:30
kaynak kullanıcı

oy
6

GTK + ile bir iletişim kutusu yönetmek için, bir Gtkdialog ve kullanımı ) gtk_dialog_run ( yerine bir pencere ve kendiniz bir ana döngüye yönetmenin.

DÜZENLEME / EK:

Kullanmak asla bir pencere ve (en azından yayınlanmıştır kod parçasından) işe yaramaz görünüyor bir ana döngü oluşturmak neden anlamıyorum: Demek "sadece kullanmak" tır. Sen gibi kısa bir şey yazabilirsiniz:

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;
    } 
}
Cevap 02/06/2010 saat 16:59
kaynak kullanıcı

oy
5

Bir kaç şey:

Sen adında, gereksiz bir toplevel pencere oluşturarak (ve kullanmayan) vardır window. Sadece bu satırları silebilirsiniz:

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

Ayrıca, akış pek doğru görünmüyor. gtk_main()bir şey onu çıkana kadar bloklar GTK ana döngüyü başlatır. gtk_dialog_run()Ayrıca ana döngü başlar, ancak en kısa sürede düğmelerinden birine tıklandığında olarak çıkar.

Ben kaldırmak için yeterli olabileceğini düşünüyorum gtk_init_add()ve gtk_main()aramaları ve sadece dönüş değeri ile anlaşma. Ayrıca gtk_widget_destroy()() döner gtk_dialog_run zaman diyalog penceresi otomatik olarak yok edilir olarak çağrı, gereksizdir.

Cevap 02/08/2008 saat 19:49
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more