unit mbDeskPickerButton; {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} interface uses {$IFDEF FPC} LCLIntf, LCLType, {$ELSE} Windows, {$ENDIF} SysUtils, Classes, Controls, StdCtrls, Graphics, Forms, ScreenWin; type TmbDeskPickerButton = class(TButton) private FSelColor: TColor; ScreenFrm: TScreenForm; FOnColorPicked: TNotifyEvent; FOnKeyDown: TKeyEvent; FHintFmt: string; FShowScreenHint: boolean; OnWUp, OnWDown: TMouseWheelUpDownEvent; protected procedure StartPicking; procedure ColorPicked(Sender: TObject); procedure ScreenKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure WheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure WheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); public constructor Create(AOwner: TComponent); override; procedure Click; override; property SelectedColor: TColor read FSelColor; published property OnSelColorChange: TNotifyEvent read FOnColorPicked write FOnColorPicked; property OnScreenKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown; property OnSelMouseWheelUp: TMouseWheelUpDownEvent read OnWUp write OnWUp; property OnSelMouseWheelDown: TMouseWheelUpDownEvent read OnWDown write OnWDown; property ScreenHintFormat: string read FHintFmt write FHintFmt; property ShowScreenHint: boolean read FShowScreenHint write FShowScreenHint default false; end; implementation constructor TmbDeskPickerButton.Create(AOwner: TComponent); begin inherited; // DoubleBuffered := true; // ControlStyle := ControlStyle - [csAcceptsControls] + [csOpaque{$IFDEF DELPHI_7_UP}, csParentBackground{$ENDIF}]; FHintFmt := 'RGB(%r, %g, %b)'#13'Hex: %h'; FShowScreenHint := false; end; procedure TmbDeskPickerButton.Click; begin inherited; StartPicking; end; procedure TmbDeskPickerButton.StartPicking; begin ScreenFrm := TScreenForm.Create(Application); try ScreenFrm.OnSelColorChange := ColorPicked; ScreenFrm.OnScreenKeyDown := ScreenKeyDown; ScreenFrm.OnMouseWheelDown := WheelDown; ScreenFrm.OnMouseWheelUp := WheelUp; ScreenFrm.ShowHint := FShowScreenHint; ScreenFrm.FHintFormat := FHintFmt; ScreenFrm.ShowModal; finally ScreenFrm.Free; end; end; procedure TmbDeskPickerButton.ColorPicked(Sender: TObject); begin FSelColor := ScreenFrm.SelectedColor; if Assigned(FOnColorPicked) then FOnColorPicked(Self); end; procedure TmbDeskPickerButton.ScreenKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift); end; procedure TmbDeskPickerButton.WheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if Assigned(OnWUp) then OnWUp(Self, Shift, MousePos, Handled); end; procedure TmbDeskPickerButton.WheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if Assigned(OnWDown) then OnWDown(Self, Shift, MousePos, Handled); end; end.