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

📄 sxskinradiobutton.pas

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