📄 sxskinbutton.pas
字号:
Style.DrawToBitmap(Self,CEID_Back,Bitmap,X,Y,Width,Height,Rect,Rgn,SkinLibrary,VComparer);
end;
//
if HasTransformEffect(FLastButtonTransform) and (FDoneSteps<FLastButtonTransform.StepsNum) and
FLastButtonTransform.DrawCaption then
begin
PaintCurrentOverStyleCaptionToBitmap(Bitmap.Handle,Rect,Rect,Rgn,Bitmap,X,Y);
end;
end;
end;
procedure TSXSkinCustomButton.PaintCurrentBlendedBStyle(Bitmap:TBitmap32;X,Y:Integer;Rect:TRect;Rgn:HRGN);
var BB:TBitmap32;
CurButton:TBitmap32;
Rgn2:HRGN;
begin
if HasTransformEffect(FLastButtonTransform) and
(FDoneSteps<FLastButtonTransform.StepsNum) and (FLastButton<>nil) then
begin
CurButton:=TBitmap32.Create;
BB:=TBitmap32.Create;
try
CurButton.DrawMode:=dmBlend;
CurButton.CombineMode:=cmMerge;
BB.DrawMode:=dmBlend;
BB.CombineMode:=cmMerge;
CurButton.SetSize(Width,Height);
CurButton.Clear(0);
Rgn2:=CreateRectRgn(0,0,Width,Height);
PaintCurrentBStyle(CurButton,0,0,Types.Rect(0,0,Width,Height),Rgn2);
DeleteObject(Rgn2);
BB.SetSize(Width,Height);
ApplyTransformEffectToBitmaps(FLastButton,CurButton,FLastButtonTransform,FDoneSteps,BB);
BB.DrawTo(Bitmap,X-Rect.Left,Y-Rect.Top);
finally
BB.Free;
CurButton.Free;
end;
end else PaintCurrentBStyle(Bitmap,X,Y,Rect,Rgn);
end;
procedure TSXSkinCustomButton.PaintCurrentOverStyleCaptionToBitmap(DestCanvasHandle:HDC;
DestCanvasRect:TRect;Rect:TRect;Rgn:HRGN;Bitmap:TBitmap32;X,Y:Integer);
var BState:TSXSkinButtonStateParam;
A,W,H:Integer;
CurGlyph:TBitmap32;
Flags:Cardinal;
RR,TextRect:TRect;
Style:TSXSkinGeneralStyle;
procedure DrawTextToBitmap(Bitmap:TBitmap32);
begin
Bitmap.Font:=Canvas.Font;
if BState.FD.HasShadow then
begin
OffsetRect(TextRect,1,1);
if BState.FD.SmoothLevel=0 then
DrawAlphaText(Bitmap,Caption,TextRect,Flags,BState.FD.ShadowColor) else
DrawSmoothText(Bitmap,Caption,TextRect,Flags,BState.FD.SmoothLevel,BState.FD.ShadowColor);
OffsetRect(TextRect,-1,-1);
end;
if BState.FD.SmoothLevel=0 then
DrawAlphaText(Bitmap,Caption,TextRect,Flags,BState.FD.FontColor) else
DrawSmoothText(Bitmap,Caption,TextRect,Flags,BState.FD.SmoothLevel,BState.FD.FontColor);
end;
begin
if (SkinLibrary<>nil) and SkinLibrary.CanBeUsed then
begin
GetCurrentBState(BState);
//OverStyle
if BState.OverStyle<>'' then
begin
A:=SkinLibrary.Styles.GetGStyleIndex(BState.OverStyle,Width,Height);
if A>=0 then
begin
Style:=TSXSkinGeneralStyle(SkinLibrary.Styles[A]);
Style.DrawToBitmap(Self,CEID_Back,Bitmap,X,Y,Width,Height,Rect,Rgn,SkinLibrary,VComparer);
end;
end;
//Glyph
if RectInRegion(Rgn,FGlyphRect) then
begin
CurGlyph:=CreateCurrentBlendedGlyph;
try
if CurGlyph<>nil then
Bitmap.Draw(X-Rect.Left+FGlyphRect.Left,Y-Rect.Top+FGlyphRect.Top,CurGlyph);
finally
CurGlyph.Free;
end;
end;
//DropDownGlyph
if FDropDown and RectInRegion(Rgn,FDropDownGlyphRect) then
begin
CurGlyph:=CreateCurrentBlendedDropDownGlyph;
try
if CurGlyph<>nil then
Bitmap.Draw(X-Rect.Left+FDropDownGlyphRect.Left,Y-Rect.Top+FDropDownGlyphRect.Top,CurGlyph);
finally
CurGlyph.Free;
end;
end;
//Text
if (Caption<>'') and RectInRegion(Rgn,FTextRect) then
begin
Bitmap.Font:=Canvas.Font;
Flags:=DT_NOPREFIX or DT_NOCLIP or DT_TOP;
case FAlignment of
taLeftJustify: Flags:=Flags or DT_LEFT;
taRightJustify: Flags:=Flags or DT_RIGHT;
taCenter: Flags:=Flags or DT_CENTER;
end;
if FWordWrap then Flags:=Flags or DT_WORDBREAK;
TextRect:=FTextRect;
OffsetRect(TextRect,X-Rect.Left,Y-Rect.Top);
if BState.FD.DoPrepaint and (BState.FD.SmoothLevel>0) and (FTextBitmap=nil) then
begin
FTextBitmap:=TBitmap32.Create;
FTextBitmap.DrawMode:=dmBlend;
FTextBitmap.CombineMode:=cmMerge;
W:=TextRect.Right-TextRect.Left;
H:=TextRect.Bottom-TextRect.Top;
if BState.FD.HasShadow then
begin
Inc(W); Inc(H);
end;
FTextBitmap.SetSize(W,H);
FTextBitmap.Clear(0);
RR:=TextRect;
OffsetRect(TextRect,-TextRect.Left,-TextRect.Top);
DrawTextToBitmap(FTextBitmap);
TextRect:=RR;
end;
if BState.FD.DoPrepaint and (BState.FD.SmoothLevel>0) then
FTextBitmap.DrawTo(Bitmap,TextRect.Left,TextRect.Top) else
DrawTextToBitmap(Bitmap);
end;
end;
end;
procedure TSXSkinCustomButton.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
PaintCurrentBlendedBStyle(Bitmap,X,Y,Rect,Rgn);
if not (HasTransformEffect(FLastButtonTransform) and (FDoneSteps<FLastButtonTransform.StepsNum) and
FLastButtonTransform.DrawCaption) then
PaintCurrentOverStyleCaptionToBitmap(DestCanvasHandle,DestCanvasRect,Rect,Rgn,Bitmap,X,Y);
end;
inherited;
end;
procedure TSXSkinCustomButton.InternalMouseEnter;
begin
if Enabled and not FDown then
StartGlyphChanging(gcaHighlightIn);
FMouseOver:=True;
if Enabled and not FDown then
begin
ResetButtonParams([brpTextOnFontChange,brpGlyphOnStyleChange,
brpDDGlyphOnStyleChange,brpInvalidateOnStyleChange]);
end;
end;
procedure TSXSkinCustomButton.InternalMouseLeave;
begin
if Enabled and not FDown then
StartGlyphChanging(gcaHighlightOut);
FMouseOver:=False;
if Enabled and not FDown then
begin
ResetButtonParams([brpTextOnFontChange,brpGlyphOnStyleChange,
brpDDGlyphOnStyleChange,brpInvalidateOnStyleChange]);
end;
end;
procedure TSXSkinCustomButton.MouseLeave;
begin
if FMouseOver then
InternalMouseLeave;
inherited;
end;
procedure TSXSkinCustomButton.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 TSXSkinCustomButton.MouseDown(Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
var P:TPoint;
begin
if Enabled and FMouseOver and (Button=mbLeft) then
begin
StartGlyphChanging(gcaDown);
FDown:=True;
SetFocus;
ResetButtonParams([brpTextOnFontChange,brpGlyphOnStyleChange,
brpDDGlyphOnStyleChange,brpInvalidateOnStyleChange]);
if FDropDown and Assigned(FDropDownMenu) then
begin
FMouseOver:=False;
Click;
P:=ScreenToClient(Mouse.CursorPos);
SendMessage(Handle,WM_MOUSEMOVE,0,P.X or (P.Y shl 16));
end;
end;
inherited;
end;
procedure TSXSkinCustomButton.MouseUp(Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
var OldDown:Boolean;
P:TPoint;
begin
if Enabled then
begin
OldDown:=FDown;
StartGlyphChanging(gcaUp);
FDown:=False;
ResetButtonParams([brpTextOnFontChange,brpGlyphOnStyleChange,
brpDDGlyphOnStyleChange,brpInvalidateOnStyleChange]);
if OldDown and FMouseOver then
begin
Click;
P:=ScreenToClient(Mouse.CursorPos);
SendMessage(Handle,WM_MOUSEMOVE,0,P.X or (P.Y shl 16));
end;
end;
inherited;
end;
procedure TSXSkinCustomButton.DoClick;
var PT:TPoint;
begin
if Visible and Enabled and FDown then
begin
if FDropDown and Assigned(FDropDownMenu) then
begin
PT:=ClientToScreen(Point(0,Height));
Application.CancelHint;
FDropDownMenu.Popup(PT.X,PT.Y);
FDown:=False;
ResetButtonParams([brpTextOnFontChange,brpGlyphOnStyleChange,
brpDDGlyphOnStyleChange,brpInvalidateOnStyleChange]);
if FCanBeChecked then
Checked:=not Checked;
end else
begin
StartGlyphChanging(gcaUp);
FDown:=False;
ResetButtonParams([brpTextOnFontChange,brpGlyphOnStyleChange,
brpDDGlyphOnStyleChange,brpInvalidateOnStyleChange]);
if FCanBeChecked then
Checked:=not Checked;
if Assigned(FOnClick) then
FOnClick(Self);
end;
end else FDown:=False;
end;
procedure TSXSkinCustomButton.Click;
begin
FDown:=True;
DoClick;
inherited;
end;
procedure TSXSkinCustomButton.InvalidateGlyph;
begin
if HandleAllocated then
InvalidateRect(Handle,@FGlyphRect,False);
end;
procedure TSXSkinCustomButton.DoThreadActions;
begin
if not (csDestroying in ComponentState) then
begin
Inc(FDoneSteps);
if (FThread<>nil) and not FThread.Suspended and
(not HasTransformEffect(FLastButtonTransform) or (FDoneSteps>=FLastButtonTransform.StepsNum)) and
(not HasTransformEffect(FLastGlyphTransform) or (FDoneSteps>=FLastGlyphTransform.StepsNum)) and
(not HasTransformEffect(FLastDDGlyphTransform) or (FDoneSteps>=FLastDDGlyphTransform.StepsNum)) then
begin
FThread.Suspend;
end;
if HasTransformEffect(FLastButtonTransform) and (FDoneSteps<=FLastButtonTransform.StepsNum) then
begin
if HandleAllocated then
InvalidateRect(Handle,nil,False);
end else InvalidateGlyph;
Update;
end;
end;
procedure TSXSkinCustomButton.CreateThreadIfNeeded;
begin
if FThread=nil then
begin
FThread:=TSXSkinCustomButtonThread.Create;
FThread.Control:=Self;
end;
end;
procedure TSXSkinCustomButton.GetCurrentTransformEffect(T:TSXSkinButtonTransform;
Action:TSXGlyphChangeAction;var Effect:TSXTransformEffectData);
var A:Integer;
BStyle:TSXSkinButtonStyle;
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 TSXSkinButtonStyle) then
begin
BStyle:=TSXSkinButtonStyle(SkinLibrary.Styles[A]);
case T of
btButton: begin
case Action of
gcaHighlightIn: Effect:=BStyle.HInButtonEffect;
gcaHighlightOut: Effect:=BStyle.HOutButtonEffect;
gcaDown: Effect:=BStyle.DownButtonEffect;
gcaUp: Effect:=BStyle.UpButtonEffect;
gcaCheck: Effect:=BStyle.CheckButtonEffect;
gcaUncheck: Effect:=BStyle.UncheckButtonEffect;
gcaEnable: Effect:=BStyle.EnableButtonEffect;
gcaDisable: Effect:=BStyle.DisableButtonEffect;
gcaFocus: Effect:=BStyle.FocusButtonEffect;
gcaUnfocus: Effect:=BStyle.UnfocusButtonEffect;
end;
end;
btGlyph: begin
case Action of
gcaHighlightIn: Effect:=BStyle.HInGlyphEffect;
gcaHighlightOut: Effect:=BStyle.HOutGlyphEffect;
gcaDown: Effect:=BStyle.DownGlyphEffect;
gcaUp: Effect:=BStyle.UpGlyphEffect;
gcaCheck: Effect:=BStyle.CheckGlyphEffect;
gcaUncheck: Effect:=BStyle.UncheckGlyphEffect;
gcaEnable: Effect:=BStyle.EnableGlyphEffect;
gcaDisable: Effect:=BStyle.DisableGlyphEffect;
gcaFocus: Effect:=BStyle.FocusGlyphEffect;
gcaUnfocus: Effect:=BStyle.UnfocusGlyphEffect;
end;
end;
btDDGlyph: begin
case Action of
gcaHighlightIn: Effect:=BStyle.HInDDGlyphEffect;
gcaHighlightOut: Effect:=BStyle.HOutDDGlyphEffect;
gcaDown: Effect:=BStyle.DownDDGlyphEffect;
gcaUp: Effect:=BStyle.UpDDGlyphEffect;
gcaCheck: Effect:=BStyle.CheckDDGlyphEffect;
gcaUncheck: Effect:=BStyle.UncheckDDGlyphEffect;
gcaEnable: Effect:=BStyle.EnableDDGlyphEffect;
gcaDisable: Effect:=BStyle.DisableDDGlyphEffect;
gcaFocus: Effect:=BStyle.FocusDDGlyphEffect;
gcaUnfocus: Effect:=BStyle.UnfocusDDGlyphEffect;
end;
end;
end;
end;
end;
end;
procedure TSXSkinCustomButton.StartGlyphChanging(T:TSXGlyphChangeAction);
var B:TBitmap32;
Rgn:HRGN;
NeedThread:Boolean;
BTransform:TSXTransformEffectData;
GTransform:TSXTransformEffectData;
DDGTransform:TSXTransformEffectData;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -