2010-04-17 3 views
4

Используя GTK, я пытаюсь наложить приглашение «Больше» (но это может быть и любой объект рисования) в углу GtkTextView, содержащемся в GtkScrolledWindow. Я рисую приглашение в обработчике для сигнала expose текстового вида. Он работает, но когда я просматриваю окно, я получаю артефакты: приглашение перемещается вместе с содержимым текстового вида и не стирается.Картина на GtkScrolledWindow или GtkEventBox

Чтобы избавиться от артефактов, я запускаю перерисовку после каждого прокрутки. Это в основном работает, но вы все еще можете видеть подсказку, прыгающую вверх и вниз, когда вы быстро прокручиваете. Есть ли способ предотвратить это? Было бы неплохо, если бы подсказка просто «поплыла» поверх текстового представления.

Я попытался включить прокручиваемое окно в GtkEventBox и нарисовать подсказку поверх этого, но это тоже не сработало; полосы прокрутки и текстовое представление всегда закрашивают подсказку, даже когда вы устанавливаете окно окна события перед своими дочерними окнами.

UPDATE

Если я подключить GtkEventBox «s выставить обратный вызов с g_signal_connect_after(), то она называется после разоблачить обратных вызовов в GtkScrolledWindow и GtkTextView. Однако текстовое представление по-прежнему рисует окно события. Я думаю, это происходит потому, что прокрутка происходит асинхронно. Кто-нибудь понял, как я могу предотвратить перезапись чертежа?

ДРУГОЙ UPDATE

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

+1

Вы уверены, что ваш ответ «GtkEventBox» вызывается после «GtkScrolledWindow»? Несколько printf прояснят сомнения ... – ntd

+0

Хорошая идея; Я протестировал его. См. Редактирование вопроса. – ptomato

ответ

1

Используйте всплывающее окно для подсказки. Это должно избежать всех проблем с прокруткой артефактов.

+0

Я подумал об этом, но если вы переместите главное окно, всплывающее окно останется там, где оно есть. Есть идеи? – ptomato

+0

У меня нет определенного ответа, но я бы попытался подключиться к событию configure для родителя или виджета textview. Также посмотрите на set_transient_for(). – ergosys

+0

Звучит разумно, спасибо! Я все еще не уверен, что это идеальное решение, но опять же, и не то, что у меня есть сейчас ;-) – ptomato