c - تحميل برنامج gtk




غك تنفيذ مساجيبوكس (2)

أشياء قليلة:

أنت تقوم بإنشاء (وعدم استخدام) نافذة مستدقة غير ضرورية، 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 ().

لقد حاولت تنفيذ مساجيبوكس Win32 باستخدام غك. التطبيق باستخدام سدل / برنامج أوبنغل، لذلك هذا ليس التطبيق غك.

I التعامل مع gtk_init ( gtk_init ) نوع من الاشياء داخل الدالة gtk_init كما يلي:

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() في طريقة gtk_main() الرئيسية، وستتمكن من الوصول إلى النتيجة من هناك.

أتمنى أن يساعدك هذا!





x11