我正在寻找一种让用户选择颜色的简单方法,在 VCL 中我一直使用 TColorDialog (VCL.Dialogs),但在 FMX 中没有等效项,或者我无法找到它。
我显然可以使用现有组件制作自己的颜色对话框,但我认为可能会有更简单、更优雅的解决方案。我还考虑过直接使用 Windows ChooseColor,但我需要一些关于如何包装它的示例代码;这也不会转化为 Mac,这不是一个直接的问题,但可能会在以后产生问题。
我正在寻找一种让用户选择颜色的简单方法,在 VCL 中我一直使用 TColorDialog (VCL.Dialogs),但在 FMX 中没有等效项,或者我无法找到它。
我显然可以使用现有组件制作自己的颜色对话框,但我认为可能会有更简单、更优雅的解决方案。我还考虑过直接使用 Windows ChooseColor,但我需要一些关于如何包装它的示例代码;这也不会转化为 Mac,这不是一个直接的问题,但可能会在以后产生问题。
对于跨平台解决方案,您可以使用 TColorPanel、TColorPicker 等 FMX 组件构建您自己的对话框。您如何询问 Windows 选择颜色对话框的包装器,这是一个改编自 MSDN 文档的非常简单的示例。
uses
System.UIConsts,
FMX.Platform.Win,
Winapi.Windows,
Winapi.CommDlg;
const
MaxCustomColors = 16;
type
TCustomColors = array[0..MaxCustomColors - 1] of Longint;
procedure TForm1.Button1Click(Sender: TObject);
var
cc : TChooseColor;
acrCustClr: TCustomColors;
hwnd : THandle;
rgbCurrent : DWORD;
begin
FillChar(cc, sizeof(cc), #0);
cc.lStructSize := sizeof(cc);
cc.hwndOwner := FmxHandleToHWND(Self.Handle);
cc.lpCustColors := @acrCustClr;
cc.rgbResult := RGBtoBGR(claYellow);
cc.Flags := CC_FULLOPEN OR CC_RGBINIT;
if (ChooseColor(cc)) then
Rectangle1.Fill.Color:= MakeColor(GetRValue(cc.rgbResult), GetGValue(cc.rgbResult), GetBValue(cc.rgbResult));
end;