JPG Bilder -> CPictureEx ->andere Größe anzeigen?



  • Hi!

    Ich möchte eine Vorschau von verschiedenen Bildern in einem vordefinierten Feld anzeigen. Die Klasse CPictureEx scheint mir deshalb das einfachste und passenste zu sein. Aber ich schaffe es nicht, die Größe passend zu skalieren, oder mache ich da was falsch? Es wird immer das Bild in Orginalgröße angezeigt.

    Hat jemand Erfahrungen gemacht?

    Gruß Ronny.



  • Ich hab das glaub mal mit der Klasse hinbekommen, vielleicht find ich den Code noch ...



  • Sorry, hab die Klasse ist zu arg verändert worden von mir, ich weiss garnicht mehr, was original und was von mir ist.



  • Das Problem hatte ich auch. Du musst lediglich in der Funktion BOOL CPictureEx::Draw() zwei Einträge bei Render ändern (Ich habe sie mal mit GRÖSSEX und GRÖSSEY bezeichnet):

    BOOL CPictureEx::Draw()
    {
    [....hier steht alles mögliche...]
      if (m_pPicture)
      {
        long hmWidth;
        long hmHeight;
        m_pPicture->get_Width(&hmWidth);
        m_pPicture->get_Height(&hmHeight);
        if (m_pPicture->Render(m_hMemDC, 0, 0, GRÖSSEX, GRÖSSEY, 0, hmHeight, hmWidth, -hmHeight, NULL) == S_OK)
        {
          Invalidate(FALSE);
          return TRUE;
        };
       };
      };
      return FALSE;   
    }
    

    P.S.: Der Smilie steht für einen Doppelpunkt gefolgt von einem D

    [ Dieser Beitrag wurde am 16.03.2003 um 18:06 Uhr von Lord Hessia editiert. ]



  • Danke für die Antworten. Zu Lord Hessia: Deinen Code hatbe ich eingegeben.

    if (m_pPicture->Render(m_hMemDC, 0, 0, GRÖSSEX, GRÖSSEY, 0, hmHeight, hmWidth, -hmHeight, NULL) == S_OK)
    

    Dummerweise zeichnet er mir trotzdem einen schwarzen Rand nach rechts und nach unten auf die Größe des Orginalbildes.



  • Ich habe jetzt endlich eine Lösung gefunden. Mein Problem mit den Strichen: mein CStatic-Feld hatte eine Umrandung. Ohne Rand - kein Problem mit dem Bild. Aber mit Rand, wurde der Rand immer so groß, wie das Originalbild angezeigt. Das ergab dann die hässlichen Streifen. Also modifizierte ich die Datei folgendermaßen:

    Neue Variablen in .h eingefügt: SIZE newsize; und int m_align;
    Neue Function in .h eingefügt: void SetNewSize(int cx, int cy)
    Function geändert: BOOL CPictureEx::Draw(int align)

    //**************************************************************
    //******* Neue Function soll die maximale Größe speichern ******
    
    void CPictureEx::SetNewSize(int cx, int cy)
    {
        if (cx>0 && cy>0) { newsize.cx=cx; newsize.cy=cy; }
    }
    
    //***************************************************************
    //** Function so modifizieren das die max Größe berechnet wird **
    
    BOOL CPictureEx::Draw(int align)
    {
        m_align=align; // Ausrichtung festlegen (0 für keine)
        ...
        if (IsAnimatedGIF())
        {
            ...
        } 
        else
        {
            if (m_pPicture)
            {
                long hmWidth;
                long hmHeight;
                m_pPicture->get_Width(&hmWidth);
                m_pPicture->get_Height(&hmHeight);
    
                int maxx=newsize.cx-2;  //Breite des Fensters
                int maxy=newsize.cy-2;  //Höhe des Fensters
    //************* NEU ****
                if (maxx>0 && maxy>0) {
                    int i1,i2,i3,i4,sizex,sizey;
                    if (hmWidth>maxx) {
                        i1=(maxx*hmHeight/hmWidth);
                        i2=(maxy*hmWidth/hmHeight);
                        if (i1>maxy) { maxx=i2; }
                        else { maxy=i1; }
                    }
                    m_PictureSize.cx=maxx;
                    m_PictureSize.cy=maxy;
                    if (m_pPicture->Render(m_hMemDC, 0, 0, maxx, maxy, 0, hmHeight, hmWidth, -hmHeight, NULL) == S_OK) {
                        Invalidate(FALSE);
                        return TRUE;
                    }
                }
                else if (m_pPicture->Render(m_hMemDC, 0, 0, m_PictureSize.cx, m_PictureSize.cy, 0, hmHeight, hmWidth, -hmHeight, NULL) == S_OK)  {
                    Invalidate(FALSE);
                    return TRUE;
                }
            }
        }
        return FALSE;   
    }
    
    //**************************************************************
    //*** und Position in OnPaint übergeben ************************
    
    void CPictureEx::OnPaint() 
    {
        int posx=0;
        int posy=0;
        if (m_align==1) {
            posx=(newsize.cx-m_PictureSize.cx-2)/2;
            posy=(newsize.cy-m_PictureSize.cy-2)/2;
        }
        else if (m_align==2) {
            posx=(newsize.cx-m_PictureSize.cx-2);
            posy=(newsize.cy-m_PictureSize.cy-2)/2;
        }
        CPaintDC dc(this); // device context for painting
    
        LONG nPaintWidth = m_PaintRect.right-m_PaintRect.left;
    
        if (nPaintWidth > 0)
        {
            LONG nPaintHeight = m_PaintRect.bottom - m_PaintRect.top;
            ::BitBlt(dc.m_hDC, 0, 0, nPaintWidth, nPaintHeight, m_hMemDC, m_PaintRect.left, m_PaintRect.top, SRCCOPY);
        }
        else {
            ::BitBlt(dc.m_hDC, posx, posy, m_PictureSize.cx, m_PictureSize.cy,m_hMemDC, 0, 0, SRCCOPY);
        };
    }
    

    Wichtig dann beim laden: Erst Größe angeben, dann Datei laden, dann wird auch ein Rand angezeigt.

    m_bild.SetNewSize(250,120);  //* Bildgröße
        m_bild.Load("k.jpg");        //* Datei
        m_bild.Draw(1);              //* Zentriert
    

    Vielleicht kann es ja jemand mal gebrauchen!

    Gruß Ronny

    [ Dieser Beitrag wurde am 17.03.2003 um 08:39 Uhr von hronny editiert. ]



  • 😕 m_hMemDC 😕

    Ziemlich unsauber, 1. Deine OnPaint-Funktion und 2. der zwischengespeicherte MemDC.
    Was passiert wohl, wenn dem User einfällt, während das Programm läuft, die Bittiefe zu ändern?



  • 1. Ich weis nicht wie es besser geht. Dachte dafür ist dieses Forum da.

    2. Dies ist der OrginalCode + ein paar andere Zeilen

    3. Wie geht es besser?
    😮


Anmelden zum Antworten