⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sxskincheckbox.pas

📁 skin components for design of your applicastions
💻 PAS
📖 第 1 页 / 共 4 页
字号:
         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 + -