GDI Plus -> Alpha Blending Problem bei ProcessMessages



  • Hallo,

    ein Bild wird transparent über einem anderen dargestellt. Das läuft alles. Nun will ich das transparente Bild über den Hintergrund scrollen. Wenn ich ProcessMessages einbaue - um die Bewegung sehen zu können - ist mein transparentes Bild an der ersten Position über dem Hintergrund. Nehme ich ProcessMessages raus sehe ich zwar nix während der Schleife, aber wenn die ANzeige wieder sichtbar ist ist mein transparentes Bilöd am rechten Rand. So wie es sein soll.

    Warum funkt mir ProcessMessages dazwischen ? Was gibt es stattdessen ?

    //for (int i = 0; i < 32; i++)
    //{
     String sZW = "Hintergrund.bmp";
     String sZW2 = "Transparent.bmp";
    
     Gdiplus::Graphics graphics(imgAusgabe->Canvas->Handle);
    
     Gdiplus::Image img1(sZW.w_str());
     Gdiplus::Image img2(sZW2.w_str());
    
     Gdiplus::ColorMatrix ClrMatrix = {
    			 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
    			 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
    			 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
    			 0.0f, 0.0f, 0.0f, 0.5f, 0.0f,
    			 0.0f, 0.0f, 0.0f, 0.0f, 1.0f
     };
    
     Gdiplus::ImageAttributes ImgAttr;
    
     ImgAttr.SetColorMatrix(&ClrMatrix, Gdiplus::ColorMatrixFlagsDefault,
    						 Gdiplus::ColorAdjustTypeBitmap);
    
    for (int i = 0; i < 32; i++)
    {
     graphics.DrawImage(&img1, 0,0,561,521);
    
     graphics.DrawImage(
    							 &img2,
    							 Gdiplus::Rect(i * 18, 0, 18, 521),  // dest rect
    							 0, 0, 18, 521,           // source rect
    							 Gdiplus::UnitPixel,
    							 &ImgAttr);
    
     Application->ProcessMessages();
     }
    


  • Hallo

    Innerhalb eines VCL-Events werden keine Windows-Messages verarbeitet, auch nicht die zum Neuzeichnen. Deshalb siehst du ohne ProcessMessages keine Bewegung, sondern nur das Resultat.
    Nun kannst du dir denken, was ProcessMessages macht...

    Verwende TTimer, um solche zeitabhängigen GUI-Probleme zu lösen.

    bis bald
    akari


Anmelden zum Antworten