JPG,GIF in Dialog anzeigen (die lösung) - Ergänzung



  • Hallo !

    Ich habe hier mal eine kleine Ergänzung zu diesem Beitrag aus den FAQ:

    JPG,GIF in Dialog anzeigen (die lösung) - (FAQ?)

    Übrigens:
    ich finde, der Beitrag ist eine tolle Sache !
    Eine klitzekleine Kleinigkeit hat mich aber gestört, und zwar, dass der Pfad zum Bild fest angegeben ist (der hat auch so ein komisches Format...).
    Ich habe mal geforscht und bin zu dieser Lösung gekommen:

    #include <afxpriv.h>  // NEU: wird von USES_CONVERSION; und T2COLE(...); benötigt
    
    void CBildDlg::OnOk()
    {
        CString cPfadUndDatei = "C:\Test\Bild.jpg";   // Pfad ist jetzt nicht mehr fest in OleLoadPicturePath(...) drin
    
        LPCTSTR pPic = cPfadUndDatei;   // LPCTSTR kann OleLoadPicturePath(...) verarbeiten, CString nicht
    
        USES_CONVERSION;    // neu
    
    //  OleLoadPicturePath(L"C:\Test\Bild.jpg", 0, 0, 0, IID_IPicture,(void **)&m_bild);              // alt
        OleLoadPicturePath(const_cast<LPOLESTR>(T2COLE(pPic)), 0, 0, 0, IID_IPicture,(void **)&m_bild);   // neu
    
        DrawBild(m_bild);
    }
    
    void CBildDlg::DrawBild(IPicture *bild) // hier gibt es keine Änderungen (nur noch mal wegen der Vollständigkeit)
    {
        CClientDC dc(this);
    
        CRect rc;
        GetClientRect(&rc);
    
        OLE_XSIZE_HIMETRIC width;
        OLE_YSIZE_HIMETRIC height;
    
        bild->get_Width(&width);
        bild->get_Height(&height);
    
        int x = 0,
            y = 0,
            size_x = width*96/2540,
            size_y = height*96/2540;
    
        bild->Render(dc, x, y, size_x, size_y, 0, height, width, -height, &rc);
    }
    

    Wenn jemand eine einfachere Lösung hat, den Pfad variabel zu gestalten, würde sie mich natürlich auch interessieren.
    Auf jeden Fall würde ich es prima finden, wenn das auch noch in die FAQ kommt.

    Tschüss

    P.S.:
    warum sollte man hier etwas zeitverzögert starten ? Ich hatte noch keine Probleme ohne Zeitverzögerung...

    [Edit]
    Das hier (wegen der Vollständigkeit 😃 ) natürlich auch nicht vergessen:

    Header:

    #include "afxctl.h"
    .
    .
    .
    IPicture *m_bild;
    void DrawBild(IPicture *bild);
    

    [/Edit]

    [ Dieser Beitrag wurde am 05.08.2002 um 13:07 Uhr von isabeau editiert. ]



  • Es gibt auch ein T2OLE-Makro, damit vereinfacht sich die Zeile

    OleLoadPicturePath(const_cast<LPOLESTR>(T2COLE(pPic)), 0, 0, 0, IID_IPicture, (void **)&m_bild);
    

    zu

    OleLoadPicturePath( T2OLE(pPic), 0, 0, 0, IID_IPicture, (void **)&m_bild);
    


  • Eine Frage hab' ich noch,
    Wie wird das aufgerufen?
    mit DoModal()???
    oder...



  • Original erstellt von isabeau:
    **Hallo !

    Ich habe hier mal eine kleine Ergänzung zu diesem Beitrag aus den FAQ:

    JPG,GIF in Dialog anzeigen (die lösung) - (FAQ?)

    Übrigens:
    ich finde, der Beitrag ist eine tolle Sache !
    Eine klitzekleine Kleinigkeit hat mich aber gestört, und zwar, dass der Pfad zum Bild fest angegeben ist (der hat auch so ein komisches Format...).
    Ich habe mal geforscht und bin zu dieser Lösung gekommen:

    #include <afxpriv.h>  // NEU: wird von USES_CONVERSION; und T2COLE(...); benötigt
    
    void CBildDlg::OnOk()
    {
        CString cPfadUndDatei = "C:\Test\Bild.jpg";   // Pfad ist jetzt nicht mehr fest in OleLoadPicturePath(...) drin
    
        LPCTSTR pPic = cPfadUndDatei;   // LPCTSTR kann OleLoadPicturePath(...) verarbeiten, CString nicht
    
        USES_CONVERSION;    // neu
    
    //  OleLoadPicturePath(L"C:\Test\Bild.jpg", 0, 0, 0, IID_IPicture,(void **)&m_bild);              // alt
        OleLoadPicturePath(const_cast<LPOLESTR>(T2COLE(pPic)), 0, 0, 0, IID_IPicture,(void **)&m_bild);   // neu
    
        DrawBild(m_bild);
    }
    
    void CBildDlg::DrawBild(IPicture *bild) // hier gibt es keine Änderungen (nur noch mal wegen der Vollständigkeit)
    {
        CClientDC dc(this);
       
        CRect rc;
        GetClientRect(&rc);
    
        OLE_XSIZE_HIMETRIC width;
        OLE_YSIZE_HIMETRIC height;
    
        bild->get_Width(&width);
        bild->get_Height(&height);
    
        int x = 0,
            y = 0,
            size_x = width*96/2540,
            size_y = height*96/2540;
    
        bild->Render(dc, x, y, size_x, size_y, 0, height, width, -height, &rc);
    }
    

    Wenn jemand eine einfachere Lösung hat, den Pfad variabel zu gestalten, würde sie mich natürlich auch interessieren.
    Auf jeden Fall würde ich es prima finden, wenn das auch noch in die FAQ kommt.

    Tschüss

    P.S.:
    warum sollte man hier etwas zeitverzögert starten ? Ich hatte noch keine Probleme ohne Zeitverzögerung...

    [Edit]
    Das hier (wegen der Vollständigkeit 😃 ) natürlich auch nicht vergessen:

    Header:

    #include "afxctl.h"
    .
    .
    .
    IPicture *m_bild;
    void DrawBild(IPicture *bild);
    

    [/Edit]

    [ Dieser Beitrag wurde am 05.08.2002 um 13:07 Uhr von [qb]isabeau** editiert. ][/QB]

    Wie kann man das dynamisch machen?
    Ich meine, wenn Bild größer als Dialogfenster ist, passiert bei mir folgendes, das Bild wird abgeschnitten.
    wie kann man das vermeiden?
    Und noch was, wie kann man mehrere Bilder anzeigen lassen mit variabelen Pfad, das wäre richtig gut, wenn man das hinkriegen könnte!!!



  • @Böse:
    Das ist total offtopic und gehört nicht hierher!

    Zu 1.:
    Topic = Resizen von Fenstern

    Zu 2.:
    Topic = Aufrufen einer Funktion in einer Schleife mit auslesen des Pfades aus StringArray



  • @ Kickme:

    Das hier

    void CBildDlg::DrawBild(IPicture *bild)
    {
    ...
    }
    

    ist eine Methode, die man in der entsprechenden Klasse (in diesem Fall heisst sie CBildDlg) hinzufügen muss. Und in meinem Code da oben wird DrawBild(IPicture *bild) in der Methode void CBildDlg::OnOk() aufgerufen, welche bei einem Klick auf den OK-Button ausgeführt wird.
    Wie man das ganze erstellt ist aber in dem FAQ-Beitrag ganz gut beschrieben...

    @ Böse:

    Nochwas zu der Grössenänderung:
    das finde ich dabei ja gerade so toll:
    x und y sind die Koordinaten der linken oberen Ecke vom Darstellungsbereich
    size_x und size_y sind die Koordinaten der rechten unteren Ecke vom Darstellungsbereich
    height und width geben den Bildausschnitt an, der angezeigt werden soll

    Man kann also entweder nur einen Bildausschnitt oder das ganze Bild in jeder beliebigen Grösse darstellen. Einfach mal mit diesen Parametern rumspielen (mal +100 oder /2 dazutun).

    Zum Einpassen auf einen Dialog:
    wenn das Bild kleiner als der Dialog ist -> Bild anzeigen
    ansonsten: Faktor berechnen, um den das Bild verkleinert werden muss -> size_x und size_y neu berechnen -> Bild passt !

    P.S.:
    schönen Dank noch mal an <Razy> 😃



  • Was ist, wenn man mehrere Bilde auf ein mal zeigen will?
    so zB etwa 20 und mehr, wie kann dabei Dialoggröße verändert werden?
    oder kann man da auch scrollen?
    wenn ja wie so was funktioniert?

    noch was, kann man das Bild vor der Aufruf DoModal() ins Dialogfeld kriegen? wie?..

    Danke.



  • @Böse:
    Mmmmhhhhh, eine etwas umfangreiche Frage die du da stellst...
    Ich fürchte ZU umfangreich.

    Nur mal als Denkanstoss:
    2 Bilder zeigen:
    - linkes Bild bis size_x = Dialoggrösse/2
    - zweites Bild ab x = Dialoggrösse/2
    Naja, und dazu eben noch den Streckungsfaktor berechnen und auf Y-Richtung anpassen...



  • Also geht das nicht?

    😕 😕 😕 😕 😕 😕



  • Die Frage noch offen!



  • @Böse

    Zum
    1. sind Deine Fragen total offtopic
    2. hat Isabeau Dir einen Denkanstoß gegeben
    3. bevor ein Auto hergestellt wurde, kann man es nicht fahren, daher ist Deine Frage sinnlos, wie man ein Bild in eine DialogBox VOR DoModal bekommen kann!

    Fang für Deine Fragen ein neues Thema an, dieses schließe ich jetzt, da das Topic abgearbeitet und vollständig ist

    [ Dieser Beitrag wurde am 07.08.2002 um 11:28 Uhr von RenéG editiert. ]


Anmelden zum Antworten