Bild (Jpg oder gif) in Dialog anzeigen.



  • Hallo!

    Ich würde gerne ein Bild von der Festplatte laden und in einem Dialog anzeigen können.
    Ich habe mich eben schon durch Codeproject gekämpft, aber die Suche dort meint es nicht gut mit mir und die Suche hier zickt auch noch, der Index ist wohl noch nicht fertig. 😞



  • DAzu ist hier schon einiges gewesen...quäl sich suche mal mit *jpg* oder *gif*. da findest du meißt mwhe als nur mit den schlagworten



  • Uruk-h4j schrieb:

    DAzu ist hier schon einiges gewesen...quäl sich suche mal mit *jpg* oder *gif*. da findest du meißt mwhe als nur mit den schlagworten

    Bevor du sowas vorschlägst, solltest du gucken obs auch was rauswirft - oder meinen Text komplett lesen. 😉
    Gestern ist die Datenbank umgezogen, die Suche ist noch ohne Funktion. 😞



  • also bei mir ging die suche vorhin schon....

    Edit:
    Hmm... vielleicht hilft dir das hier (?):
    http://www.coding-help.de/bild.html





  • Super, dankeschön ihr beiden. 🙂

    isabeau, da haste mich ja eiskalt erwischt. 😉



  • hihi *händereib* 🤡



  • So, ich habs heute endlich geschafft, mich dranzusetzen. 🙂
    Ich versuche das da: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39074.html

    Leider kriege ich es nicht so ganz hin, da ich den Pfad dynamisch machen will.

    OleLoadPicturePath(m_strBildPfad, 0, 0, 0, IID_IPicture,(void **)&m_bild);
    

    m_strBildPfad ist ein CString.

    Da bekomme ich die Meldung:

    error C2664: 'OleLoadPicturePath' : Konvertierung des Parameters 1 von 'class CString' in 'unsigned short *' nicht moeglich
    Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden

    Ich habe es nun schon mit

    OleLoadPicturePath(m_strBildPfad.GetBuffer(256), 0, 0, 0, IID_IPicture,(void **)&m_bild);
    

    Das gibt:

    error C2664: 'OleLoadPicturePath' : Konvertierung des Parameters 1 von 'char *' in 'unsigned short *' nicht moeglich
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Dieses L, was in der FAQ steht, funktioniert da irgendwie nicht.

    Ich habe es nun mit

    OleLoadPicturePath((unsigned short *)m_strBildPfad.GetBuffer(256), 0, 0, 0, IID_IPicture,(void **)&m_bild);
    

    versucht, das kompiliert und startet - aber ich sehe nix auf dem Dialog. 😞
    Ich vermute mal, das war der falsche Cast.

    Wie geht es richtig? 😕
    Außerdem wäre interessant, wie ich die Größe des geladenen Bildes rausfinde um den Dialog anzupassen.



  • Wollte damals keiner in der FAQ ergänzen... 😞
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-1478.html

    [edit]
    ...und das hier solltest du auch nicht vergessen, das fehlt bei dem Kram da oben wohl noch...
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-164939.html
    [/edit]

    :xmas2: :xmas2: :xmas2: :xmas2: :xmas2: :xmas2: :xmas1:



  • Ich häng einen der beiden Beiträge an, wenn ich das hingekriegt habe. 😉

    Leider kriege ich noch Fehler:

    error C2065: 'USES_CONVERSION' : nichtdeklarierter Bezeichner
    error C2065: 'T2OLE' : nichtdeklarierter Bezeichner

    Deine Originallösung gab sogar noch einem Fehler mehr. 😞

    ...oh ein Edit, ich les mal...
    Hmm, wo muss das

    m_bild->Release();
    

    im Dialog hin? 😕



  • Okay, einen hab ich gefunden:

    #include "atlconv.h"
    


  • Hast du die Zeile übersehen ?

    #include <afxpriv.h>  // NEU: wird von USES_CONVERSION; und T2COLE(...); benötigt
    

    [edit] Das mit dem Release() war hier kürzlich Thema, habe ich mir nur gemerkt, aber nie umgesetzt. Da weiss ich auch nicht mehr... [/edit]

    [edit2] atlconv.h ist mir übrigens komplett neu... [/edit2]



  • Oh danke, die Zeile habe ich trotz mehrfachem Lesen tatsächlich übersehen.

    Leider sehe ich noch immer kein Bild.
    Es ist ein jpg, ich habe den totalen Pfad angegeben... was kann das noch sein? 😞

    void CZeigeBildDlg::DrawBild(IPicture *bild)
    {
       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); 
    }	
    
    BOOL CZeigeBildDlg::OnInitDialog() 
    {
    	CBasisDlg::OnInitDialog();
    
        LPCTSTR pPic = m_strBildPfad;   // LPCTSTR kann OleLoadPicturePath(...) verarbeiten, CString nicht
        USES_CONVERSION;    // neu
    
    	OleLoadPicturePath(const_cast<LPOLESTR>(T2COLE(pPic)), 0, 0, 0, IID_IPicture,(void **)&m_bild);	
    	DrawBild(m_bild); 
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
    }
    

    Edit: Also es das Problem scheint in DrawBild zu sein.
    Ich habe jetzt mit

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

    abgefragt, ob das Laden geklappt hat - das klappt. 😕

    Edit2:
    Am Render scheint es auch nicht zu liegen, das hier bleibt still:

    VERIFY(S_OK == bild->Render(dc, x, y, size_x, size_y, 0, height, width, -height, &rc));
    

    Wo kann ich noch suchen? 😕



  • Erstell dir doch mal einen Button und schreib in das entsprechende Event
    OnInitDialog();

    [edit]...nicht, dass ich das für die Lösung halte... Es zeigt nur das Problem. [/edit]



  • Grrr, OnInitDialog wäre so eine parktische Funktion...
    Alles klar, mit LButtonDown geht es, da muss ich nochmal grübeln.

    Vielleicht blende ich das Bild auch einfach nur über den View, bis man die Maus bewegt... 🙂



  • Juchuuu, das funktioniert! 👍

    Und aufgeräumt wird beim MouseMove:

    void CMyView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    	if (m_fBildAktiv)
    	{
    		OLE_XSIZE_HIMETRIC width;
    		OLE_YSIZE_HIMETRIC height;
    		m_bild->get_Width(&width);
    		m_bild->get_Height(&height);
    		CRect rectBild(0, 0, width, height);
    		m_bild->Release();
    		InvalidateRect(&rectBild);
    		m_fBildAktiv = false;
    	}
    
    	CFormView::OnMouseMove(nFlags, point);
    }
    

    m_fBildAktiv ist ein einfacher bool, den ich in DrawBild so setze:

    m_fBildAktiv = (S_OK == bild->Render(dc, x, y, size_x, size_y, 0, height, width, -height, &rc));
    

    Ist noch nicht das Nonplusultra, da es etwas flackert - aber schon super genug. :xmas1:


Anmelden zum Antworten