Delphi11中TImageList超256尺寸限制的替代方案咨询
Delphi11 替代TImageList加载大尺寸图片的方案
以下是几种适配480×60大尺寸图片的最优/快捷方案,均基于Delphi11原生组件或逻辑实现:
直接使用TPicture/TImage集合存储
自定义控件内部维护图片集合,完全绕过TImageList的尺寸限制,直接控制绘制逻辑,适合仅给单个自定义控件提供图片的场景。示例代码:type TMyCustomButton = class(TButton) private FImages: array[0..1] of TPicture; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Paint; override; end; constructor TMyCustomButton.Create(AOwner: TComponent); begin inherited; FImages[0] := TPicture.Create; FImages[1] := TPicture.Create; // 可从文件/资源加载图片 FImages[0].LoadFromFile('normal_state.png'); FImages[1].LoadFromFile('pressed_state.png'); end; destructor TMyCustomButton.Destroy; begin FImages[0].Free; FImages[1].Free; inherited; end; procedure TMyCustomButton.Paint; begin inherited; // 根据按钮状态绘制对应图片 if (GetState = bsDown) and not FImages[1].Bitmap.Empty then Canvas.Draw(0, 0, FImages[1].Bitmap) else if not FImages[0].Bitmap.Empty then Canvas.Draw(0, 0, FImages[0].Bitmap); end;使用TImageCollection替代
TImageCollection是Embarcadero推出的TImageList升级组件,支持更大尺寸图片,还原生支持高DPI适配,适合多控件共享图片资源的场景:- 设计时:拖入TImageCollection到窗体,右键选择「Add Images」导入480×60图片,设置好索引;
- 自定义控件中调用示例:
type TMyCustomButton = class(TButton) private FImageCollection: TImageCollection; FCurrentImgIndex: Integer; public property ImageCollection: TImageCollection read FImageCollection write FImageCollection; procedure Paint; override; end; procedure TMyCustomButton.Paint; var Bmp: TBitmap; begin inherited; if Assigned(FImageCollection) then begin Bmp := TBitmap.Create; try FImageCollection.GetBitmap(FCurrentImgIndex, Bmp); Canvas.Draw(0, 0, Bmp); finally Bmp.Free; end; end; end;直接从资源加载图片
若图片已嵌入程序资源,可直接在自定义控件中读取资源流加载,无需依赖任何图片管理组件,适合轻量场景:procedure TMyCustomButton.LoadImageFromResource(Index: Integer; out APicture: TPicture); var ResStream: TResourceStream; begin APicture := TPicture.Create; try ResStream := TResourceStream.Create(HInstance, IfThen(Index=0, 'IMG_NORMAL', 'IMG_PRESSED'), RT_RCDATA); try APicture.LoadFromStream(ResStream); finally ResStream.Free; end; except APicture.Free; raise; end; end;
内容的提问来源于stack exchange,提问作者Error - CPU Not Foud
相关产品推荐
相关产品推荐

