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

📄 sxskinbutton.pas

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