2011-03-14 77 views
20

我遇到了一點問題,難道只是我或者你不能將資源中的圖像分配給TSpeedButton的標誌符號而沒有可怕的黑色輪廓,如下所示?是否有可能去除TSpeedButton字形周圍的醜陋輪廓?

我已經爲TImage組件分配了完全相同的方式,並且得到了所需的結果。

我一直在尋找相當長的一段時間,但沒有人似乎有這個奇怪和煩人的問題。

下面是下面的表格我的源代碼:

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是類型「cardimage」,其涉及圖像被顯示在畫面如果尚未猜到的圖像。

enter image description here

+0

的問題是顯然的是,阿爾法通道在左圖中被忽略。 – 2011-03-14 22:52:30

+2

一般來說,你應該調用'X.Assign(Y)',而不是'Y.AssignTo(X)'。如果'TX'不知道如何從TY獲取屬性,它將自動通過調用'Y.AssignTo(X)'來遵循'TY'。但是如果'TY'不知道如何將自己分配給一個'TX',它就不會推遲到目標對象。 – 2011-03-15 01:19:22

回答

31

問題顯然是阿爾法通道在左畫面被忽略。現在,TSpeedButton.Glyph屬性是TBitmap,因此保留PNG Alpha通道可能會有問題。例如,

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

一種部分解決方案是預先混合的PNG圖像:

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。好的回答,安德烈亞斯。 – 2011-03-14 23:03:26

+2

謝謝,@Ken。但是可能會有更好的解決方案。 – 2011-03-14 23:04:32

+0

我會+1,如果我可以大聲笑,但謝謝作品一種享受!它只被用於學校項目,只是煩擾我的眼睛大聲笑,但再次感謝! :D – 2011-03-14 23:09:21