سؤال

كنت أحاول تطبيق Win32 هو MessageBox باستخدام GTK.التطبيق باستخدام SDL/OpenGL, لذلك هذا ليس جتك التطبيق.

أنا التعامل مع initialisation (gtk_init) نوع من الاشياء داخل MessageBox وظيفة على النحو التالي:

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

الآن, أنا لا يعني ذوي الخبرة جتك مبرمج وأنا أدرك أنني ربما يفعل شيء خاطئ.

ولكن مشكلتي هي أن آخر حوار برزت مع هذه الوظيفة يبقى حولها حتى إنهاء العملية.أي أفكار ؟

هل كانت مفيدة؟

المحلول

هممم حسنا.أود أن اقترح قانون مثل هذا ، ثم:

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
}

البنية لأنك تحتاج إلى تمرير جميع أنحاء بضع قطع من البيانات.على gtk_idle_add() دعوة يضيف طريقة تشغيل عندما الحلقة الرئيسية هي تشغيل و الخمول ، FALSE قيمة الإرجاع من display_dialog() دعوة يعني أنه فقط تشغيل مرة واحدة.بعد أن نحصل على نتيجة من الحوار ، ونحن الإقلاع الرئيسي أنشوطة.هذا سوف يسبب gtk_main() في الرئيسية MessageBox() طريقة العودة ، عليك أن تكون قادرا على الوصول إلى نتيجة من هناك.

ويساعد هذا الأمل!

نصائح أخرى

لإدارة مربع حوار مع GTK+ استخدام GtkDialog ، gtk_dialog_run() بدلا من إدارة النافذة الرئيسية حلقة من قبل نفسك.

تحرير / إضافة :

ما أعنيه هو "مجرد استخدام" :أنا لا أفهم لماذا خلق ويندوز يمكنك أبدا استخدام حلقة الرئيسي الذي يبدو عديم الفائدة (على الأقل من قطعة من التعليمات البرمجية التي نشرت).يمكنك كتابة شيء قصيرة مثل :

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

عدد قليل من الأشياء:

كنت تقوم بإنشاء (وليس باستخدام) لا لزوم لها toplevel نافذة اسمه window.يمكنك فقط حذف هذه الخطوط:

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

كما أن تدفق لا يبدو صحيحا تماما. gtk_main() يبدأ جتك حلقة الرئيسي الذي يمنع حتى يخرج منه. gtk_dialog_run() كما يبدأ حلقة الرئيسية ، ولكن خروجه في أقرب وقت واحد من الأزرار النقر.

أعتقد أنه قد تكون كافية بالنسبة لك لإزالة gtk_init_add() و gtk_main() مكالمات التعامل ببساطة مع قيمة الإرجاع.أيضا gtk_widget_destroy() مكالمة ضرورية ، مثل نافذة الحوار تلقائيا دمرت عندما gtk_dialog_run() ترجع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top