MFC Jpg darstellen



  • hallo

    so ich habe es jetzt mit Hilfe von Spacelord (http://www.fun-soft.de/showtopic.php?threadid=8621) hingekriegt, dass ein jpg in meinem Dialog anzgezeigt wird. Allerdings gibt es noch ein paar Problemchen:

    1. Das Bild erschein nur ganz kurz. Es flackert nur auf. Wie kriege ich es hin, dass es stehen bleibt???

    2. das Bild ist nicht an die Größe des Fensters angepasst. Es wird, so wie ich das so kurz erkennen kann, abgeschnitten, damit es passt...... Wie bekomme ich hin, dass das Bild in meinen Frame passt?

    Vielen dank
    Eva



  • Hmm... ich hab mir ne Klasse geschrieben die mir die meisten Formate läd die ich haben will und acuh die Größe anpasst.. naja...

    auf jedenfall... wann rufst du denn bitte sehr ShowPicture auf?! Solltest de in der OnPaint und nicht in der OnInitDialog tuen 😉



  • hmm stimmt. das rufe ich nicht wirklich irgendwo auf. Wo soll das denn hin und wie sieht das dann aus???



  • UUUps....

    Bitte meinen Thread von eben ignorieren!

    Ich habe alles hintereinander in einer Klasse die sich onOpen() nennt... Nix mit Show Picture....

    Zuerst hole ich mit mittels CFileDialog dlg meine Pfad.

    mein Pfad kommt als m_path rein:

    CFile f;
    	if (!f.Open(m_path,CFile::modeRead))
    		cout << "kann nicht gelesen werden" << endl;
    	else
    	{
    		CArchive ar (&f,CArchive::load|CArchive::bNoFlushOnDelete);
    		CArchiveStream arStream (&ar);
    		IStream* pIStr = &arStream;
    		if (pIPic)
    			pIPic->Release();
    		HRESULT hr = OleLoadPicture(pIStr,0,FALSE,IID_IPicture,(LPVOID*) &pIPic); 
    
    	}f.Close();
    
    CDC* theDC = m_Bild.GetDC();
    HDC hDC = theDC->GetSafeHdc();
    long hmWeite;
    long hmHoehe;
    CRect zeichenflaeche(0,0,0,0);
    pIPic->get_Width(&hmWeite);
    pIPic->get_Height(&hmHoehe);
    
    m_Bild.GetClientRect(&zeichenflaeche);
    pIPic->Render(hDC,zeichenflaeche.left,zeichenflaeche.top, zeichenflaeche.Width(), zeichenflaeche.Height(),0, hmHoehe,hmWeite,-hmHoehe,NULL);
    

    und wie gesagt... er zeigt das Bild nur ganz kurz an!



  • Das ist doch echt seltsam...

    Im Internet finde ich nichts darüber. Ihr seid meine letzte Hoffnung!!!!



  • Hast du das von Devil überprüft?
    Ich vermute auch, dass es übermalt wird.



  • Das ganze Zeug muss in die Funktion OnPaint des Dialogfelds rein.



  • Und wohin schreibe ich das in OnPaint???



  • Ganz unten? 😕



  • Ich frage deshalb, weil ich in der Funktion onPaint bisher habe:

    if(isIconic())
    {
    CPaintDC dc(this);
    SendMessage(WM............
    
    ...
    }
    else
    {
    
    CDialog::OnPaint();
    }
    

    und da soll ich jetzt meinen Code drahängen?

    Problem ist nur, dass ich das bisher in OnOpen habe , wo auch der Dialog zum öffnen aufgerufen wird.
    Ruf ich dann da OnPaint auf???



  • Pack das Zeichnen in die else.
    OnPaint wird automatisch aufgerufen. 😉



  • pk hab ich gemacht und jetzt hat er

    1. eine Assert geworfen bei f.Close und
    2. kommt er mit dem pIPic->get_Width(&hmWeite) nicht zurecht Zugriffsbehandlung

    Also von der Logik. ich habe doch nohc kein Bild ausgewählt... Wie soll der das dann jetzt schon darstellen?



  • BMPJPG schrieb:

    Also von der Logik. ich habe doch nohc kein Bild ausgewählt... Wie soll der das dann jetzt schon darstellen?

    Sorry, ich hab mich nicht genau reingelesen - ich dachte, du zeichnest nur.

    Kannst du das abfragen, ob du schon ein Bild gewält hast?
    Z.B. drumherum ein

    if (!m_path.IsEmpty())
    {
    //...
    }
    


  • Super es stellt das ausgewählte Bild dar.
    Aber noch 2 Probleme:

    1. Wenn ich ein Bild auswähle stellt er es nicht dar, erst, wenn ich nochmal eins auswählte stellt er es dar.

    2. Er verzerrt das Bild total. Kann ich da nicht was reinbauen, damit der nicht in die Breite zieht???



  • BMPJPG schrieb:

    1. Wenn ich ein Bild auswähle stellt er es nicht dar, erst, wenn ich nochmal eins auswählte stellt er es dar.

    Ruf nach dem Auswählen mal Invalidate auf oder mach mal ein anderes Fenster vor den Dialog und wieder weg - kannst du es dann sehen?

    Bei 2 weiß ich leider nix, Zeichen ist nicht mein Gebiet. 😞



  • BMPJPG schrieb:

    Er verzerrt das Bild total.

    Vermutlich berechnen zeichenflaeche.Width() und zeichenflaeche.Height() Murks. Möglicherweise durch Vermischung von Pixel/DPI/Zoll oder was auch immer.



  • @estartu:

    ich versteh nicht so ganz was du meinst. Wo soll ich wie invalidate aufrufen?

    @isabeau:

    wi kann ich das Problem beheben??? Und wieso rechnet der Murks?



  • Vielleicht sollte ich noch dazusagen. dass mein Feld auf dem Dialogffeld eine PictureControl ist. Das Feld kann ich so wie ich will skalieren und das Bild wird dementsprechend dem Feld angepasst!



  • War nur so eine Vermutung... Vielleicht stimmen ja auch get_Width(...) und get_Height(...) nicht richtig. Kannst ja mal statt zeichenflaeche.Width(), zeichenflaeche.Height(), hmHoehe, hmWeite und -hmHoehe feste Zahlen-Werte eintragen und gucken, was passiert. Eine Lösung habe ich jetzt auch nicht. Kann mich nur erinnern, dass manche Funktionen mit Pixeln und andere wieder in Dots oder sonstwas rechnen und dass es so zu Verzerrungen kommen kann, wenn man nicht aufpasst. Ich vermute einfach mal, dass der Fehler irgendwo in der Berechnung der oben genannten Parameter liegt. Vielleicht fehlt ja nur ein Umrechnungsfaktor...
    Also eine ähnliche Problematik wie hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39074.html



  • ich habs soweit hingekriegt.
    Man muss mit if Abfragen, ob es Querformat und dann Hochformat ist:

    Für Querformat:

    pIPic->Render (hDC, 
    zeichenflaeche.left,
    zeichenflaeche.top,
    zeichenflaeche.Width(),
    zeichenflaeche.Width()*hmHoehe/hmWeite,
    0,
    hmHoehe,
    hmWeite,
    -hmHoehe,
    NULL);
    

    ABER: der schreibt die Bilder jetzt immer übereinander. Wie kann ich vor jedem neuen Aufruf das alte Bild löschen???????????????



  • Man man man ... dir ist nicht zu helfen -.-


Anmelden zum Antworten