у меня есть GtkDrawingArea
это используется для визуализации данных.
В зависимости от базы данных и пользовательского ввода рисунок может стать очень большим (больше максимально допустимого GtkDrawingArea
размер). Поэтому я хотел бы использовать область рисования, которая равна размеру текущего окна, и обновлять ее вручную при прокрутке.
Если я использую метод ScrolledWindow + Viewport для добавления полос прокрутки в область рисования, это, очевидно, не работает, поскольку область рисования недостаточно велика, чтобы требовать полосы прокрутки.
Есть ли способ, которым я могу обмануть область просмотра, думая, что базовый виджет больше, чем он есть на самом деле?
Если нет, то какой будет лучший способ решить эту проблему?
Примечание: я использую Gtk2, и переключение на Gtk3 невозможно.
Вы должны подкласс GtkDrawingArea
и переопределить set_scroll_adjustments
сигнал. GtkWidget документы
В этом сигнале вы получите настройки для прокручиваемого окна. Несколько лет назад я написал некоторый код, на который вы можете посмотреть, как его реализовать.
Этот код мог притворяться, что виджет имел миллионы пикселей в ширину, хотя на самом деле он был не больше окна.
Это оказалось довольно просто:
GtkScrolledWindow
имеет другой конструктор, который может быть использован для установки GtkAdjustments
что прокручиваемое окно должно использовать.
//These adjustments will be attached to the scrollbars.
prvt->hAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0));
prvt->vAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0));
GtkWidget* scrolledTree = gtk_scrolled_window_new(prvt->hAdjustment, prvt->vAdjustment);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledTree), drawing_area);
Теперь, когда размер чертежа меняется, вам просто нужно изменить GTKAdjustments
смоделировать изменения. Нет необходимости изменять размер области рисования.
gtk_adjustment_set_lower(prvt->hAdjustment, 0);
gtk_adjustment_set_step_increment(prvt->hAdjustment, 1);
gtk_adjustment_set_page_increment(prvt->hAdjustment, 10);
gtk_adjustment_set_upper(prvt->hAdjustment, picture_width);
gtk_adjustment_set_page_size(prvt->hAdjustment, scrollArea_width);
gtk_adjustment_changed(prvt->hAdjustment);
Обратите внимание, что я звоню gtk_adjustment_changed
в конце. Это важно, иначе ScrolledWindow
не будет обновлять полосы прокрутки.
Наконец value_changed
обратный вызов GtkAdjustmens
может использоваться для отлова событий прокрутки и настройки чертежа.
Изменить: это не работает должным образом, потому что GtkScrolledWindow
получает событие прокрутки
а так и двигает изображение 🙁