📄 sxskinradiobutton.pas
字号:
if Enabled then
begin
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
end;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;
procedure TSXSkinCustomRadioButton.InternalMouseLeave;
begin
if Enabled then
StartGlyphChanging(gcaHighlightOut);
FMouseOver:=False;
if Enabled then
begin
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
end;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;
procedure TSXSkinCustomRadioButton.MouseLeave;
begin
if FMouseOver then
InternalMouseLeave;
inherited;
end;
procedure TSXSkinCustomRadioButton.MouseMove(Shift:TShiftState;X,Y:Integer);
var B:Boolean;
P:TPoint;
begin
inherited;
if Enabled then
begin
P:=Point(X,Y);
B:=(X>=0) and (X<Width) and (Y>=0) and (Y<Height) and CapturesMouseAt(X,Y);
if B<>FMouseOver then
begin
if B then InternalMouseEnter else
InternalMouseLeave;
end;
end;
end;
procedure TSXSkinCustomRadioButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y:Integer);
begin
if Enabled and FMouseOver and (Button=mbLeft) then
begin
StartGlyphChanging(gcaDown);
FDown:=True;
SetFocus;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
end;
inherited;
end;
procedure TSXSkinCustomRadioButton.MouseUp(Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
var OldDown,WasChecked:Boolean;
begin
if Enabled then
begin
OldDown:=FDown;
StartGlyphChanging(gcaUp);
FDown:=False;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
if OldDown and FMouseOver then
begin
WasChecked:=FChecked;
Click;
if Assigned(FOnUserModified) and (not WasChecked) then
FOnUserModified(Self);
end;
end;
inherited;
end;
procedure TSXSkinCustomRadioButton.DoClick;
var A:Integer;
begin
if Visible and Enabled and FDown then
begin
if not FChecked then
begin
FDown:=False;
StartGlyphChanging(gcaCheck);
if Parent<>nil then
begin
for A:=0 to Parent.ControlCount-1 do
begin
if (Parent.Controls[A]<>Self) and (Parent.Controls[A] is TSXSkinCustomRadioButton) and
TSXSkinCustomRadioButton(Parent.Controls[A]).Checked then
begin
TSXSkinCustomRadioButton(Parent.Controls[A]).DoUncheck;
end else
if (Parent.Controls[A]<>Self) and (Parent.Controls[A] is TSXSkinCustomGroupBox) and
(TSXSkinCustomGroupBox(Parent.Controls[A]).GlyphType=gtRadioButton) and
(TSXSkinCustomGroupBox(Parent.Controls[A]).State=cbChecked) then
begin
TSXSkinCustomGroupBox(Parent.Controls[A]).DoUncheck;
end;
end;
end;
FChecked:=True;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
if Assigned(FOnChange) then
FOnChange(Self);
end else
begin
StartGlyphChanging(gcaUp);
FDown:=False;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
end;
end else FDown:=False;
end;
procedure TSXSkinCustomRadioButton.Click;
begin
FDown:=True;
DoClick;
inherited;
end;
procedure TSXSkinCustomRadioButton.InvalidateGlyph;
begin
if HandleAllocated then
InvalidateRect(Handle,@FGlyphRect,False);
end;
procedure TSXSkinCustomRadioButton.DoThreadActions;
begin
if not (csDestroying in ComponentState) then
begin
Inc(FDoneSteps);
if (FThread<>nil) and not FThread.Suspended and
(not HasTransformEffect(FLastRadioButtonTransform) or (FDoneSteps>=FLastRadioButtonTransform.StepsNum)) and
(not HasTransformEffect(FLastGlyphTransform) or (FDoneSteps>=FLastGlyphTransform.StepsNum)) then
begin
FThread.Suspend;
end;
if HasTransformEffect(FLastRadioButtonTransform) and (FDoneSteps<=FLastRadioButtonTransform.StepsNum) then
begin
if HandleAllocated then
InvalidateRect(Handle,nil,False);
end else InvalidateGlyph;
Update;
end;
end;
procedure TSXSkinCustomRadioButton.CreateThreadIfNeeded;
begin
if FThread=nil then
begin
FThread:=TSXSkinCustomRadioButtonThread.Create;
FThread.Control:=Self;
end;
end;
procedure TSXSkinCustomRadioButton.StartGlyphChanging(T:TSXGlyphChangeAction);
var B:TBitmap32;
Rgn:HRGN;
NeedThread:Boolean;
CBTransform:TSXTransformEffectData;
GTransform:TSXTransformEffectData;
begin
GetCurrentTransformEffect(cbtRadioButton,T,CBTransform);
GetCurrentTransformEffect(cbtGlyph,T,GTransform);
NeedThread:=HasTransformEffect(CBTransform) or
HasTransformEffect(GTransform);
if NeedThread then
begin
CreateThreadIfNeeded;
if HasTransformEffect(GTransform) then
B:=CreateCurrentBlendedGlyph else B:=nil;
FLastGlyph.Free;
FLastGlyph:=B;
//
if HasTransformEffect(CBTransform) then
begin
B:=TBitmap32.Create;
B.DrawMode:=dmBlend;
B.CombineMode:=cmMerge;
B.SetSize(Width,Height);
B.Clear(0);
Rgn:=CreateRectRgn(0,0,Width,Height);
PaintCurrentBlendedCBStyle(B,0,0,Rect(0,0,Width,Height),Rgn);
if not (HasTransformEffect(FLastRadioButtonTransform) and (FDoneSteps<FLastRadioButtonTransform.StepsNum)) and
CBTransform.DrawCaption then
PaintCurrentOverStyleCaptionToBitmap(B.Handle,B.BoundsRect,Rect(0,0,Width,Height),Rgn,B,0,0);
DeleteObject(Rgn);
end else B:=nil;
FLastRadioButton.Free;
FLastRadioButton:=B;
//
FDoneSteps:=1;
if FThread.Suspended then
FThread.Resume;
end else
if (FThread<>nil) and not FThread.Suspended then
begin
FDoneSteps:=MaxInt;
FThread.Suspend;
end;
FLastRadioButtonTransform:=CBTransform;
FLastGlyphTransform:=GTransform;
end;
procedure TSXSkinCustomRadioButton.SkinChanged;
begin
if not (csLoading in ComponentState) then
begin
FLastGlyph.Free;
FLastGlyph:=nil;
FLastRadioButton.Free;
FLastRadioButton:=nil;
FTextBitmap.Free;
FTextBitmap:=nil;
if (FThread<>nil) and not FThread.Suspended then
FThread.Suspend;
ResetRadioButtonParams([rbrpText,rbrpGlyph]);
end;
inherited;
end;
function TSXSkinCustomRadioButton.GetCaption:TCaption;
begin
Result:=inherited Caption;
end;
procedure TSXSkinCustomRadioButton.SetCaption(const Value:TCaption);
begin
if csLoading in ComponentState then
begin
inherited Caption:=Value;
exit;
end;
if Caption<>Value then
begin
inherited Caption:=Value;
ResetRadioButtonParams([rbrpText]);
end;
end;
procedure TSXSkinCustomRadioButton.SetBounds(ALeft,ATop,AWidth,AHeight:Integer);
var DoReset:Boolean;
begin
if not (csLoading in ComponentState) then
begin
if FAutoSizeWidth then AWidth:=Width;
if FAutoSizeHeight then AHeight:=Height;
end;
if (ALeft=Left) and (ATop=Top) and (AWidth=Width) and (AHeight=Height) then exit;
DoReset:=((Width<>AWidth) and WordWrap) or ((Height<>AHeight) and (VerticalAlignment<>taAlignTop));
inherited SetBounds(ALeft,ATop,AWidth,AHeight);
if not (csLoading in ComponentState) then
begin
if DoReset then
ResetRadioButtonParams([rbrpText]) else
ResetRadioButtonParams;
end;
end;
procedure TSXSkinCustomRadioButton.InternalSetBounds(ALeft,ATop,AWidth,AHeight:Integer);
begin
inherited SetBounds(ALeft,ATop,AWidth,AHeight);
end;
procedure TSXSkinCustomRadioButton.CMFontChanged(var Message:TMessage);
begin
inherited;
if not (csLoading in ComponentState) then
ResetRadioButtonParams([rbrpTextOnFontChange]);
end;
procedure TSXSkinCustomRadioButton.Loaded;
begin
inherited;
ResetRadioButtonParams([rbrpText,rbrpGlyph]);
end;
procedure TSXSkinCustomRadioButton.WMSetFocus(var Msg:TWMSetFocus);
begin
StartGlyphChanging(gcaFocus);
FLastFocused:=True;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
end;
procedure TSXSkinCustomRadioButton.WMKillFocus(var Msg:TWMKillFocus);
begin
StartGlyphChanging(gcaUnfocus);
FLastFocused:=False;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
if FDown then
begin
StartGlyphChanging(gcaUp);
FDown:=False;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
end;
end;
procedure TSXSkinCustomRadioButton.DoKeyDown(var Msg:TMessage);
begin
inherited;
if Enabled and (Msg.WParam in [VK_SPACE,VK_RETURN]) then
begin
StartGlyphChanging(gcaDown);
FDown:=True;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
end;
end;
procedure TSXSkinCustomRadioButton.DoKeyUp(var Msg:TMessage);
begin
inherited;
if Enabled and FDown then
begin
StartGlyphChanging(gcaUp);
FDown:=False;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
if not Checked and (Msg.WParam in [VK_SPACE,VK_RETURN]) then
begin
Click;
if Assigned(FOnUserModified) then
FOnUserModified(Self);
end;
end;
end;
procedure TSXSkinCustomRadioButton.DoUncheck;
begin
StartGlyphChanging(gcaUncheck);
FChecked:=False;
ResetRadioButtonParams([rbrpTextOnFontChange,rbrpGlyphOnSizeChange,
rbrpGlyphOnStyleChange,rbrpInvalidateOnStyleChange]);
end;
procedure TSXSkinCustomRadioButton.GetCurrentTransformEffect(T:TSXSkinRadioButtonTransform;
Action:TSXGlyphChangeAction;var Effect:TSXTransformEffectData);
var A:Integer;
CBStyle:TSXSkinRadioButtonStyle;
begin
FillChar(Effect,sizeof(Effect),0);
if (SkinLibrary<>nil) and SkinLibrary.CanBeUsed then
begin
A:=SkinLibrary.Styles.GetIndexByName(SkinStyle);
if (A>=0) and (SkinLibrary.Styles[A] is TSXSkinRadioButtonStyle) then
begin
CBStyle:=TSXSkinRadioButtonStyle(SkinLibrary.Styles[A]);
case T of
cbtRadioButton: begin
case Action of
gcaHighlightIn: Effect:=CBStyle.HInRadioButtonEffect;
gcaHighlightOut: Effect:=CBStyle.HOutRadioButtonEffect;
gcaDown: Effect:=CBStyle.DownRadioButtonEffect;
gcaUp: Effect:=CBStyle.UpRadioButtonEffect;
gcaCheck: Effect:=CBStyle.CheckRadioButtonEffect;
gcaUncheck: Effect:=CBStyle.UncheckRadioButtonEffect;
gcaEnable: Effect:=CBStyle.EnableRadioButtonEffect;
gcaDisable: Effect:=CBStyle.DisableRadioButtonEffect;
gcaFocus: Effect:=CBStyle.FocusRadioButtonEffect;
gcaUnfocus: Effect:=CBStyle.UnfocusRadioButtonEffect;
end;
end;
cbtGlyph: begin
case Action of
gcaHighlightIn: Effect:=CBStyle.HInGlyphEffect;
gcaHighlightOut: Effect:=CBStyle.HOutGlyphEffect;
gcaDown: Effect:=CBStyle.DownGlyphEffect;
gcaUp: Effect:=CBStyle.UpGlyphEffect;
gcaCheck: Effect:=CBStyle.CheckGlyphEffect;
gcaUncheck: Effect:=CBStyle.UncheckGlyphEffect;
gcaEnable: Effect:=CBStyle.EnableGlyphEffect;
gcaDisable: Effect:=CBStyle.DisableGlyphEffect;
gcaFocus: Effect:=CBStyle.FocusGlyphEffect;
gcaUnfocus: Effect:=CBStyle.UnfocusGlyphEffect;
end;
end;
end;
end;
end;
end;
procedure TSXSkinCustomRadioButton.ResetRadioButtonParams(Params:TSXSkinRadioButtonResetParams=[]);
var OldGlyphRect:TRect;
OldTextRect:TRect;
GlyphChanged:Boolean;
TextChanged:Boolean;
A,B,Offset:Integer;
RBState:TSXSkinRadioButtonStateParam;
SetRBState:Boolean;
Flags:Cardinal;
GlyphStyle:TSXSkinGeneralStyle;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -