📄 jvqimagelist.pas
字号:
Bmp := TBitmap.Create;
MaskBmp := TBitmap.Create;
try
Bmp.PixelFormat := Bitmap.PixelFormat;
MaskBmp.PixelFormat := MaskBitmap.PixelFormat;
// split Bitmap and add all bitmaps to ImgList
for i := 0 to Result - 1 do
begin
Bmp.Width := 0; // clear bitmap
Bmp.Width := Width;
Bmp.Height := Height;
Bmp.Canvas.CopyRect(Rect(0, 0, Width, Height),
Bitmap.Canvas, Rect(i * Width, 0, (i + 1) * Width, Height));
MaskBmp.Width := 0; // clear bitmap
MaskBmp.Width := Width;
MaskBmp.Height := Height;
MaskBmp.Canvas.CopyRect(Rect(0, 0, Width, Height),
MaskBitmap.Canvas, Rect(i * Width, 0, (i + 1) * Width, Height));
TempImageList.Add(Bmp, MaskBmp);
end;
ImgList.AddImages(TempImageList);
finally
Bmp.Free;
TempImageList.Free;
end;
end;
//=== { TJvImageList } =======================================================
destructor TJvImageList.Destroy;
begin
FItems.Free;
FPicture.Free;
FResourceIds.Free;
inherited Destroy;
end;
procedure TJvImageList.InitializeImageList;
begin
FModified := False;
FUpdateLock := 0;
FMode := imPicture;
FTransparentMode := tmColor;
FTransparentColor := clFuchsia;
FFileName := '';
FPicture := TPicture.Create;
FPicture.OnChange := DataChanged;
FResourceIds := TStringList.Create;
TStringList(FResourceIds).OnChange := DataChanged;
FItems := TJvImageListItems.Create(Self);
end;
procedure TJvImageList.Assign(Source: TPersistent);
var
ImageList: TJvImageList;
begin
ImageList := TJvImageList(Source);
BeginUpdate;
try
if (Source <> nil) and (Source is TJvImageList) then
begin
Clear;
FMode := imClassic; // lock update
if (ImageList.Picture.Graphic <> nil) and not ImageList.Picture.Graphic.Empty then
Picture.Assign(ImageList.Picture)
else
Picture.Assign(nil);
ResourceIds.Assign(ImageList.ResourceIds);
// Do not assign FileName here.
TransparentMode := ImageList.TransparentMode;
TransparentColor := ImageList.TransparentColor;
end;
inherited Assign(Source);
if (Source <> nil) and (Source is TJvImageList) then
Mode := ImageList.Mode; // enable update
finally
EndUpdate;
end;
end;
procedure TJvImageList.BeginUpdate;
begin
if FUpdateLock = 0 then
FModified := False;
Inc(FUpdateLock);
end;
procedure TJvImageList.EndUpdate;
begin
Dec(FUpdateLock);
if (FUpdateLock = 0) and FModified then
Change;
end;
procedure TJvImageList.Change;
begin
FModified := True;
if FUpdateLock = 0 then
inherited Change;
end;
procedure TJvImageList.DataChanged(Sender: TObject);
begin
UpdateImageList;
end;
procedure TJvImageList.SetPicture(Value: TPicture);
begin
if (Value <> FPicture) then
FPicture.Assign(Value);
end;
procedure TJvImageList.SetTransparentMode(Value: TJvImageListTransparentMode);
begin
if Value <> FTransparentMode then
begin
FTransparentMode := Value;
UpdateImageList;
end;
end;
procedure TJvImageList.SetTransparentColor(Value: TColor);
begin
if Value <> FTransparentColor then
begin
FTransparentColor := Value;
if FTransparentMode = tmColor then
UpdateImageList;
end;
end;
procedure TJvImageList.SetFileName(const Value: TFileName);
begin
if not SameFileName(Value, FFileName) then
begin
FFileName := Value;
DoLoadFromFile;
end;
end;
procedure TJvImageList.DoLoadFromFile;
begin
if (not (csDesigning in ComponentState)) and (csLoading in ComponentState) then
Exit;
if (FFileName <> '') and FileExists(FFileName)
{$IFDEF UNIX} and not DirectoryExists(FFileName) {$ENDIF} then
try
FPicture.LoadFromFile(FFileName);
except
// ignore exception
end;
end;
procedure TJvImageList.SlicePictureToImageList;
var
Bmp: TBitmap;
OwnBitmap: Boolean;
MaskColor: TColor;
begin
BeginUpdate;
try
Clear;
if FPicture.Graphic = nil then
Exit;
OwnBitmap := False;
if FPicture.Graphic is TBitmap then
Bmp := FPicture.Bitmap
else
begin
OwnBitmap := True;
Bmp := TBitmap.Create;
Bmp.Canvas.Brush.Color := FTransparentColor;
Bmp.Width := FPicture.Width;
Bmp.Height := FPicture.Height;
Bmp.Canvas.Draw(0, 0, FPicture.Graphic);
end;
try
if TransparentMode = tmNone then
MaskColor := clNone
else
MaskColor := TransparentColor;
LoadImageListFromBitmap(Self, Bmp, MaskColor, TransparentMode = tmAuto);
finally
if OwnBitmap then
Bmp.Free;
end;
finally
EndUpdate;
end;
end;
procedure TJvImageList.ResourceIdsToImageList;
var
Bmp: TBitmap;
ResStream: TResourceStream;
i: Integer;
MaskColor: TColor;
begin
BeginUpdate;
try
Clear;
if ResourceIds.Count = 0 then
Exit;
Bmp := TBitmap.Create;
try
for i := 0 to ResourceIds.Count - 1 do
begin
if Trim(ResourceIds[i]) <> '' then
try
// load resource
ResStream := nil;
try
try
ResStream := TResourceStream.Create(HInstance, ResourceIds[i], RT_BITMAP);
except
ResStream := nil;
end;
if ResStream <> nil then
Bmp.LoadFromResourceName(HInstance, ResourceIds[i])
else
begin
ResStream := TResourceStream.Create(HInstance, ResourceIds[i], RT_RCDATA);
Bmp.LoadFromStream(ResStream);
end;
finally
ResStream.Free;
end;
// add bitmap
if not Bmp.Empty and (Bmp.Width > 0) and (Bmp.Height > 0) then
begin
case TransparentMode of
tmNone:
MaskColor := clNone;
tmColor:
MaskColor := TransparentColor;
tmAuto:
MaskColor := Bmp.Canvas.Pixels[0, Bmp.Height - 1];
else
MaskColor := clNone; // make the compiler happy
end;
AddMasked(Bmp, MaskColor);
end;
except
// ignore exception
end;
end;
finally
Bmp.Free;
end;
finally
EndUpdate;
end;
end;
type
TComponentAccessProtected = class(TComponent);
TDefineProperties = procedure(Self: TComponent; Filer: TFiler);
procedure TJvImageList.DefineProperties(Filer: TFiler);
begin
Inc(FUpdateLock); // no BeginUpdate/EndUpdate here
try
if (Filer is TWriter) then
DoLoadFromFile; // update Picture.Graphic if a filename is specified
if (Filer is TWriter) and
(((FMode = imPicture) and (FPicture.Graphic <> nil) and (not FPicture.Graphic.Empty)) or
((FMode = imResourceIds) and (FResourceIds.Count > 0)) or
((FMode = imItemList) and (FItems.Count > 0))) then
TDefineProperties(@TComponentAccessProtected.DefineProperties)(Self, Filer)
else
inherited DefineProperties(Filer);
finally
Dec(FUpdateLock);
end;
end;
procedure TJvImageList.SetItems(AItems: TJvImageListItems);
begin
Clear;
FItems.Assign(AItems);
end;
procedure TJvImageList.AddItem(ABitmap: TBitmap; ATransparentColor: TColor);
var
BitmapItem: TJvImageListItem;
begin
if Mode <> imItemList then
Clear;
Mode := imItemList;
BitmapItem := FItems.Add;
BitmapItem.Kind := ikInlineBitmap;
BitmapItem.Bitmap.Assign(ABitmap);
BitmapItem.TransparentColor := ATransparentColor;
end;
procedure TJvImageList.AddItem(const AResourceName: string; ATransparentColor: TColor);
var
ResourceItem: TJvImageListItem;
begin
if Mode <> imItemList then
Clear;
Mode := imItemList;
ResourceItem := FItems.Add;
ResourceItem.Kind := ikResourceBitmap;
ResourceItem.ResourceName := AResourceName;
ResourceItem.TransparentColor := ATransparentColor;
end;
procedure TJvImageList.DeleteItem(AIndex: Integer);
begin
if Mode = imItemList then
FItems.Delete(AIndex)
else
ItemListError;
end;
procedure TJvImageList.ClearItems;
begin
if Mode = imItemList then
begin
Clear;
FItems.Clear;
end
else
ItemListError;
end;
function TJvImageList.GetItemInfoStr(AIndex: Integer): string;
begin
Result := '';
if Mode = imItemList then
Result := FItems[AIndex].DisplayName
else
ItemListError;
end;
procedure TJvImageList.SetResourceIds(Value: TStrings);
begin
if (Value <> nil) and (Value <> FResourceIds) then
FResourceIds.Assign(Value);
end;
procedure TJvImageList.SetMode(const Value: TJvImageListMode);
begin
if Value <> FMode then
begin
FMode := Value;
UpdateImageList;
end;
end;
procedure TJvImageList.UpdateImageList;
begin
case FMode of
imClassic:
; // do nothing
imPicture:
SlicePictureToImageList;
imResourceIds:
ResourceIdsToImageList;
imItemList:
; // do nothing
end;
end;
procedure TJvImageList.GetIcon(Index: Integer; Ico: TIcon);
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
try
GetBitmap(Index, Bmp);
Ico.Assign(Bmp);
finally
Bmp.Free;
end;
end;
procedure TJvImageList.LoadFromFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TJvImageList.SaveToFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
procedure TJvImageList.Initialize(const AWidth, AHeight: Integer);
begin
inherited Initialize(AWidth, AHeight);
InitializeImageList;
end;
procedure TJvImageList.LoadFromStream(Stream: TStream);
begin
ReadData(Stream);
end;
procedure TJvImageList.SaveToStream(Stream: TStream);
begin
WriteData(Stream);
end;
procedure TJvImageList.ItemListError;
begin
raise EJvImageListError.CreateResFmt(@RsEWrongImageListMode, ['imItemList']);
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQImageList.pas,v $';
Revision: '$Revision: 1.23 $';
Date: '$Date: 2004/11/06 22:08:18 $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
initialization
{$IFDEF UNITVERSIONING}
RegisterUnitVersion(HInstance, UnitVersioning);
{$ENDIF UNITVERSIONING}
finalization
{$IFDEF UNITVERSIONING}
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -