2013-03-14 11 views
5

Ho un GtkDrawingArea che viene utilizzato per visualizzare i dati. A seconda del database e dell'input dell'utente, il disegno può diventare molto grande (dimensioni maggiori della dimensione massima consentita di GtkDrawingArea). Pertanto vorrei utilizzare un'area di disegno grande quanto la finestra corrente e aggiornarla manualmente durante lo scorrimento.Scorrere un GtkDrawingArea molto grande

Se utilizzo il metodo ScrolledWindow + Viewport per aggiungere barre di scorrimento nell'area di disegno, ovviamente non funziona perché l'area di disegno non è abbastanza grande da richiedere barre di scorrimento.

Esiste un modo per indurre il viewport a pensare che il widget sottostante sia più grande di quello che è in realtà? Se no quale sarebbe il modo migliore per risolvere questo problema?

Nota: sto utilizzando Gtk2 e il passaggio a Gtk3 non è possibile.

risposta

2

È necessario sottoclasse GtkDrawingArea e ignorare il segnale set_scroll_adjustmentsGtkWidget docs

In questo segnale. Otterrai le regolazioni per la finestra a scorrimento.Pochi anni fa ho scritto un codice che puoi vedere per vedere come implementarlo

MarlinSampleView code

Questo codice era in grado di fingere che il widget fosse largo milioni di pixel quando in realtà non era più grande della finestra.

0

si è rivelato essere abbastanza semplice:

Il GtkScrolledWindow ha un altro costruttore, che può essere utilizzato per impostare il GtkAdjustments che la finestra a scorrimento dovrebbe usare.

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

Ora, ogni volta che le dimensioni del disegno cambia è sufficiente modificare il GTKAdjustments per simulare il cambiamento. Non è necessario ridimensionare effettivamente l'area di disegno.

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

Si noti che io chiamo gtk_adjustment_changed alla fine. Questo è importante, altrimenti lo ScrolledWindow non aggiornerà le barre di scorrimento.

Finalmente la richiamata value_changed dello GtkAdjustmens può essere utilizzata per catturare gli eventi di scorrimento e regolare il disegno.

Edit: Questo non funziona correttamente in quanto il GtkScrolledWindow riceve l'evento di scorrimento come bene e si muove l'immagine :(

Problemi correlati