2011-03-14 15 views
20

Biraz şaşırıyorum, sadece bana mı yoksa TSpeedButton'ın glifine bir kaynaktan görüntüyü aşağıda gösterildiği gibi çirkin bir siyah anahat olmadan atayamaz mısınız?Bir TSpeedButton glifinin çevresindeki iğrenç anahatları kaldırmak mümkün mü?

Tam olarak TImage bileşeni için aynı şekilde atadım ve sonucu gerekli alıyorum.

Uzunca bir süredir araştırıyorum ama hiç kimse bu tuhaf ve can sıkıcı bir soruna sahip gibi görünmüyor.

procedure TForm3.Button1Click(Sender: TObject); 
var r : tresourcestream; png : tpngimage; 
begin 
    r := tresourcestream.CreateFromID(hinstance,34,'cardimage'); 
    png := tpngimage.Create; 
    png.LoadFromStream(r); 
    png.AssignTo(image1.Picture.bitmap); 
    png.AssignTo(speedbutton1.glyph); 
    png.Free; 
    r.Free; 
end; 

34 türü zaten tahmin değil eğer resimde gösterilen görüntüye ilgilidir 'cardimage' imgesi geçerli:

İşte aşağıdaki formu için benim kaynak kod.

enter image description here

+0

sorun alfa olduğu açıkça: Örneğin,

var png: TPNGImage; begin png := TPngImage.Create; png.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\alpha.png'); SpeedButton1.Glyph.Assign(png); // or png.AssignTo(SpeedButton1.Glyph); 

http://privat.rejbrand.se/speedbuttonalpha.png

bir kısmi çözücü ön-harman PNG resmi için üretir Sol resimde kanal göz ardı edilir. –

+2

Genel olarak, 'Y.AssignTo (X)' değil, 'X.Assign (Y)' yi çağırmalısınız. "TX", bir "TY" den nasıl elde edildiğini bilmiyorsa, otomatik olarak "Y.AssignTo (X)" diyerek "TY" ye ertelenecektir. Fakat 'TY' kendini bir TX'ye nasıl atayacağını bilmiyorsa, hedef nesneyi ertelemez. –

cevap

31

konu alfa kanal sol resimde göz ardı edilir olduğunu açıkça. Şimdi, TSpeedButton.Glyph özelliği TBitmap, dolayısıyla PNG alfa kanalı korumak sorunlu olabilir.

var 
    png: TPNGImage; 
    bm: TBitmap; 
begin 
    png := TPngImage.Create; 
    png.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\alpha.png'); 
    bm := TBitmap.Create; 
    bm.SetSize(png.Width, png.Height); 
    bm.Canvas.Brush.Color := Self.Color; 
    bm.Canvas.FillRect(Rect(0, 0, bm.Width, bm.Height)); 
    bm.Canvas.Draw(0, 0, png); 
    SpeedButton1.Glyph.Assign(bm); 

http://privat.rejbrand.se/speedbuttonalpha2.png

+0

+1. Güzel cevap, Andreas. –

+2

Teşekkürler, @Ken. Ancak daha iyi bir çözüm olabilir. –

+0

Eğer lol yapabilirsem +1 yapardım, ama teşekkürler bir muamele! Sadece bir okul projesi için kullanılıyor ve sadece gözlerimi can sıkıyordu lol ama yine de teşekkürler! : D –

İlgili konular