Hi,
Ich bin gerade dabei in
NonVCL ein PNG mit Alpha-Transparent (auch verläufe) darzustellen.
Durchs google und Delphi Hilfe welzen bin ich auf die Funktion AlphaBlend gekommen.
So nun hab ich das PNG mit der TPNGImage klasse geladen (da ich kein bok auf selber schreiben habe und von stream lade) und versucht das in BMP umzuwandeln. In
VCL weis ich das es geht, da ich es schonmal hinbekommen habe. Nur in
NonVCL mag er mir das nicht so wie ich das will
So nun der Code wie ich das Png in ein Bitmap umwandle:
Delphi-Quellcode:
BildMem := TMemoryStream.Create;
BildMem.SetSize(FileSize);
FileStream.Read(BildMem.Memory^,FileSize);
try
case BildType of
btPng:
begin
Png := TPngImage.Create;
try
Png.LoadFromStream(BildMem);
//Bilder ist ein Array von einem Typ den ich schon erzeugt habe und vom Typ TBitmap ist
Bilder[SkinTeil].SetSize(Png.Width,Png.Height);
Bilder[SkinTeil].PixelFormat := pf32bit;
Bilder[SkinTeil].AlphaFormat := afDefined; //afPremultiplied macht kein Unterschied und weglassen gehts garnicht.
Bilder[SkinTeil].Canvas.Draw(0,0,Png);
finally
Png.Free;
end;
So versuche ich das Bitmap nun zuzeichnen:
Delphi-Quellcode:
var Blend : BLENDFUNCTION;
begin
Blend.BlendOp := 0;
Blend.BlendFlags := 0;
Blend.SourceConstantAlpha := 255;
Blend.AlphaFormat := AC_SRC_ALPHA;
BitBlt(hdc,0,0,30,30,Bilder[skFormBildMain].Canvas.Handle,120, 100,SRCCOPY);//Hintergrundbild
AlphaBlend(hdc,0,0,Bilder[skBMiniHotlight].Width,Bilder[skBMiniHotlight].Height,
Bilder[skBMiniHotlight].Canvas.Handle,0,0,
Bilder[skBMiniHotlight].Width,Bilder[skBMiniHotlight].Height,Blend);
end;
Soweit funkt das in Windowx XP perfekt. Wenn ich jetzt das in Windows 7 teste, ob 32/64 bit egal,
macht er mir die Transparentefläche weis (bzw. weis in die Transparentfarbe verlaufend)...hmm..hab jetzt unter 2 Win7 und 1 XP (XP ist von mit und Win7 Virtual Maschiene) und es kommt zu diesem Fehler.
Hab schon versucht AlphaFormat von Blend nicht zu setzten oder ConctantAlpha auf 200 oder so macht kein unterschied...eher wird in XP alles Transparenter gezeichnet, ist ja logisch, so wie ich das verstanden hab ist Constant der Hellste wert oder?
Hoffe mir kann jemand einen Alternative sagen, wie ich das ohne, falls möglich, zusätzlichen Units machen kann.
Gruß NickelM