gelöst: Anzeigegröße eines GtkScrollWindows



  • Lösung siehe weiter unten.
    -------------------------------

    Salve!

    Vielleicht kann mir jemand bei folgender Frage weiterhelfen.
    Ich habe eine Bitmap, sagen wir 500x400 Pixel in einem GtkScrolledWindow eingepackt.
    Das klappt soweit auch sehr gut. Ich benötige nun aber die Information, wie groß der sichtbare Bereich des GtkScrolledWindow ist.

    Vielleicht zur Verdeutlichung meines Problems: Wie finde ich heraus, wie groß der rot markierte Bereiche in folgenden Fenster ist.
    http://sascha.atrops.com/20060529_Fdv.png

    Das Auslesen der PageSize aus den Scrollbars kommt nicht in Frage, da ich diese später verändern muss und dementsprechend dann nicht mehr auslesen könnte.
    Ich brauche also etwas, mit dem ich aus dem ScrolledWindow die Größe der aktuellen Darstellung herausbekomme.

    Mit gtk_widget_get_size() erhalte ich auf die GtkDrawingArea korrekte Werte, z.B. 500:400.
    Nehme ich mir das Parent von GtkDrawingArea vor, was das ScrollWindow sein sollte, so sind die Werte 4 Pixel größer als die DrawingArea: 504:404.
    Dabei ist das ScrolledWindow deutlich größer (oder wie auf dem Bild deutlich kleiner) als die darinliegende DrawingArea.
    Frage ich nun nach dem übergeordneten Element, was das ChildElement der HBox darstellen sollte, so erhalte ich eine Größe von 70:70 - grundsätzlich.
    Unter der wahrscheinlichen Annahme, dass das GtkScrolledWindow einen weiteren Container enthält, um die Scrollbars unterzubringen, so erhalte
    ich grundsätzlich die Größe 140:132, die ebenfalls konstant bleibt, wenn ich die Fenstergröße ändere.

    Ist jemand eine Lösung bekannt, wie man die gesuchten Werte erhält?

    Ich wäre für jeden Tipp dankbar.

    Vielen Dank!



  • Hi,

    ist der sichtbare Bereich von der Breite her immer gleich und ändert sich nur die Höhe oder wie???



  • Als Idee fällt mir nur ein:

    Mach mal das Fenster genau so groß das das ScrolledWindow 100% reinpasst.
    Dann frage die HÖHE des "Main-Windows" ab, also von deinem Gesamten Programm.

    Sagen wir mal da kommt jetzt 700 raus und dein ScrolledWindow ist ja 500 hoch. Dann beträgt die Differenz ja 200.

    Wenn du nun dein Programm kleiner ziehst, schrumpft ja beispielsweise die 700 auf 400, dann muss ja die aktuell sichtbare Höhe von deinen ScrolledWindow 200 sein.

    Ich hoffe mal ich habs richtig verstanden.
    👍



  • Freak_Coder schrieb:

    Hi,

    ist der sichtbare Bereich von der Breite her immer gleich und ändert sich nur die Höhe oder wie???

    Die Scrolledbox ändert sich nach belieben, wenn man das Fenster in Größe ändert, verändert sich das ScrolledWindow und füllt den kompletten Bereich aus.

    Ich muss wissen, wie groß das ScrolledWindow ist, da ich zum Arbeiten eine DrawingArea dahinter legen muss, die mindestens so groß ist wie das ScrolledWindow, aber eventuell auch größer ist als der sichtbare Bereich. Um die DrawingArea zu generieren, muss ich wissen, ob ich die DrawingArea entsprechend des ScrolledWindow vergrößern muss.

    Freak_Coder schrieb:

    Als Idee fällt mir nur ein:

    Mach mal das Fenster genau so groß das das ScrolledWindow 100% reinpasst.

    Wann weiß ich, dass die Bitmap vollständig reinpasst - dafür müsste ich ja wissen, wie groß das ScrolledWindow ist und genau das ist mein Problem!?



  • hem, die Gtk+ FAQ hat auch nichts ergeben. Hab gestern auch noch rumprobiert, hab aber keine vernünftige Lösung gefunden 😞
    Ich schätze du musst mal über die Mailing list ran: http://www.gtk.org/mailinglists.html



  • GPC schrieb:

    hem, die Gtk+ FAQ hat auch nichts ergeben. Hab gestern auch noch rumprobiert, hab aber keine vernünftige Lösung gefunden 😞
    Ich schätze du musst mal über die Mailing list ran: http://www.gtk.org/mailinglists.html

    Hehe, ich habe mich mal in der gtkmm-Mailingliste umgesehen, aber auch noch nichts brauchbares gefunden 😃

    Wenn ich nachher zuhause bin werde ich es mal selber testen.

    Falls ich es richtig verstanden habe willst du ja dieses Verhalten erziehlen ?:

    Du hast ein ScrolledWindow. In diesem Window ist eine DrawingArea.
    Und da man ja die Fenstergröße des Programms ändern kann, ändert sich ja die Größe des ScrolledWindows, aber nicht die der DrawingArea.

    Also suchst du ne Methode um die DrawingArea dementsprechen zu verkleinern...

    All right ? 😃

    ::=> Bin heute bissl Konfus und peile momentan nicht viel 😮
    (Ist das Wetter schuld 😃 😃 )



  • Freak_Coder schrieb:

    Falls ich es richtig verstanden habe willst du ja dieses Verhalten erziehlen ?:

    Du hast ein ScrolledWindow. In diesem Window ist eine DrawingArea.
    Und da man ja die Fenstergröße des Programms ändern kann, ändert sich ja die Größe des ScrolledWindows, aber nicht die der DrawingArea.

    Also suchst du ne Methode um die DrawingArea dementsprechen zu verkleinern...

    All right ? 😃

    ::=> Bin heute bissl Konfus und peile momentan nicht viel 😮
    (Ist das Wetter schuld 😃 😃 )

    Nopes... nicht ganz...

    Wenn ich das Fenster vergrößere, so ist die DrawingArea kleiner als das ScrolledWindow. Das ScrolledWindow soll immer vollständig mit einer DrawingArea ausgefüllt sein.
    Ist die anzuzeigende Bitmap größer, soll das ScrolledWindow wirken. Die DrawingArea ist also mindestens so groß wie das ScrolledWindow, mindestens so groß, wie die Bitmap.
    Ich muss wissen, wie groß das ScrolledWindow ist.



  • Komischerweise antworte ich auf meine Fragen immer selber 😉
    Egal, so hat vielleicht jemand anderer auch noch was davon.

    Das Problem lag wie immer daran, dass ich nicht richtig nachdachte. Ich wollte die Größe eines Gtk-Widgets herausfinden, dafür gibt es diverse Funktionen, die ein GtkRequisition zurückgeben.
    Requisition ist auf Deutsch 'Anforderung', 'etwas, was verlangt wird'. Ein ScrolledWindow verlangt aber u.U. weniger als es dargestellt wird. Es handelt sich also um die Größe, die ein Widget nicht unterschreiten kann. Das erklärt auch die merkwürdigen Rückgaben, die ich hatte, wo ein Child-Widget größer war als das Parent-Widget. Die innenliegende Bitmap war so groß wie sie ist, das Scrolled Windows darf kleiner sein.

    Die Frage ist also nicht an die abstrakte Bibliothek Gtk zu stellen, sondern ein Fall für Gdk, die die Widgets konkret zeichnet. Mittels GTK_WIDGET( foobar )->window erhält man das GdkWindow Objekt, dass man mit gdk_window_get_size() nach der tatsächlich gezeichneten Größe fragen kann.

    Problem gelöst. 🙂
    Vielen Dank an diejenigen, die sich mit mir den Kopf zerbrochen haben, besonders an GPC, der mich intensivst mit Links und Codezeilen versorgte. 😉


Anmelden zum Antworten