Komponente TStretchImage testen



  • Hi,
    bitte testet meine neue Komponente TStretchImage

    Download (mit Source und Beispielanwendung):

    RAR (221KB)
    ZIP (274KB)
    SFX (266KB)

    TStretchImage ist eine Komponente die Bilder in verschiedenen Zoomstufen anzeigen kann (z.B. Stretch auf Kompo-Größe) und dabei die Seitenverhältnisse des Ursprungsbildes beibehalten kann!

    Bitte testet diese Komponente und postet Verbesserungsvorschläge hier oder schreibt eine Mail an sulfrian@gmx.net!

    Danke

    Alexander Sulfrian



  • ich hab mir den Code nicht angekuckt, sondern nur das Inlcudefile und frage mich, wieso Du float brauchst, um H_ZoomProzent und V_ZoomProzent zu realisieren. Zumindest in Deinem Testprogramm werden nur int-Werte angezeigt?

    Dann hat Deine Komponente noch einen großen, aber gravierenden Schönheitsfehler: wenn man das Testfenster mit einem anderen Fenster überlagert und diese dann wegklickt (schließen oder minimieren), dann zeichnet sich Deine Komponente nicht selber. Genauso ist es, wenn man das Testfenster minimiert und wieder maximiert. Dann sieht man nix von der Komponente. Das darf nicht sein.

    Noch eine Anregung am Schluß: wenn man die Seitenverhältnisse mit der Maus ändert, so flackert das ziemlich heftig...

    Ansonsten find ich das nicht schlecht, was Du gemacht hast!



  • Original erstellt von JFK:
    ich hab mir den Code nicht angekuckt, sondern nur das Inlcudefile und frage mich, wieso Du float brauchst, um H_ZoomProzent und V_ZoomProzent zu realisieren. Zumindest in Deinem Testprogramm werden nur int-Werte angezeigt?

    Hi,
    float wird bei Stretch == true berechnet! Da alles danach aufgrund des Zoomes berechnet wird, wollte es wenigstens genau werden!

    Original erstellt von JFK:
    Dann hat Deine Komponente noch einen großen, aber gravierenden Schönheitsfehler: wenn man das Testfenster mit einem anderen Fenster überlagert und diese dann wegklickt (schließen oder minimieren), dann zeichnet sich Deine Komponente nicht selber. Genauso ist es, wenn man das Testfenster minimiert und wieder maximiert. Dann sieht man nix von der Komponente. Das darf nicht sein.

    Stimmt muss ich noch ändern! Ich dachte eigentlich TGraphicControl::Paint wäre das gleiche als wenn ich WM_PAINT abfange, aber das stimmt wohl nicht! Also muss ich doch WM_PAINT abfangen!

    Original erstellt von JFK:
    Noch eine Anregung am Schluß: wenn man die Seitenverhältnisse mit der Maus ändert, so flackert das ziemlich heftig...

    Ja hab ich auch schon bemerkt! Hab allerdings keinen Lösungsansatz! Vorschläge sind immer gut?

    Original erstellt von JFK:
    Ansonsten find ich das nicht schlecht, was Du gemacht hast!

    Danke

    Alexander Sulfrian

    [ Dieser Beitrag wurde am 06.07.2003 um 11:11 Uhr von Alexander Sulfrian editiert. ]



  • Das mit Genauigkeit ist immer so eine Sache. Ich denke, wenn Du mit int arbeitest, wird es genau genug sein. Insbesondere bei der recht einfachen Berechnung.

    Zu dem Flackern gibts in der FAQ was über DoubleBuffering.

    Das mit dem Neuzeichnen weiß ich nicht richtig. Hast Du die Paint Methode überschrieben? Falls nicht, wird ja Paint der Elternklasse verwendet und dann kommst Du mit Deiner Zeichnerei nicht zum Zuge. Das Abfangen von WM_PAINT müßte in diesen Fällen dann nicht notwendig sein.



  • lässt sich nicht kompilieren! unit <userpicture.h> fehlt!

    warum ist die komponente von TGraphicControl abgeleitet, wenn ehh nur ein Image dargestellt wird?

    • für neuzeichnen reicht ein aufruf von Invalidate bzw. InvalidateRect völlig aus.
    • wenn du mit gleitkomma-werten rechnest, solltest du alle elemente der gleichung ebenfalls als gleitkomma-wert betrachten
    • in Set-Funktionen am besten im prüfen, ob der wert sich geändert hat, sonst kommt es zu unnötigen aufrufen.


  • Original erstellt von Sunday:
    lässt sich nicht kompilieren! unit <userpicture.h> fehlt!

    Hi,
    hab ich auch schon bemerkt! Neue Versionen sind oben!

    Original erstellt von Sunday:
    warum ist die komponente von TGraphicControl abgeleitet, wenn ehh nur ein Image dargestellt wird?

    erst wollte ich die Kompo von TImage ableiten! Hat aber zu viel Probs gemacht! StretchDraw verursacht beim TImage einen Hintergrung!

    Original erstellt von Sunday:
    **

    • für neuzeichnen reicht ein aufruf von Invalidate bzw. InvalidateRect völlig aus.
    • wenn du mit gleitkomma-werten rechnest, solltest du alle elemente der gleichung ebenfalls als gleitkomma-wert betrachten
    • in Set-Funktionen am besten im prüfen, ob der wert sich geändert hat, sonst kommt es zu unnötigen aufrufen.

    **

    Gut werde es mal mit Inavalidate versuchen!

    Danke

    Alexander Sulfrian



  • HI,
    wie meintest du das mit Invalidate bzw. InvalidateRect? Ich bekomme das einfach nicht hin? Soll ich einfach das Repaint damit ersetzen, oder wie?

    Danke

    Alexander Sulfrian



  • Interessante Kompo!

    Deine Methode

    void __fastcall TStretchImage::PictureChange(TObject *Sender)

    wird 3 / 6 x pro Groessenaenderung gerufen! ???
    Daher das Flackern!

    Sonst funzt das gut!

    PS:
    Kannst mal im Forum suchen nach: ImageScroller.
    Hab' da mal ne Klasse gepostet fuer zoombare Anzeige in Scrollbox! (fuer Gormez / Omega-X)



  • hallo,

    wenn du die "kinderkrankheiten" in den griff bekommst wirklich ne sinnvolle sache die dann auch eingesetzt wird!

    mfg
    murph



  • Original erstellt von DerAltenburger:
    *Deine Methode
    void __fastcall TStretchImage::PictureChange(TObject Sender)
    wird 3 / 6 x pro Groessenaenderung gerufen! ???
    Daher das Flackern!

    Hi,
    ne Idee wie ich das verändern bzw. beheben könnte?

    Original erstellt von DerAltenburger:
    PS:
    Kannst mal im Forum suchen nach: ImageScroller.
    Hab' da mal ne Klasse gepostet fuer zoombare Anzeige in Scrollbox! (fuer Gormez / Omega-X)

    Ich kenn die Klasse schon! Hab Thread mitverfolgt!

    Danke

    Alexander Sulfrian



  • statt:

    void __fastcall TStretchImage::SetCenter(bool value)
    {
     // zentrieren setzen
     FCenter = value;
    
     // Bild neuzeichen
     PictureChange(this);
    }
    

    lieber:

    void __fastcall TStretchImage::SetCenter(bool value)
    {
      if (FCenter != value)
      {
        // zentrieren setzen
        FCenter = value;
        Invalidate();
      }
    }
    

    durch Invalidate() wird das steuerelement neu gezeichnet, sprich die Paint()-Methode aufgerufen. ferner solltest du nicht das eigens erzeugte ereignis OnChange in der eigenen komponente benutzen, dann hast du auch keine probleme mit rekursiven aufrufen, die du so abfangen musst!



  • Original erstellt von Alexander Sulfrian:
    **
    Original erstellt von DerAltenburger:
    Deine Methode
    void __fastcall TStretchImage::PictureChange(TObject *Sender)
    wird 3 / 6 x pro Groessenaenderung gerufen! ???
    Daher das Flackern!

    Hi,
    ne Idee wie ich das verändern bzw. beheben könnte?

    **

    Jo, noch interessiert?



  • Original erstellt von DerAltenburger:
    Jo, noch interessiert?

    Hi,
    nein!
    War im Urlaub und konnte leider erst heute den Vorschlag von Sunday ausprobieren!

    Das Ergebnis ist überraschend!

    Neue Version der Komponente ist oben!

    Hoffe sie gefällt auch!

    MFG

    Alexander Sulfrian

    PS: Kein Flimmern, kein Verschwinden! Nur ein bisschen langsam!


Anmelden zum Antworten