常用函数

MLSkin 常用函数

组件之外可以直接调用的全局函数,共 84 个:消息框、High-DPI 换算、图片与 SVG 处理等。

这里收录的是平时会用到的函数;库里还有一些内部绘图和辅助函数没有列出。使用前需要在 uses 里引用对应的单元。

消息框

MlMessageBoxuMlSkinMessageBox.pas

function MlMessageBox(const ACaption, AMsg: string; AIcon: TMlMsgBoxIcon = biNone; Buttons: TMlMsgBoxButtons = []): Integer;
function MlMessageBox(const ACaption, AMsg: string; AIcon: TMlMsgBoxIcon; Buttons: TMlMsgBoxButtons; const AShowAgainFlag: Boolean; var AShowAgainFlagValue: Boolean): Integer;
function MlMessageBox(const ACaption, AMsg: string; AIcon: TMlMsgBoxIcon; Buttons: TMlMsgBoxButtons; const AShowAgainFlag: Boolean; var AShowAgainFlagValue: Boolean; const PosX, PosY: Integer): Integer;

弹出 MlSkin 风格的消息框,用来代替 Delphi 自带的 MessageBox。AIcon 选择图标(biNone 无、biWarning 警告、biError 错误、biInformation 提示、biConfirmation 询问),Buttons 是按钮集合(mbOKmbYesmbNombCancelmbAbortmbRetrymbIgnore),返回值是被点击的按钮。带 AShowAgainFlag 的重载会多显示一个「不再提示」勾选框,勾选结果通过 AShowAgainFlagValue 带回;最后一个重载还能用 PosXPosY 指定弹出位置。外观由窗体上的 TMlSkinMessageBoxStyle 决定。

High-DPI 适配

AppInHighDPIModeuMlComm.pas

function AppInHighDPIMode: Boolean;

判断程序当前是否运行在高 DPI 环境下(屏幕缩放大于 100%)。

AppIsHighDPIModeuMlComm.pas

function AppIsHighDPIMode: Boolean;

判断程序是否启用了 High-DPI 支持(工程按 High-DPI 方式编译并声明)。

GetDPIScaleValueuMlComm.pas

function GetDPIScaleValue(Sender: TControl = nil): Double;

取当前的 DPI 缩放比例,100% 返回 1.0、150% 返回 1.5。传入控件时按该控件所在显示器计算。

GetDPIScaledFontSizeuMlComm.pas

function GetDPIScaledFontSize(Sender: TControl; const Size: Integer): Integer;

把字号按当前 DPI 换算成实际大小。

GetDPIScaledImageListuMlComm.pas

function GetDPIScaledImageList(Sender: TControl; const Source: TCustomImageList; ItemIndex: Integer; out Dest: TBitmap32): Boolean;
function GetDPIScaledImageList(Sender: TControl; const Source: TCustomImageList; ItemIndex: Integer; out Dest: TPngImage): Boolean;

从 ImageList 中取出按当前 DPI 缩放好的图片,输出为 TBitmap32 或 TPngImage。取到返回 True。

GetDPIScaledPixelsuMlComm.pas

function GetDPIScaledPixels(Sender: TControl; const pPixels: Integer): Integer;
function GetDPIScaledPixels(Sender: TControl; const pPixels: TRect): TRect;
function GetDPIScaledPixels(Sender: TControl; const pPixels: TPoint): TPoint;

把设计时的像素值换算成当前 DPI 下的实际像素。有三个重载,分别接受单个数值、TPoint 和 TRect。自绘控件时用它来换算尺寸和坐标。

SetDPIScaledFontuMlComm.pas

procedure SetDPIScaledFont(ScaledFont, DestFont: TFont);
procedure SetDPIScaledFont(Sender: TControl; DestFont: TFont);

把字体按当前 DPI 缩放后写入目标字体对象。两个重载分别以控件或源字体作为缩放依据。

SVG

ColorToAlphaColoruMlSkinSvgLib.pas

function ColorToAlphaColor(AColor: TColor; Alpha: Byte = $FF): Cardinal;

把 TColor 加上透明度转换成带 Alpha 的颜色值,用于 SVG 绘制。

DrawSvguMlSkinSvgLib.pas

procedure DrawSvg(const ACanvas: TCanvas; const DestRect: TRect; const SvgBrush: TMlSvgBrush; const AOpacity: Single = 1);
procedure DrawSvg(const ACanvas: TCanvas; const DestRect: TRect; const SvgSource: string; const AOpacity: Single = 1);
procedure DrawSvg(const Dest: TBitmap32; const DestRect: TRect; const SvgBrush: TMlSvgBrush; const AOpacity: Single = 1);

把 SVG 画到画布或位图上。三个重载分别接受 SVG 画刷对象、SVG 源码字符串,以及目标为 TBitmap32 的情况;AOpacity 控制不透明度(0~1)。

SvgBrushToMlSkinImageuMlSkinSvgLib.pas

procedure SvgBrushToMlSkinImage(SvgBrush: TMlSvgBrush; var MlSkinImage: TMlSkinImage; const AScale: Single = 1; const AOpacity: Single = 1);

把 SVG 画刷对象渲染成 MlSkin 图片对象。

SvgDataToMlSkinImageuMlSkinSvgLib.pas

procedure SvgDataToMlSkinImage(const SvgData: string; var MlSkinImage: TMlSkinImage; const AScale: Single = 1; const AOpacity: Single = 1);

把 SVG 源码渲染成 MlSkin 图片对象,AScale 指定缩放倍数,AOpacity 指定不透明度。

SvgFileToMlSkinImageuMlSkinSvgLib.pas

procedure SvgFileToMlSkinImage(const SvgFileName: string; var MlSkinImage: TMlSkinImage; const AScale: Single = 1);

读取 SVG 文件并渲染成 MlSkin 图片对象。

图片处理

ConvertBmpToPnguMlComm.pas

function ConvertBmpToPng(Bmp: TBitmap): TPngImage;

把位图转换成 PNG 图片对象并返回。

ConvertToPNGuMlSkinPngLib.pas

procedure ConvertToPNG(Source: TGraphic; Dest: TPngImage);

把任意图形对象(位图、图标等)转换成 PNG。

CopyImageFromImageListuMlSkinPngLib.pas

procedure CopyImageFromImageList(Dest: TPngImage; ImageList: TCustomImageList; Index: Integer);

从 ImageList 中按序号取出一张图片,复制到目标 PNG 对象。

DrawPNGuMlSkinPngLib.pas

procedure DrawPNG(Png: TPngImage; Canvas: TCanvas; const ARect: TRect; const Options: TPngOptions);

把 PNG 图片画到画布的指定区域,Options 控制绘制方式。

GetPngFromImageListuMlComm.pas

function GetPngFromImageList(ImageList: TImageList; const Index: Integer): TPngImage;

从 ImageList 中按序号取出一张图片并返回 PNG 对象。

MakeImageBlendeduMlSkinPngLib.pas

procedure MakeImageBlended(Image: TPngImage; Amount: Byte = 127);

把图片整体变淡(混合透明度),Amount 控制程度。

MakeImageGrayscaleuMlSkinPngLib.pas

procedure MakeImageGrayscale(Image: TPngImage; Amount: Byte = 255);

把图片转成灰度,Amount 控制程度。常用来做禁用状态的图标。

SetBitmapAlphauMlComm.pas

procedure SetBitmapAlpha(Bmp: TBitmap; Alpha: Byte);

给位图整体设置透明度。

SlicePNGuMlSkinPngLib.pas

procedure SlicePNG(JoinedPNG: TPngImage; Columns, Rows: Integer; out SlicedPNGs: TObjectList);

把一张拼接的大图按行列切成多张 PNG,输出到对象列表。做多状态图片素材时用得上。

图片缩放与切分

CropBitmap32uMlComm.pas

procedure CropBitmap32(Src, Dst: TBitmap32; SrcX, SrcY: Integer);

从位图上裁下一块。它按内存直接复制像素,不做混合,可避免半透明像素变暗。

CropPNGuMlComm.pas

procedure CropPNG(Source: TPngImage; Left, Top, Width, Height: Integer; out Target: TPngImage);

从 PNG 上裁下指定位置和大小的一块。

DrawBitmapCapInsetsuMlComm.pas

procedure DrawBitmapCapInsets(SrcBitmap, DestBitmap: TBitmap32; const CapInsetsRect: TRect ; Blend: Boolean = False);

按九宫格方式把源位图绘制到目标位图上,CapInsetsRect 指定四边不拉伸的宽度。

ResizeHorzImguMlComm.pas

function ResizeHorzImg(const Src: TMlSkinImage; const Width: Integer; const LeftRightSize: Integer = 0): TMlSkinImage;

只把 MlSkin 图片横向拉伸到指定宽度。

ResizeHorzPnguMlComm.pas

function ResizeHorzPng(const Src: TPngImage; const Width: Integer; const LeftRightSize: Integer = 0): TPngImage;

只把 PNG 横向拉伸到指定宽度,LeftRightSize 指定左右两端保持不拉伸的宽度。

ResizeImguMlComm.pas

function ResizeImg(const Src: TMlSkinImage; Width, Height: Integer): TMlSkinImage;

把 MlSkin 图片缩放到指定的宽高。

ResizePnguMlComm.pas

function ResizePng(const Src: TPngImage; Width, Height: Integer): TPngImage;
function ResizePng(const Src: TPngImage; const Width, Height: Integer; const HStretchRect, VStretchRect: TRect): TPngImage;

把 PNG 缩放到指定宽高。带 HStretchRectVStretchRect 的重载只拉伸中间区域,四边和四角保持原样(九宫格拉伸)。

ResizeVertImguMlComm.pas

function ResizeVertImg(const Src: TMlSkinImage; const Height: Integer): TMlSkinImage;

只把 MlSkin 图片纵向拉伸到指定高度。

ResizeVertPnguMlComm.pas

function ResizeVertPng(const Src: TPngImage; const Height: Integer): TPngImage;

只把 PNG 纵向拉伸到指定高度。

SpliteHorz3ImguMlComm.pas

function SpliteHorz3Img(const Src: TMlSkinImage; const LeftRightSize: Integer = 0): TDynMlSkinImage;

把 MlSkin 图片横向切成三块,LeftRightSize 指定两端的宽度。

SpliteImguMlComm.pas

function SpliteImg(const Src: TMlSkinImage; Count: Integer): TDynMlSkinImage;

把一张多帧图片按帧数竖向等分成多张 MlSkin 图片。按钮的多状态图就是这样拆出来的。

SpliteImgCenterPartuMlComm.pas

function SpliteImgCenterPart(const Src: TMlSkinImage; h: Integer; w: Integer): TMlSkinImage;

取出图片的中间部分并缩放到指定宽高。

SpliteImgTo9BlockuMlComm.pas

function SpliteImgTo9Block(const Src: TMlSkinImage): TImgArray9Block;

把图片切成九宫格的九块,用于四角不变形的拉伸。

SplitePnguMlComm.pas

function SplitePng(const Src: TPngImage; Count: Integer): TPngArray;

把一张多帧 PNG 按帧数等分成多张 PNG。

SplitePngTo3horzBlockuMlComm.pas

function SplitePngTo3horzBlock(const Src: TPngImage): TPngArray3Block;
function SplitePngTo3horzBlock(const Src: TPngImage; const LeftRightSize: Integer): TPngArray3Block;

把 PNG 横向切成左、中、右三块,中间用于拉伸。

SplitePngTo3vertBlockuMlComm.pas

function SplitePngTo3vertBlock(const Src: TPngImage): TPngArray3Block;

把 PNG 纵向切成上、中、下三块。

SplitePngTo9BlockuMlComm.pas

function SplitePngTo9Block(const Src: TPngImage): TPngArray9Block;

把 PNG 切成九宫格的九块。

SpliteVertImguMlComm.pas

function SpliteVertImg(const Src: TMlSkinImage; Count: Integer): TDynMlSkinImage;

把一张多帧图片按帧数横向等分。

绘制辅助

ColorBlenduMlComm.pas

procedure ColorBlend(const ACanvas: HDC; const ARect: TRect; const ABlendColor: TColor; const ABlendValue: Integer);

在画布的指定区域上叠加一层半透明颜色,ABlendValue 是混合强度。

DrawEffectTextuMlComm.pas

procedure DrawEffectText(const Canvas: TCanvas; ARect: TRect; const Text: string; const Flags: cardinal; const ShadowDistance: Integer = 0; const ShadowColor: TColor = $FFFFFE; BlurRadius: Integer = 5; const TextVisible: Boolean = True);

绘制带效果的文字,可以加阴影和发光:ShadowDistance 是阴影偏移、ShadowColor 是阴影颜色、BlurRadius 是模糊半径。

DrawImageInCircleuMlComm.pas

procedure DrawImageInCircle(DC: HDC; const ACircleRect: TRect; AGPImage: TGPImage; const BgColor: TColor = $00EBB71C);

把图片画成圆形(超出圆形的部分裁掉),用来做圆形头像。

DrawParentImageuMlComm.pas

procedure DrawParentImage(Control: TControl; Dest: TCanvas; const ARect: TRect);
procedure DrawParentImage(Control: TControl; Dest: TBitmap32; const ARect: TRect);

把父窗体的背景直接绘制到目标位图或画布上,用于实现控件透明。

DrawRoundRectangleuMlComm.pas

procedure DrawRoundRectangle(var ACanvas: TCanvas; const R: TRect; const AColor: TColor; const Radius: Integer);

画一个圆角矩形,Radius 是圆角半径。

FillGradientuMlComm.pas

procedure FillGradient(Canvas: TCanvas; Color1, Color2: TColor; rect: TRect; const Horizontal: Boolean = True);

在指定矩形里画双色渐变,Horizontal 决定方向。

GetParentImageuMlComm.pas

procedure GetParentImage(Control: TControl; Dest: TCanvas; const ARect: TRect);
procedure GetParentImage(Control: TControl; Dest: TBitmap32; const ARect: TRect);

取出控件所在位置的父窗体背景,画到目标位图或画布上。自绘透明控件时用它取背景。

MlBoxBluruMlComm.pas

procedure MlBoxBlur(Src: TBitmap; radius, rep: Integer);

对位图做模糊处理,radius 是模糊半径、rep 是重复次数(次数越多越接近高斯模糊)。

SetAlphaBlendTransparentuMlComm.pas

procedure SetAlphaBlendTransparent(WHandle: HWND = 0; Value: Byte = 0);

设置窗口整体的透明度(分层窗口),Value 为 0~255。

颜色与几何

GetMonitorWorkAreauMlComm.pas

function GetMonitorWorkArea(const w: HWND; const WorkArea: Boolean): TRect;

取窗口所在显示器的区域;WorkArea 为 True 时返回不含任务栏的工作区。弹出窗口定位时常用。

GetRectHeightuMlComm.pas

function GetRectHeight(const rect: TRect): Integer;
function GetRectHeight(const rect: TFloatRect): TFloat;

取矩形的高度,另有接受浮点矩形的重载。

GetRectWidthuMlComm.pas

function GetRectWidth(const rect: TRect): Integer;
function GetRectWidth(const rect: TFloatRect): TFloat;

取矩形的宽度,另有接受浮点矩形的重载。

IsNullRectuMlComm.pas

function IsNullRect(R: TRect): Boolean;

判断矩形是否为空。

NullRectuMlComm.pas

function NullRect: TRect;

返回一个空矩形(四个值都是 0)。

PointInRectuMlComm.pas

function PointInRect(R: TRect; P: TPoint): Boolean;

判断一个点是否落在矩形内。

RectHeightuMlComm.pas

function RectHeight(const ARect: TRect): Integer;

取矩形的高度。

RectInRectuMlComm.pas

function RectInRect(R1, R2: TRect): Boolean;

判断两个矩形是否有交叠。

RectWidthuMlComm.pas

function RectWidth(const ARect: TRect): Integer;

取矩形的宽度。

TColor2RGBuMlComm.pas

procedure TColor2RGB(const Color: TColor; var R, G, B: Byte);

把 TColor 拆成 R、G、B 三个分量。

WebColorToDelphiTColoruMlComm.pas

function WebColorToDelphiTColor(webcolor: Integer): TColor;

把网页颜色值(如 0xRRGGBB)转换成 Delphi 的 TColor。从设计稿取色时很方便。

皮肤与资源

BringToFrontExuMlComm.pas

procedure BringToFrontEx(const DestWindow: THandle);

把指定窗口提到最前面并激活它。

DisableVclStylesuMlComm.pas

procedure DisableVclStyles(Control: TControl);

关闭指定控件上的 VCL 样式。Delphi 的 VCL Styles 与皮肤绘制冲突时用它排除影响。

ExistsMlSkinResDMuMlSkinLinkResDM.pas

function ExistsMlSkinResDM: Boolean;

判断工程里是否已经有 MlSkin 的资源数据模块。

GetMlSkinImageBytesuMlSkinResManager.pas

function GetMlSkinImageBytes(Image: TMlSkinImage): Int64;

取一张 MlSkin 图片占用的字节数,排查内存占用时可用。

GetMlSkinInstallPathuMlComm.pas

function GetMlSkinInstallPath: string;

取 MlSkin 组件的安装路径(从注册表读取)。

GetMlSkinResDMuMlSkinLinkResDM.pas

function GetMlSkinResDM: TMlSkinResDM;

取工程里的 MlSkin 资源数据模块对象,没有时会自动创建。

ReloadMlSkinResDMuMlSkinLinkResDM.pas

procedure ReloadMlSkinResDM;

重新加载资源数据模块里的图片,换皮肤文件后可调用它刷新。

TMlSkinResManagerObjuMlSkinResManager.pas

function TMlSkinResManagerObj: TMlSkinResManager;

取全局的图片资源管理器对象,可在代码里按 ID 存取图片。

文本与字符串

CalcTextHeightWuMlComm.pas

function CalcTextHeightW(DC: HDC; Str: WideString): Integer;

按指定设备上下文计算一段文字的高度(像素)。

CalcTextWidthWuMlComm.pas

function CalcTextWidthW(DC: HDC; Str: WideString): Integer;

按指定设备上下文计算一段文字的宽度(像素)。

ExtractBetweenStringsuMlComm.pas

function ExtractBetweenStrings(AStrings: TStrings; var ResultStrings: TStrings; const StartStr, EndStr: string; CaseSensitive: Boolean = True): Boolean;

从字符串列表里提取两个标记之间的内容。

FillStrToLabelsuMlSkinTagsBox.pas

procedure FillStrToLabels(Dest: TMlTagsBoxItems; Source: string);

把字符串拆开填回标记框的标签集合,与 LabelsToStr 配套使用。

GetPYCodeuMlPYCode.pas

function GetPYCode(stText: AnsiString; iMode: Integer): string;

取中文字符串的拼音码。搜索输入框的拼音过滤就是用它实现的,iMode 选择取首字母还是全拼。

HTMLDeleteTaguMlSkinHtmlLabel.pas

function HTMLDeleteTag(const Str: string): string;

去掉字符串里的 HTML 标记,只留下纯文本。

HTMLPrepareTextuMlSkinHtmlLabel.pas

function HTMLPrepareText(const Text: string): string;

把纯文本转成可以安全放进 HTML 标签控件的文本(转义特殊字符)。

IsIntStringuMlComm.pas

function IsIntString(const Str: string): Boolean;

判断字符串是不是一个整数。

LabelsToStruMlSkinTagsBox.pas

function LabelsToStr(Dest: TMlTagsBoxItems): string;

把标记框(TMlSkinTagsBox)里的所有标签拼成一个字符串,便于保存。

ReadUTF8FileuMlComm.pas

function ReadUTF8File(const FileName: string): string;

按 UTF-8 编码读取文本文件。

WriteUTF8FileuMlComm.pas

procedure WriteUTF8File(const AStr, FileName: string);

把文本按 UTF-8 编码写入文件。

其它

CopyCanvasRegionToBitmapuMlComm.pas

function CopyCanvasRegionToBitmap(SourceCanvas: TCanvas; const SourceRect: TRect): TBitmap;

把画布上指定区域的内容复制成位图。

FormToBitmap32uMlSkinHint.pas

function FormToBitmap32(DestForm: TForm): TBitmap32;

把整个窗体的画面抓成位图,用于做窗体截图或过渡动画。

GetAbsolutePathExuMlComm.pas

function GetAbsolutePathEx(BasePath, RelativePath: string): string;

把相对路径按给定的基准路径转换成绝对路径。

GetSimpleTimerActiveCountuMlSimpleTimer.pas · uSimpleTimer.pas

function GetSimpleTimerActiveCount: Cardinal;
function GetSimpleTimerActiveCount: Cardinal;

取当前正在运行的轻量计时器数量。

GetSimpleTimerCountuMlSimpleTimer.pas · uSimpleTimer.pas

function GetSimpleTimerCount: Cardinal;
function GetSimpleTimerCount: Cardinal;

取当前已创建的轻量计时器数量。MlSkin 的动画效果用这套计时器驱动,排查性能时可以看看。

控件列表按分类浏览全部 78 个控件