2013-03-14 2 views
5

J'ai un GtkDrawingArea qui est utilisé pour visualiser les données. En fonction de la base de données et de l'entrée de l'utilisateur, le dessin peut devenir très grand (plus grand que la taille maximale autorisée GtkDrawingArea). Par conséquent, je voudrais utiliser une zone de dessin aussi grande que la fenêtre actuelle et la mettre à jour manuellement lors du défilement.Faire défiler un très grand GtkDrawingArea

Si j'utilise la méthode ScrolledWindow + Viewport pour ajouter des barres de défilement à la zone de dessin, cela ne fonctionne évidemment pas car la zone de dessin n'est pas assez grande pour nécessiter des barres de défilement.

Y at-il un moyen de tromper la fenêtre en pensant que le widget sous-jacent est plus grand qu'il ne l'est en réalité? Sinon, quelle serait la meilleure façon de résoudre ce problème? Note: J'utilise Gtk2 et le passage à Gtk3 n'est pas une possibilité.

Répondre

2

Vous devez sous-classe GtkDrawingArea et passer outre le signal set_scroll_adjustmentsGtkWidget docs

Dans ce signal. vous aurez les ajustements pour la fenêtre défilée.J'ai écrit un code il y a quelques années que vous pouvez regarder pour voir comment l'implémenter

MarlinSampleView code

Ce code pouvait prétendre que le widget avait des millions de pixels de large alors qu'en réalité il n'était pas plus grand que la fenêtre.

0

Il est avéré être assez simple:

Le GtkScrolledWindow a un autre constructeur qui peut être utilisé pour définir la GtkAdjustments que la fenêtre doit utiliser défilement.

//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); 

Maintenant, chaque fois que la taille du dessin que vous avez juste besoin de changer modifier le GTKAdjustments pour simuler le changement. Il n'est pas nécessaire de redimensionner réellement la zone de dessin.

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); 

Notez que j'appelle gtk_adjustment_changed à la fin. Ceci est important, sinon le ScrolledWindow ne mettra pas à jour les barres de défilement. Enfin le value_changed rappel du GtkAdjustmens peut être utilisé pour attraper les événements de défilement et ajuster le dessin.

Edit: Cela ne fonctionne pas correctement, car le GtkScrolledWindow reçoit l'événement de défilement aussi bien et déplace l'image :(

Questions connexes