Gtk: Запретить вертикальное изменение размера GtkWindow - PullRequest
4 голосов
/ 03 февраля 2011

Я не могу найти, как это сделать :( есть gtk_window_set_resizable, но он вообще отключает изменение размера, и я все еще хочу, чтобы размер моего окна изменялся горизонтально. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 04 февраля 2011

Полагаю, вы можете попробовать использовать функцию gtk_window_set_geometry_hints и указать максимальную и минимальную высоту для своего окна. В этом случае вы все равно разрешите изменение ширины, тогда как высота останется постоянной. Пожалуйста, проверьте, подойдет ли вам приведенный ниже пример:

int main(int argc, char * argv[])
{
    gtk_init(&argc, &argv);
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    GdkGeometry hints;
    hints.min_width = 0;
    hints.max_width = gdk_screen_get_width(gtk_widget_get_screen(window));;
    hints.min_height = 300;
    hints.max_height = 300;

    gtk_window_set_geometry_hints(
        GTK_WINDOW(window),
        window,
        &hints,
        (GdkWindowHints)(GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE));

    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

надеюсь, это поможет, с уважением

0 голосов
/ 05 февраля 2017

Опираясь на ответ @ serge_gubenko, если вы хотите запретить вертикальное изменение размера только после первоначального макета, вам необходимо настроить обратный вызов для сигнала size-allocate.

Пример:

static gint signal_connect_id_cb_dialog_size_allocate;

static void
cb_dialog_size_allocate (GtkWidget    *window,
                         GdkRectangle *allocation,
                         gpointer      user_data)
{
        GdkGeometry hints;

        g_signal_handler_disconnect (G_OBJECT (dialog),
                                     signal_connect_id_cb_dialog_size_allocate);

        /* dummy values for min/max_width to not restrict horizontal resizing */
        hints.min_width = 0;
        hints.max_width = G_MAXINT;
        /* do not allow vertial resizing */
        hints.min_height = allocation->height;
        hints.max_height = allocation->height;
        gtk_window_set_geometry_hints (GTK_WINDOW (window), (GtkWidget *) NULL,
                                       &hints,
                                       (GdkWindowHints) (GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE));
}

int main(int argc, char * argv[])
{
    gtk_init(&argc, &argv);
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    signal_connect_id_cb_dialog_size_allocate =
       g_signal_connect (G_OBJECT (state->dialog),
                         "size-allocate",
                         G_CALLBACK (cb_dialog_size_allocate),
                         (gpointer) NULL /* user_data */);

    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}
0 голосов
/ 14 января 2015

Вот моя реализация в GTK #

public static void SetFixedDimensions (
    Window window, bool vertical, bool horizontal)
{
    int width, height;
    window.GetSize(out width, out height);

    var hintGeometry = new Gdk.Geometry();

    hintGeometry.MaxHeight = vertical ? height : Int32.MaxValue;
    hintGeometry.MinHeight = vertical ? height : 0;

    hintGeometry.MaxWidth = horizontal ? width : Int32.MaxValue;
    hintGeometry.MinWidth = horizontal ? width : 0;

    window.SetGeometryHints(window, hintGeometry, Gdk.WindowHints.MaxSize);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...