2011-03-14 14 views
20

Me he encontrado con un pequeño inconveniente, ¿soy yo o no puedes asignar una imagen de un recurso al glifo de TSpeedButton sin un horrendo contorno negro como se muestra a continuación?¿Es posible eliminar un contorno horrible alrededor de un glifo de TSpeedButton?

Lo he asignado exactamente de la misma manera para el componente TImage y estoy obteniendo el resultado necesario.

He estado buscando por un tiempo, pero nadie parece tener este extraño y molesto problema.

Aquí está mi código fuente para el siguiente formulario:

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 es la imagen del tipo 'cardimage' que se relaciona con la imagen que se muestra en la imagen si no lo ha adivinado.

enter image description here

+0

La cuestión es claramente que la alfa el canal se ignora en la imagen de la izquierda. –

+2

Generalmente, debe llamar a 'X.Assign (Y)', no 'Y.AssignTo (X)'. Si 'TX' no sabe cómo adquirir atributos de un' TY', diferirá a 'TY' al llamar' Y.AssignTo (X) 'automáticamente. Pero si 'TY' no sabe cómo asignarse a un' TX', no diferirá al objeto de destino. –

Respuesta

31

La cuestión es claramente que el canal alfa se ignora en la imagen izquierda. Ahora, la propiedad TSpeedButton.Glyph es TBitmap, por lo que podría ser problemático conservar el canal alfa PNG. Por ejemplo,

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); 

produce

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

Una solución parcial es pre-mezclar la imagen 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. Buena respuesta, Andreas. –

+2

Gracias, @Ken. Pero podría haber una mejor solución. –

+0

Me gustaría +1 si pudiera jajaja, ¡pero gracias funciona! Solo se usa para un proyecto escolar, y solo me molestaba los ojos, pero ¡gracias de nuevo! : D –

Cuestiones relacionadas