ความพยายามในการปรับขนาด GTK3 ทำให้หน้าต่างขยายแบบทวีคูณ

ฉันมีโปรแกรม C GTK3 ที่มีโน้ตบุ๊กที่มีสองภาพ ฉันต้องการที่จะจับมุมหน้าต่างและปรับขนาดของภาพที่แสดงอยู่ในปัจจุบัน สิ่งที่ฉันมีอยู่ตอนนี้คือโปรแกรมที่เมื่อเริ่มทำงาน หน้าต่างจะขยายใหญ่ขึ้นเรื่อยๆ จนกว่าฉันจะฆ่ามันจากเทอร์มินัลโดยใช้ ctrl-c ฉันวางการโทรแบบสลีปไว้ในการโทรกลับเพื่อลดความเร็วลง แต่ยังคงเพิ่มขึ้น จะหยุดหน้าต่างไม่ให้ขยายได้อย่างไร เว้นแต่ฉันจะ "คว้า" มุมหน้าต่างแล้วปรับด้วยตัวเอง

#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>

GtkWidget *notebook;

gboolean resize_image(GtkWidget *widget, GdkRectangle *allocation,
    gpointer user_data)
{
    int w,h, pagenum;
    GdkPixbuf *pxbscaled;
    GtkWidget *image;
    GdkPixbuf *pixbuf;

    pagenum = gtk_notebook_get_current_page (GTK_NOTEBOOK(notebook));
    image = gtk_notebook_get_nth_page (GTK_NOTEBOOK(notebook), pagenum);
//  GtkImageType image_type = gtk_image_get_storage_type
//      (GTK_IMAGE(image));

    pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(image));

    h = allocation->height;
    w = (gdk_pixbuf_get_width(pixbuf) * h) / gdk_pixbuf_get_height(pixbuf);

    pxbscaled = gdk_pixbuf_scale_simple(pixbuf, w, h, GDK_INTERP_BILINEAR);

    printf("Allocation height %d width %d.\n", h, w);

    gtk_image_set_from_pixbuf(GTK_IMAGE(image), pxbscaled);

    g_object_unref (pxbscaled);

    sleep(2);

    return FALSE;
}

static gboolean delete( GtkWidget *widget,
            GtkWidget *event,
            gpointer   data )
{
    gtk_main_quit ();
    return FALSE;
}

int main( int argc,
      char *argv[] )
{
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *table;
    GtkWidget *label;
    GtkWidget *image;
    int i;
    char bufferl[32];

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
//  gtk_widget_set_size_request (GTK_WIDGET(window), 800, 480);

    g_signal_connect (window, "delete-event",
              G_CALLBACK (delete), NULL);

    gtk_container_set_border_width (GTK_CONTAINER (window), 10);

    table = gtk_grid_new ();
    gtk_container_add (GTK_CONTAINER (window), table);

    /* Create notebook, place position of tabs */
    notebook = gtk_notebook_new ();
    gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
    gtk_grid_attach (GTK_GRID (table), notebook, 0, 6, 3, 3);
    gtk_widget_show (notebook);

    /* Append pages to the notebook */
    for (i = 0; i < 2; i++) {
        sprintf(bufferl, "Page %d", i + 1);

        if (i == 0) {
            image = gtk_image_new_from_file("image1.jpg");
        } else {
            image = gtk_image_new_from_file("image2.jpg");
        }

        gtk_widget_set_halign(image, GTK_ALIGN_START);
        gtk_widget_set_valign(image, GTK_ALIGN_START);

        g_signal_connect(window, "size-allocate", 
            G_CALLBACK(resize_image), NULL);

        label = gtk_label_new (bufferl);
        gtk_notebook_append_page (GTK_NOTEBOOK(notebook), 
            image, label);
    }

    /* Create a close button */
    button = gtk_button_new_with_label ("close");
    g_signal_connect (button, "clicked",
                  G_CALLBACK (delete), NULL);

    gtk_grid_attach (GTK_GRID (table), button, 0, 10, 1, 1);

    gtk_widget_show_all (window);

    gtk_main ();

    return 0;
}

ผู้ใช้จะต้องระบุ image1.jpg และ image2.jpg การแก้ไขการพักสายจะทำให้โปรแกรมเต็มหน้าจอเร็วมาก

แก้ไข: ฉันได้ถามคำถามนี้ในรายชื่อผู้รับจดหมาย gtk ด้วย


person jackson80    schedule 31.07.2018    source แหล่งที่มา


คำตอบ (1)


หน้าต่างที่มีรูปภาพขยายใหญ่ขึ้นเพราะฉันใช้ขนาดของหน้าต่างกับรูปภาพ ดังนั้นภาพจึงใหญ่ขึ้นและทำให้หน้าต่างใหญ่ขึ้น ซึ่งดำเนินไปอย่างไม่สิ้นสุด สัญญาณ "จัดสรรขนาด" ก็ถูกเรียกอยู่ตลอดเวลา ฉันแก้ไขมันโดยการจำกัดความสูงของการจัดสรรในการโทรกลับ โดยคูณด้วย 0.75 ตอนนี้ฉันสามารถขยายและย่อหน้าต่างได้อย่างง่ายดาย และไม่สามารถควบคุมได้ ภาพดูน่าเกลียดเร็วมาก แต่นั่นก็เป็นอีกปัญหาหนึ่ง

person jackson80    schedule 02.08.2018