Прокрутка очень большой GtkDrawingArea

у меня есть GtkDrawingArea это используется для визуализации данных.
В зависимости от базы данных и пользовательского ввода рисунок может стать очень большим (больше максимально допустимого GtkDrawingArea размер). Поэтому я хотел бы использовать область рисования, которая равна размеру текущего окна, и обновлять ее вручную при прокрутке.

Если я использую метод ScrolledWindow + Viewport для добавления полос прокрутки в область рисования, это, очевидно, не работает, поскольку область рисования недостаточно велика, чтобы требовать полосы прокрутки.

Есть ли способ, которым я могу обмануть область просмотра, думая, что базовый виджет больше, чем он есть на самом деле?
Если нет, то какой будет лучший способ решить эту проблему?

Примечание: я использую Gtk2, и переключение на Gtk3 невозможно.

5

Решение

Вы должны подкласс GtkDrawingArea и переопределить set_scroll_adjustments сигнал. GtkWidget документы

В этом сигнале вы получите настройки для прокручиваемого окна. Несколько лет назад я написал некоторый код, на который вы можете посмотреть, как его реализовать.

Код MarlinSampleView

Этот код мог притворяться, что виджет имел миллионы пикселей в ширину, хотя на самом деле он был не больше окна.

2

Другие решения

Это оказалось довольно просто:

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 получает событие прокрутки
а так и двигает изображение 🙁

0

По вопросам рекламы [email protected]