Можно ли удалить отвратительный контур вокруг глифа 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», которое относится к изображению, показанному на картинке, если вы еще не догадались.

введите здесь описание изображения


person Felix de Souza    schedule 14.03.2011    source источник
comment
Проблема явно в том, что альфа-канал игнорируется на левом изображении.   -  person Andreas Rejbrand    schedule 15.03.2011
comment
Как правило, вы должны звонить X.Assign(Y), а не Y.AssignTo(X). Если TX не знает, как получить атрибуты от TY, он перейдет к TY, автоматически вызвав Y.AssignTo(X). Но если TY не знает, как присвоить себя TX, он не будет подчиняться целевому объекту.   -  person Rob Kennedy    schedule 15.03.2011


Ответы (1)


Проблема явно в том, что альфа-канал канал игнорируется на левой картинке. Теперь свойство TSpeedButton.Glyph имеет значение TBitmap, поэтому сохранение альфа-канала PNG может быть проблематичным. Например,

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

производит

Одним из частичных решений является предварительное смешивание изображения 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);

person Andreas Rejbrand    schedule 14.03.2011
comment
Спасибо, @Кен. Но может быть лучшее решение. - person Andreas Rejbrand; 15.03.2011
comment
Я бы +1, если бы мог смеяться, но спасибо работает! Он используется только для школьного проекта и просто раздражает мои глаза, лол, но еще раз спасибо! :D - person Felix de Souza; 15.03.2011
comment
предварительное смешивание доставит вам немного горя где-нибудь в будущем. - person David Heffernan; 15.03.2011
comment
Придирка :) думаю, вам не нужно второе растровое изображение, вы можете рисовать прямо на глиф кнопки .. - person Sertac Akyuz; 15.03.2011
comment
@Sertac: О, да, совершенно верно. - person Andreas Rejbrand; 15.03.2011
comment
FWIW, я лично собираюсь переписать TSpeedButton, чтобы иметь правильную поддержку PNG. Когда-нибудь. Когда у меня будет время.... [ухмыляется] - person Warren P; 15.03.2011
comment
Очень красиво, это то, что должно быть родным. Удивительно, даже в XE2 кнопки по умолчанию не поддерживают PNG. - person hikari; 21.06.2012