Files
Ansgar Becker 7d401ffde8 Upgrade to Delphi 2010:
* Removes TNT Unicode controls, which are no longer required. All VCL controls now have native Unicode support.
* Remove Delphi 11 packages, otherwise we would either need to keep TNT or break Unicode
* PngComponents update from Uwe Raabe on http://cc.embarcadero.com/Item/26127
* Adjust auto build process
* Since Delphi 2009, Strings are now UnicodeStrings, not AnsiStrings any longer. Fix a bunch of compiler errors which came along with this change.
TODO: Project should compile but give tons of compiler warnings.
2010-01-05 23:14:33 +00:00

150 lines
3.9 KiB
ObjectPascal

unit PngSpeedButton;
{$I compilers.inc}
interface
uses
Windows, Classes, Buttons, pngimage, PngFunctions;
type
TPngSpeedButton = class(TSpeedButton)
private
FPngImage: TPngImage;
FPngOptions: TPngOptions;
FImageFromAction: Boolean;
function PngImageStored: Boolean;
procedure SetPngImage(const Value: TPngImage);
procedure SetPngOptions(const Value: TPngOptions);
procedure CreatePngGlyph;
protected
procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
procedure Paint; override;
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property PngImage: TPngImage read FPngImage write SetPngImage stored PngImageStored;
property PngOptions: TPngOptions read FPngOptions write SetPngOptions default [pngBlendOnDisabled];
property Glyph stored False;
property NumGlyphs stored False;
end;
implementation
uses
Graphics, ActnList, PngButtonFunctions;
{ TPngSpeedButton }
constructor TPngSpeedButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPngImage := TPngImage.Create;
FPngOptions := [pngBlendOnDisabled];
FImageFromAction := False;
end;
destructor TPngSpeedButton.Destroy;
begin
FPngImage.Free;
inherited Destroy;
end;
procedure TPngSpeedButton.ActionChange(Sender: TObject; CheckDefaults: Boolean);
begin
inherited ActionChange(Sender, CheckDefaults);
if Sender is TCustomAction then
with TCustomAction(Sender) do begin
//Copy image from action's imagelist
if (PngImage.Empty or FImageFromAction) and (ActionList <> nil) and
(ActionList.Images <> nil) and (ImageIndex >= 0) and (ImageIndex <
ActionList.Images.Count) then begin
CopyImageFromImageList(FPngImage, ActionList.Images, ImageIndex);
CreatePngGlyph;
FImageFromAction := True;
end;
end;
end;
procedure TPngSpeedButton.Paint;
var
PaintRect: TRect;
GlyphPos, TextPos: TPoint;
begin
inherited Paint;
if FPngImage <> nil then begin
//Calculate the position of the PNG glyph
CalcButtonLayout(Canvas, FPngImage, ClientRect, FState = bsDown, Down,
Caption, Layout, Margin, Spacing, GlyphPos, TextPos, DrawTextBiDiModeFlags(0));
PaintRect := Bounds(GlyphPos.X, GlyphPos.Y, FPngImage.Width, FPngImage.Height);
if Enabled then
DrawPNG(FPngImage, Canvas, PaintRect, [])
else
DrawPNG(FPngImage, Canvas, PaintRect, FPngOptions);
end;
end;
procedure TPngSpeedButton.Loaded;
begin
inherited Loaded;
CreatePngGlyph;
end;
function TPngSpeedButton.PngImageStored: Boolean;
begin
Result := not FImageFromAction;
end;
procedure TPngSpeedButton.SetPngImage(const Value: TPngImage);
begin
//This is all neccesary, because you can't assign a nil to a TPngImage
if Value = nil then begin
FPngImage.Free;
FPngImage := TPngImage.Create;
end
else
FPngImage.Assign(Value);
//To work around the gamma-problem
with FPngImage do
if Header.ColorType in [COLOR_RGB, COLOR_RGBALPHA, COLOR_PALETTE] then
Chunks.RemoveChunk(Chunks.ItemFromClass(TChunkgAMA));
FImageFromAction := False;
CreatePngGlyph;
Repaint;
end;
procedure TPngSpeedButton.SetPngOptions(const Value: TPngOptions);
begin
if FPngOptions <> Value then begin
FPngOptions := Value;
CreatePngGlyph;
Repaint;
end;
end;
procedure TPngSpeedButton.CreatePngGlyph;
var
Bmp: TBitmap;
begin
//Create an empty glyph, just to align the text correctly
Bmp := TBitmap.Create;
try
Bmp.Width := FPngImage.Width;
Bmp.Height := FPngImage.Height;
Bmp.Canvas.Brush.Color := clBtnFace;
Bmp.Canvas.FillRect(Rect(0, 0, Bmp.Width, Bmp.Height));
Glyph.Assign(Bmp);
NumGlyphs := 1;
finally
Bmp.Free;
end;
end;
end.