📄 sxskincheckbox.pas
字号:
DrawTextToBitmap(Bitmap);
end;
end;
end;
end;
procedure TSXSkinCustomCheckBox.PaintRectToBitmap(DestCanvasHandle:HDC;
DestCanvasRect:TRect;Rect:TRect;Rgn:HRGN;Bitmap:TBitmap32;X,Y:Integer;
WithSubItems:Boolean);
begin
if (SkinLibrary<>nil) and SkinLibrary.CanBeUsed then
begin
PaintCurrentBlendedCBStyle(Bitmap,X,Y,Rect,Rgn);
if not (HasTransformEffect(FLastCheckBoxTransform) and (FDoneSteps<FLastCheckBoxTransform.StepsNum) and
FLastCheckBoxTransform.DrawCaption) then
PaintCurrentOverStyleCaptionToBitmap(DestCanvasHandle,DestCanvasRect,Rect,Rgn,Bitmap,X,Y);
end;
inherited;
end;
procedure TSXSkinCustomCheckBox.InternalMouseEnter;
begin
if Enabled then
StartGlyphChanging(gcaHighlightIn);
FMouseOver:=True;
if Enabled then
begin
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
end;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;
procedure TSXSkinCustomCheckBox.InternalMouseLeave;
begin
if Enabled then
StartGlyphChanging(gcaHighlightOut);
FMouseOver:=False;
if Enabled then
begin
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
end;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;
procedure TSXSkinCustomCheckBox.MouseLeave;
begin
if FMouseOver then
InternalMouseLeave;
inherited;
end;
procedure TSXSkinCustomCheckBox.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 TSXSkinCustomCheckBox.MouseDown(Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
if Enabled and FMouseOver and (Button=mbLeft) then
begin
StartGlyphChanging(gcaDown);
FDown:=True;
SetFocus;
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
end;
inherited;
end;
procedure TSXSkinCustomCheckBox.MouseUp(Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
var OldDown:Boolean;
begin
if Enabled then
begin
OldDown:=FDown;
StartGlyphChanging(gcaUp);
FDown:=False;
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
if OldDown and FMouseOver then
begin
Click;
if Assigned(FOnUserModified) then
FOnUserModified(Self);
end;
end;
inherited;
end;
procedure TSXSkinCustomCheckBox.DoClick;
begin
if Visible and Enabled and FDown then
begin
FDown:=False;
if FState=cbChecked then
StartGlyphChanging(gcaUncheck) else
StartGlyphChanging(gcaCheck);
case FState of
cbUnchecked: if FAllowGrayed then
FState:=cbGrayed else FState:=cbChecked;
cbGrayed: FState:=cbChecked;
cbChecked: FState:=cbUnchecked;
end;
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
if Assigned(FOnChange) then
FOnChange(Self);
end else FDown:=False;
end;
procedure TSXSkinCustomCheckBox.Click;
begin
FDown:=True;
DoClick;
inherited;
end;
procedure TSXSkinCustomCheckBox.InvalidateGlyph;
begin
if HandleAllocated then
InvalidateRect(Handle,@FGlyphRect,False);
end;
procedure TSXSkinCustomCheckBox.DoThreadActions;
begin
if not (csDestroying in ComponentState) then
begin
Inc(FDoneSteps);
if (FThread<>nil) and not FThread.Suspended and
(not HasTransformEffect(FLastCheckBoxTransform) or (FDoneSteps>=FLastCheckBoxTransform.StepsNum)) and
(not HasTransformEffect(FLastGlyphTransform) or (FDoneSteps>=FLastGlyphTransform.StepsNum)) then
begin
FThread.Suspend;
end;
if HasTransformEffect(FLastCheckBoxTransform) and (FDoneSteps<=FLastCheckBoxTransform.StepsNum) then
begin
if HandleAllocated then
InvalidateRect(Handle,nil,False);
end else InvalidateGlyph;
Update;
end;
end;
procedure TSXSkinCustomCheckBox.CreateThreadIfNeeded;
begin
if FThread=nil then
begin
FThread:=TSXSkinCustomCheckBoxThread.Create;
FThread.Control:=Self;
end;
end;
procedure TSXSkinCustomCheckBox.StartGlyphChanging(T:TSXGlyphChangeAction);
var B:TBitmap32;
Rgn:HRGN;
NeedThread:Boolean;
CBTransform:TSXTransformEffectData;
GTransform:TSXTransformEffectData;
begin
GetCurrentTransformEffect(cbtCheckBox,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(FLastCheckBoxTransform) and (FDoneSteps<FLastCheckBoxTransform.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;
FLastCheckBox.Free;
FLastCheckBox:=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;
FLastCheckBoxTransform:=CBTransform;
FLastGlyphTransform:=GTransform;
end;
procedure TSXSkinCustomCheckBox.SkinChanged;
begin
if not (csLoading in ComponentState) then
begin
FLastGlyph.Free;
FLastGlyph:=nil;
FLastCheckBox.Free;
FLastCheckBox:=nil;
FTextBitmap.Free;
FTextBitmap:=nil;
if (FThread<>nil) and not FThread.Suspended then
FThread.Suspend;
ResetCheckBoxParams([cbrpText,cbrpGlyph]);
end;
inherited;
end;
function TSXSkinCustomCheckBox.GetCaption:TCaption;
begin
Result:=inherited Caption;
end;
procedure TSXSkinCustomCheckBox.SetCaption(const Value:TCaption);
begin
if csLoading in ComponentState then
begin
inherited Caption:=Value;
exit;
end;
if Caption<>Value then
begin
inherited Caption:=Value;
ResetCheckBoxParams([cbrpText]);
end;
end;
procedure TSXSkinCustomCheckBox.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;
inherited SetBounds(ALeft,ATop,AWidth,AHeight);
if not (csLoading in ComponentState) then
begin
if DoReset then
ResetCheckBoxParams([cbrpText]) else
ResetCheckBoxParams;
end;
end;
procedure TSXSkinCustomCheckBox.InternalSetBounds(ALeft,ATop,AWidth,AHeight:Integer);
begin
inherited SetBounds(ALeft,ATop,AWidth,AHeight);
end;
procedure TSXSkinCustomCheckBox.CMFontChanged(var Message:TMessage);
begin
inherited;
if not (csLoading in ComponentState) then
ResetCheckBoxParams([cbrpTextOnFontChange]);
end;
procedure TSXSkinCustomCheckBox.Loaded;
begin
inherited;
ResetCheckBoxParams([cbrpText,cbrpGlyph]);
end;
procedure TSXSkinCustomCheckBox.WMSetFocus(var Msg:TWMSetFocus);
begin
StartGlyphChanging(gcaFocus);
FLastFocused:=True;
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
end;
procedure TSXSkinCustomCheckBox.WMKillFocus(var Msg:TWMKillFocus);
begin
StartGlyphChanging(gcaUnfocus);
FLastFocused:=False;
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
if FDown then
begin
StartGlyphChanging(gcaUp);
FDown:=False;
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
end;
end;
procedure TSXSkinCustomCheckBox.DoKeyDown(var Msg:TMessage);
begin
inherited;
if Enabled and (Msg.WParam in [VK_SPACE,VK_RETURN]) then
begin
StartGlyphChanging(gcaDown);
FDown:=True;
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
end;
end;
procedure TSXSkinCustomCheckBox.DoKeyUp(var Msg:TMessage);
begin
inherited;
if Enabled and FDown then
begin
StartGlyphChanging(gcaUp);
FDown:=False;
ResetCheckBoxParams([cbrpTextOnFontChange,cbrpGlyphOnSizeChange,
cbrpGlyphOnStyleChange,cbrpInvalidateOnStyleChange]);
if Msg.WParam in [VK_SPACE,VK_RETURN] then
begin
Click;
if Assigned(FOnUserModified) then
FOnUserModified(Self);
end;
end;
end;
procedure TSXSkinCustomCheckBox.GetCurrentTransformEffect(T:TSXSkinCheckBoxTransform;
Action:TSXGlyphChangeAction;var Effect:TSXTransformEffectData);
var A:Integer;
CBStyle:TSXSkinCheckBoxStyle;
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 TSXSkinCheckBoxStyle) then
begin
CBStyle:=TSXSkinCheckBoxStyle(SkinLibrary.Styles[A]);
case T of
cbtCheckBox: begin
case Action of
gcaHighlightIn: Effect:=CBStyle.HInCheckBoxEffect;
gcaHighlightOut: Effect:=CBStyle.HOutCheckBoxEffect;
gcaDown: Effect:=CBStyle.DownCheckBoxEffect;
gcaUp: Effect:=CBStyle.UpCheckBoxEffect;
gcaCheck: Effect:=CBStyle.CheckCheckBoxEffect;
gcaUncheck: Effect:=CBStyle.UncheckCheckBoxEffect;
gcaEnable: Effect:=CBStyle.EnableCheckBoxEffect;
gcaDisable: Effect:=CBStyle.DisableCheckBoxEffect;
gcaFocus: Effect:=CBStyle.FocusCheckBoxEffect;
gcaUnfocus: Effect:=CBStyle.UnfocusCheckBoxEffect;
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 TSXSkinCustomCheckBox.ResetCheckBoxParams(Params:TSXSkinCheckBoxResetParams=[]);
var OldGlyphRect:TRect;
OldTextRect:TRect;
GlyphChanged:Boolean;
TextChanged:Boolean;
A,B,Offset:Integer;
CBState:TSXSkinCheckBoxStateParam;
SetCBState:Boolean;
Flags:Cardinal;
GlyphStyle:TSXSkinGeneralStyle;
Image:TSXSkinStyleImageElement;
AAGlyphOffset:Integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -