Mega Code Archive

 
Categories / Delphi / VCL
 

XpBitBtn

Title: xpBitBtn Question: XpBitBtn This Component Is Complete But Only For stxpBlue Style Answer: unit HbtXpBitBtn; {$S-,W-,R-,H+,X+} {$C PRELOAD} interface uses Windows, Messages, Classes, Controls, Forms, Graphics, StdCtrls, ExtCtrls, CommCtrl; Const HbtXPButtonVersion=$0100;// ** 1.00 ** type TXpStyle =(StxpBlue ,StxpSilver ,StxpOliveGreen,stCoughDropLicorice, stCoughDropBerry,stCoughDropCherry,stCoughDropCinnamon, stCoughDropGrape,stCoughDropLime,stCoughDropOrange,stGucciBlue, stGucciGreen,StPearl); TButtonLayout = (blGlyphLeft, blGlyphRight, blGlyphTop, blGlyphBottom); TButtonState = (bsUp, bsDisabled, bsDown, bsExclusive); TButtonStyle = (bsAutoDetect, bsWin31, bsNew); TNumGlyphs = 1..4; TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bkIgnore, bkAll); //---------------------------------------------------------------------------- HbtRGBArray = array[0..2] of Byte; HbtColor = array of TColor; THbtXpBitBtn = class(TButton) private FCanvas: TCanvas; FRect : TRect; Bmp: TBitmap; FGlyph: Pointer; FNumGlyphs:Byte; FBorderColor:TColor; FMouseInColor :TColor; FFocusHighlightColor :Tcolor; FHighLightColor :Tcolor; FPushHighLightColor: Tcolor; FLeftTopColor:TColor; FMiddleColor:Tcolor; FRightDownColor:TColor; FMixColor:TColor; FVersion :Integer; FxpStyle: TXpStyle; FStyle: TButtonStyle; FKind: TBitBtnKind; FLayout: TButtonLayout; FSpacing: Integer; FMargin: Integer; IsFocused: Boolean; FModifiedGlyph: Boolean; FMouseInControl: Boolean; procedure DrawButton(thisRect: TRect; State: UINT); Procedure SetGradiantDefualt(Var thisCanvas:TCanvas;Var thisRect:Trect); Procedure SetGradiantMouseIn(Var thisCanvas:TCanvas;Var thisRect:Trect); Procedure SetGradiantPush(Var thisCanvas:TCanvas;Var thisRect:Trect); Procedure SetGradiantDisabled(Var thisCanvas:TCanvas;Var thisRect:Trect); function GetGlyph: TBitmap; function GetNumGlyphs: TNumGlyphs; procedure SetGlyph(Value: TBitmap); procedure SetNumGlyphs(Value: TNumGlyphs); procedure GlyphChanged(Sender: TObject); function IsCustom: Boolean; function IsCustomCaption: Boolean; procedure SetStyle(Value: TButtonStyle); procedure SetKind(Value: TBitBtnKind); function GetKind: TBitBtnKind; procedure SetLayout(Value: TButtonLayout); procedure SetSpacing(Value: Integer); procedure SetMargin(Value: Integer); procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM; procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; procedure WMLButtonDblClk(var Message: TWMLButtonDblClk);message WM_LBUTTONDBLCLK; function getVersion: String; procedure SetBorderColor(const Value: TColor); procedure SetFocuseHighlightColore(const Value: Tcolor); procedure SetMouseInColor(const Value: TColor); procedure SetPushHighLightColor(const Value: Tcolor); procedure SetVersion(const Value: String); procedure SetxpStyle(const Value: TXpStyle); procedure sethighLightColor(const Value: Tcolor); protected FState: TButtonState; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; procedure CreateHandle; override; procedure CreateParams(var Params: TCreateParams); override; function GetPalette: HPALETTE; override; procedure SetButtonStyle(ADefault: Boolean); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Click; override; published Property xpStyle : TXpStyle Read FxpStyle Write SetxpStyle default stxpBlue; Property Version:String Read getVersion Write SetVersion; Property BorderColor : TColor Read FBorderColor Write SetBorderColor default clNavy; property MouseInColor : TColor Read FMouseInColor Write SetMouseInColor Default $000097E5; Property FocusHighlightColor : Tcolor Read FFocusHighlightColor Write SetFocuseHighlightColore Default $00EE8269; Property PushHighLightColor : Tcolor Read FPushHighLightColor Write SetPushHighLightColor Default ClWhite; Property HighLightColor : Tcolor Read FHighLightColor Write sethighLightColor Default Clwhite; property Action; property Anchors; property BiDiMode; property Cancel stored IsCustom; property Caption stored IsCustomCaption; property Constraints; property Default stored IsCustom; property Enabled; property Glyph: TBitmap read GetGlyph write SetGlyph stored IsCustom; property Kind: TBitBtnKind read GetKind write SetKind default bkCustom; property Layout: TButtonLayout read FLayout write SetLayout default blGlyphLeft; property Margin: Integer read FMargin write SetMargin default -1; property ModalResult stored IsCustom; property NumGlyphs: TNumGlyphs read GetNumGlyphs write SetNumGlyphs stored IsCustom default 1; property ParentShowHint; property ParentBiDiMode; property ShowHint; //property Style: TButtonStyle read FStyle write SetStyle default bsAutoDetect; property Spacing: Integer read FSpacing write SetSpacing default 4; property TabOrder; property TabStop; property Visible; property OnEnter; property OnExit; end; Procedure Register; implementation uses Consts, SysUtils, ActnList, ImgList,DrawUtils,themes, DateUtils; { THbtXpBitBtn data } var BitBtnResNames: array[TBitBtnKind] of PChar = ( nil, 'BBOK', 'BBCANCEL', 'BBHELP', 'BBYES', 'BBNO', 'BBCLOSE', 'BBABORT', 'BBRETRY', 'BBIGNORE', 'BBALL'); BitBtnModalResults: array[TBitBtnKind] of TModalResult = ( 0, mrOk, mrCancel, 0, mrYes, mrNo, 0, mrAbort, mrRetry, mrIgnore, mrAll); var BitBtnGlyphs: array[TBitBtnKind] of TBitmap; function GetBitBtnGlyph(Kind: TBitBtnKind): TBitmap; begin if BitBtnGlyphs[Kind] = nil then begin BitBtnGlyphs[Kind] := TBitmap.Create; BitBtnGlyphs[Kind].LoadFromResourceName(HInstance, BitBtnResNames[Kind]); end; Result := BitBtnGlyphs[Kind]; end; type TGlyphList = class(TImageList) private Used: TBits; FCount: Integer; function AllocateIndex: Integer; public constructor CreateSize(AWidth, AHeight: Integer); destructor Destroy; override; function AddMasked(Image: TBitmap; MaskColor: TColor): Integer; procedure Delete(Index: Integer); property Count: Integer read FCount; end; TGlyphCache = class private GlyphLists: TList; public constructor Create; destructor Destroy; override; function GetList(AWidth, AHeight: Integer): TGlyphList; procedure ReturnList(List: TGlyphList); function Empty: Boolean; end; TButtonGlyph = class private FOriginal: TBitmap; FGlyphList: TGlyphList; FIndexs: array[TButtonState] of Integer; FTransparentColor: TColor; FNumGlyphs: TNumGlyphs; FOnChange: TNotifyEvent; procedure GlyphChanged(Sender: TObject); procedure SetGlyph(Value: TBitmap); procedure SetNumGlyphs(Value: TNumGlyphs); procedure Invalidate; function CreateButtonGlyph(State: TButtonState): Integer; //-------------------------------------------------------------------------- procedure DrawButtonGlyph(Canvas: TCanvas; const GlyphPos: TPoint; State: TButtonState; Transparent: Boolean);Overload; procedure DrawButtonGlyph(Canvas: TCanvas; const GlyphPos: TPoint; State: TButtonState; Transparent: Boolean;UseOffset:Boolean);Overload; //-------------------------------------------------------------------------- procedure DrawButtonText(Canvas: TCanvas; const Caption: string; TextBounds: TRect; State: TButtonState; BiDiFlags: Longint);Overload; procedure DrawButtonText(Canvas: TCanvas; const Caption: string; TextBounds: TRect; State: TButtonState; BiDiFlags: Longint;UseOffset:Boolean);Overload; //-------------------------------------------------------------------------- procedure CalcButtonLayout(Canvas: TCanvas; const Client: TRect; const Offset: TPoint; const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer; var GlyphPos: TPoint; var TextBounds: TRect; BiDiFlags: Longint); //-------------------------------------------------------------------------- public constructor Create; destructor Destroy; override; { return the text rectangle } //-------------------------------------------------------------------------- function Draw(Canvas: TCanvas; const Client: TRect; const Offset: TPoint; const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer; State: TButtonState; Transparent: Boolean; BiDiFlags: Longint): TRect;Overload; function Draw(Canvas: TCanvas; const Client: TRect; const Offset: TPoint; const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer; State: TButtonState; Transparent: Boolean; BiDiFlags: Longint;UseOffset:Boolean): TRect;OverLoad; //-------------------------------------------------------------------------- property Glyph: TBitmap read FOriginal write SetGlyph; property NumGlyphs: TNumGlyphs read FNumGlyphs write SetNumGlyphs; property OnChange: TNotifyEvent read FOnChange write FOnChange; end; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //--------------------------- { TGlyphList } ----------------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ constructor TGlyphList.CreateSize(AWidth, AHeight: Integer); begin inherited CreateSize(AWidth, AHeight); Used := TBits.Create; end; //------------------------------------------------------------------------------ destructor TGlyphList.Destroy; begin Used.Free; inherited Destroy; end; //------------------------------------------------------------------------------ function TGlyphList.AllocateIndex: Integer; begin Result := Used.OpenBit; if Result = Used.Size then begin Result := inherited Add(nil, nil); Used.Size := Result + 1; end; Used[Result] := True; end; //------------------------------------------------------------------------------ function TGlyphList.AddMasked(Image: TBitmap; MaskColor: TColor): Integer; begin Result := AllocateIndex; ReplaceMasked(Result, Image, MaskColor); Inc(FCount); end; //------------------------------------------------------------------------------ procedure TGlyphList.Delete(Index: Integer); begin if Used[Index] then begin Dec(FCount); Used[Index] := False; end; end; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------ { TGlyphCache } ------------------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ constructor TGlyphCache.Create; begin inherited Create; GlyphLists := TList.Create; end; //------------------------------------------------------------------------------ destructor TGlyphCache.Destroy; begin GlyphLists.Free; inherited Destroy; end; //------------------------------------------------------------------------------ function TGlyphCache.GetList(AWidth, AHeight: Integer): TGlyphList; var I: Integer; begin for I := GlyphLists.Count - 1 downto 0 do begin Result := GlyphLists[I]; with Result do if (AWidth = Width) and (AHeight = Height) then Exit; end; Result := TGlyphList.CreateSize(AWidth, AHeight); GlyphLists.Add(Result); end; //------------------------------------------------------------------------------ procedure TGlyphCache.ReturnList(List: TGlyphList); begin if List = nil then Exit; if List.Count = 0 then begin GlyphLists.Remove(List); List.Free; end; end; //------------------------------------------------------------------------------ function TGlyphCache.Empty: Boolean; begin Result := GlyphLists.Count = 0; end; //------------------------------------------------------------------------------ var GlyphCache: TGlyphCache = nil; ButtonCount: Integer = 0; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //---------------------------- { TButtonGlyph } -------------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ constructor TButtonGlyph.Create; var I: TButtonState; begin inherited Create; FOriginal := TBitmap.Create; FOriginal.OnChange := GlyphChanged; FTransparentColor := clOlive; FNumGlyphs := 1; for I := Low(I) to High(I) do FIndexs[I] := -1; if GlyphCache = nil then GlyphCache := TGlyphCache.Create; end; //------------------------------------------------------------------------------ destructor TButtonGlyph.Destroy; begin FOriginal.Free; Invalidate; if Assigned(GlyphCache) and GlyphCache.Empty then begin GlyphCache.Free; GlyphCache := nil; end; inherited Destroy; end; //------------------------------------------------------------------------------ procedure TButtonGlyph.Invalidate; var I: TButtonState; begin for I := Low(I) to High(I) do begin if FIndexs[I] -1 then FGlyphList.Delete(FIndexs[I]); FIndexs[I] := -1; end; GlyphCache.ReturnList(FGlyphList); FGlyphList := nil; end; //------------------------------------------------------------------------------ procedure TButtonGlyph.GlyphChanged(Sender: TObject); begin if Sender = FOriginal then begin FTransparentColor := FOriginal.TransparentColor; Invalidate; if Assigned(FOnChange) then FOnChange(Self); end; end; //------------------------------------------------------------------------------ procedure TButtonGlyph.SetGlyph(Value: TBitmap); var Glyphs: Integer; begin Invalidate; FOriginal.Assign(Value); if (Value nil) and (Value.Height 0) then begin FTransparentColor := Value.TransparentColor; if Value.Width mod Value.Height = 0 then begin Glyphs := Value.Width div Value.Height; if Glyphs 4 then Glyphs := 1; SetNumGlyphs(Glyphs); end; end; end; //------------------------------------------------------------------------------ procedure TButtonGlyph.SetNumGlyphs(Value: TNumGlyphs); begin if (Value FNumGlyphs) and (Value 0) then begin Invalidate; FNumGlyphs := Value; GlyphChanged(Glyph); end; end; //------------------------------------------------------------------------------ function TButtonGlyph.CreateButtonGlyph(State: TButtonState): Integer; const ROP_DSPDxax = $00E20746; var TmpImage, DDB, MonoBmp: TBitmap; IWidth, IHeight: Integer; IRect, ORect: TRect; I: TButtonState; DestDC: HDC; begin if (State = bsDown) and (NumGlyphs Result := FIndexs[State]; if Result -1 then Exit; if (FOriginal.Width or FOriginal.Height) = 0 then Exit; IWidth := FOriginal.Width div FNumGlyphs; IHeight := FOriginal.Height; if FGlyphList = nil then begin if GlyphCache = nil then GlyphCache := TGlyphCache.Create; FGlyphList := GlyphCache.GetList(IWidth, IHeight); end; TmpImage := TBitmap.Create; try TmpImage.Width := IWidth; TmpImage.Height := IHeight; IRect := Rect(0, 0, IWidth, IHeight); TmpImage.Canvas.Brush.Color := clBtnFace; TmpImage.Palette := CopyPalette(FOriginal.Palette); I := State; if Ord(I) = NumGlyphs then I := bsUp; ORect := Rect(Ord(I) * IWidth, 0, (Ord(I) + 1) * IWidth, IHeight); case State of bsUp, bsDown, bsExclusive: begin TmpImage.Canvas.CopyRect(IRect, FOriginal.Canvas, ORect); if FOriginal.TransparentMode = tmFixed then FIndexs[State] := FGlyphList.AddMasked(TmpImage, FTransparentColor) else FIndexs[State] := FGlyphList.AddMasked(TmpImage, clDefault); end; bsDisabled: begin MonoBmp := nil; DDB := nil; try MonoBmp := TBitmap.Create; DDB := TBitmap.Create; DDB.Assign(FOriginal); DDB.HandleType := bmDDB; if NumGlyphs 1 then with TmpImage.Canvas do begin { Change white & gray to clBtnHighlight and clBtnShadow } CopyRect(IRect, DDB.Canvas, ORect); MonoBmp.Monochrome := True; MonoBmp.Width := IWidth; MonoBmp.Height := IHeight; { Convert white to clBtnHighlight } DDB.Canvas.Brush.Color := clWhite; MonoBmp.Canvas.CopyRect(IRect, DDB.Canvas, ORect); Brush.Color := clBtnHighlight; DestDC := Handle; SetTextColor(DestDC, clBlack); SetBkColor(DestDC, clWhite); BitBlt(DestDC, 0, 0, IWidth, IHeight, MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); { Convert gray to clBtnShadow } DDB.Canvas.Brush.Color := clGray; MonoBmp.Canvas.CopyRect(IRect, DDB.Canvas, ORect); Brush.Color := clBtnShadow; DestDC := Handle; SetTextColor(DestDC, clBlack); SetBkColor(DestDC, clWhite); BitBlt(DestDC, 0, 0, IWidth, IHeight, MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); { Convert transparent color to clBtnFace } DDB.Canvas.Brush.Color := ColorToRGB(FTransparentColor); MonoBmp.Canvas.CopyRect(IRect, DDB.Canvas, ORect); Brush.Color := clBtnFace; DestDC := Handle; SetTextColor(DestDC, clBlack); SetBkColor(DestDC, clWhite); BitBlt(DestDC, 0, 0, IWidth, IHeight, MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); end else begin { Create a disabled version } with MonoBmp do begin Assign(FOriginal); HandleType := bmDDB; Canvas.Brush.Color := clBlack; Width := IWidth; if Monochrome then begin Canvas.Font.Color := clWhite; Monochrome := False; Canvas.Brush.Color := clWhite; end; Monochrome := True; end; with TmpImage.Canvas do begin Brush.Color := clBtnFace; FillRect(IRect); Brush.Color := clBtnHighlight; SetTextColor(Handle, clBlack); SetBkColor(Handle, clWhite); BitBlt(Handle, 1, 1, IWidth, IHeight, MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); Brush.Color := clBtnShadow; SetTextColor(Handle, clBlack); SetBkColor(Handle, clWhite); BitBlt(Handle, 0, 0, IWidth, IHeight, MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); end; end; finally DDB.Free; MonoBmp.Free; end; FIndexs[State] := FGlyphList.AddMasked(TmpImage, clDefault); end; end; finally TmpImage.Free; end; Result := FIndexs[State]; FOriginal.Dormant; end; //------------------------------------------------------------------------------ procedure TButtonGlyph.DrawButtonGlyph(Canvas: TCanvas; const GlyphPos: TPoint; State: TButtonState; Transparent: Boolean); var Index: Integer; R: TRect; begin if FOriginal = nil then Exit; if (FOriginal.Width = 0) or (FOriginal.Height = 0) then Exit; Index := CreateButtonGlyph(State); with GlyphPos do begin if Transparent or (State = bsExclusive) then begin Canvas.Brush.Style := bsClear; ImageList_DrawEx(FGlyphList.Handle, Index, Canvas.Handle, X, Y, 0, 0, clNone, clNone, ILD_Transparent) end else ImageList_DrawEx(FGlyphList.Handle, Index, Canvas.Handle, X, Y, 0, 0, ColorToRGB(clBtnFace), clNone, ILD_Normal); end; end; procedure TButtonGlyph.DrawButtonText(Canvas: TCanvas; const Caption: string; TextBounds: TRect; State: TButtonState; BiDiFlags: LongInt); begin with Canvas do begin Brush.Style := bsClear; if State = bsDisabled then begin OffsetRect(TextBounds, 1, 1); Font.Color := clBtnHighlight; DrawText(Handle, PChar(Caption), Length(Caption), TextBounds,DT_CENTER or DT_VCENTER or BiDiFlags); OffsetRect(TextBounds, -1, -1); Font.Color := clBtnShadow; DrawText(Handle, PChar(Caption), Length(Caption), TextBounds,DT_CENTER or DT_VCENTER or BiDiFlags); end else DrawText(Handle, PChar(Caption), Length(Caption), TextBounds,DT_CENTER or DT_VCENTER or BiDiFlags); end; end; procedure TButtonGlyph.CalcButtonLayout(Canvas: TCanvas; const Client: TRect; const Offset: TPoint; const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer; var GlyphPos: TPoint; var TextBounds: TRect; BiDiFlags: LongInt); var TextPos: TPoint; ClientSize, GlyphSize, TextSize: TPoint; TotalSize: TPoint; begin if (BiDiFlags and DT_RIGHT) = DT_RIGHT then if Layout = blGlyphLeft then Layout := blGlyphRight else if Layout = blGlyphRight then Layout := blGlyphLeft; { calculate the item sizes } ClientSize := Point(Client.Right - Client.Left, Client.Bottom - Client.Top); if FOriginal nil then GlyphSize := Point(FOriginal.Width div FNumGlyphs, FOriginal.Height) else GlyphSize := Point(0, 0); if Length(Caption) 0 then begin TextBounds := Rect(0, 0, Client.Right - Client.Left, 0); DrawText(Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CALCRECT or BiDiFlags); TextSize := Point(TextBounds.Right - TextBounds.Left, TextBounds.Bottom - TextBounds.Top); end else begin TextBounds := Rect(0, 0, 0, 0); TextSize := Point(0,0); end; { If the layout has the glyph on the right or the left, then both the text and the glyph are centered vertically. If the glyph is on the top or the bottom, then both the text and the glyph are centered horizontally.} if Layout in [blGlyphLeft, blGlyphRight] then begin GlyphPos.Y := (ClientSize.Y - GlyphSize.Y + 1) div 2; TextPos.Y := (ClientSize.Y - TextSize.Y + 1) div 2; end else begin GlyphPos.X := (ClientSize.X - GlyphSize.X + 1) div 2; TextPos.X := (ClientSize.X - TextSize.X + 1) div 2; end; { if there is no text or no bitmap, then Spacing is irrelevant } if (TextSize.X = 0) or (GlyphSize.X = 0) then Spacing := 0; { adjust Margin and Spacing } if Margin = -1 then begin if Spacing = -1 then begin TotalSize := Point(GlyphSize.X + TextSize.X, GlyphSize.Y + TextSize.Y); if Layout in [blGlyphLeft, blGlyphRight] then Margin := (ClientSize.X - TotalSize.X) div 3 else Margin := (ClientSize.Y - TotalSize.Y) div 3; Spacing := Margin; end else begin TotalSize := Point(GlyphSize.X + Spacing + TextSize.X, GlyphSize.Y + Spacing + TextSize.Y); if Layout in [blGlyphLeft, blGlyphRight] then Margin := (ClientSize.X - TotalSize.X + 1) div 2 else Margin := (ClientSize.Y - TotalSize.Y + 1) div 2; end; end else begin if Spacing = -1 then begin TotalSize := Point(ClientSize.X - (Margin + GlyphSize.X), ClientSize.Y - (Margin + GlyphSize.Y)); if Layout in [blGlyphLeft, blGlyphRight] then Spacing := (TotalSize.X - TextSize.X) div 2 else Spacing := (TotalSize.Y - TextSize.Y) div 2; end; end; case Layout of blGlyphLeft: begin GlyphPos.X := Margin; TextPos.X := GlyphPos.X + GlyphSize.X + Spacing; end; blGlyphRight: begin GlyphPos.X := ClientSize.X - Margin - GlyphSize.X; TextPos.X := GlyphPos.X - Spacing - TextSize.X; end; blGlyphTop: begin GlyphPos.Y := Margin; TextPos.Y := GlyphPos.Y + GlyphSize.Y + Spacing; end; blGlyphBottom: begin GlyphPos.Y := ClientSize.Y - Margin - GlyphSize.Y; TextPos.Y := GlyphPos.Y - Spacing - TextSize.Y; end; end; { fixup the result variables } with GlyphPos do begin Inc(X, Client.Left + Offset.X); Inc(Y, Client.Top + Offset.Y); end; OffsetRect(TextBounds, TextPos.X + Client.Left + Offset.X, TextPos.Y + Client.Top + Offset.Y); end; function TButtonGlyph.Draw(Canvas: TCanvas; const Client: TRect; const Offset: TPoint; const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer; State: TButtonState; Transparent: Boolean; BiDiFlags: LongInt): TRect; var GlyphPos: TPoint; begin CalcButtonLayout(Canvas, Client, Offset, Caption, Layout, Margin, Spacing, GlyphPos, Result, BiDiFlags); DrawButtonGlyph(Canvas, GlyphPos, State, Transparent); DrawButtonText(Canvas, Caption, Result, State, BiDiFlags); end; { TSpeedButtonActionLink } procedure TButtonGlyph.DrawButtonGlyph(Canvas: TCanvas; const GlyphPos: TPoint; State: TButtonState;Transparent: Boolean;UseOffset:Boolean); var Index: Integer; R: TRect; begin if FOriginal = nil then Exit; if (FOriginal.Width = 0) or (FOriginal.Height = 0) then Exit; Index := CreateButtonGlyph(State); with GlyphPos do begin if Transparent or (State = bsExclusive) then begin Canvas.Brush.Style := bsClear; if UseOffset Then ImageList_DrawEx(FGlyphList.Handle, Index, Canvas.Handle, X+1, Y+1, 0, 0, clNone, clNone, ILD_Transparent) else ImageList_DrawEx(FGlyphList.Handle, Index, Canvas.Handle, X, Y, 0, 0, clNone, clNone, ILD_Transparent); end else begin if UseOffset Then ImageList_DrawEx(FGlyphList.Handle, Index, Canvas.Handle, X+1, Y+1, 0, 0, ColorToRGB(clBtnFace), clNone, ILD_Normal) else ImageList_DrawEx(FGlyphList.Handle, Index, Canvas.Handle, X, Y, 0, 0, ColorToRGB(clBtnFace), clNone, ILD_Normal); end;//end of else end; end; function TButtonGlyph.Draw(Canvas: TCanvas; const Client: TRect; const Offset: TPoint; const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer; State: TButtonState; Transparent: Boolean; BiDiFlags: Integer; UseOffset: Boolean): TRect; var GlyphPos: TPoint; begin CalcButtonLayout(Canvas, Client, Offset, Caption, Layout, Margin, Spacing, GlyphPos, Result, BiDiFlags); DrawButtonGlyph(Canvas, GlyphPos, State, Transparent,UseOffset); DrawButtonText(Canvas, Caption, Result, State, BiDiFlags,UseOffset); end; procedure TButtonGlyph.DrawButtonText(Canvas: TCanvas; const Caption: string; TextBounds: TRect; State: TButtonState; BiDiFlags: Integer; UseOffset: Boolean); begin with Canvas do begin Brush.Style := bsClear; if State = bsDisabled then begin OffsetRect(TextBounds, 1, 1); Font.Color := clBtnHighlight; DrawText(Handle, PChar(Caption), Length(Caption), TextBounds,DT_CENTER or DT_VCENTER or BiDiFlags); OffsetRect(TextBounds, -1, -1); Font.Color := clBtnShadow; DrawText(Handle, PChar(Caption), Length(Caption), TextBounds,DT_CENTER or DT_VCENTER or BiDiFlags); end else begin if UseOffset Then OffsetRect(TextBounds,1,1); DrawText(Handle, PChar(Caption), Length(Caption), TextBounds,DT_CENTER or DT_VCENTER or BiDiFlags); end; end; end; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------ { THbtXpBitBtn } --------------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ constructor THbtXpBitBtn.Create(AOwner: TComponent); begin FGlyph := TButtonGlyph.Create; TButtonGlyph(FGlyph).OnChange := GlyphChanged; inherited Create(AOwner); FCanvas := TCanvas.Create; FStyle := bsAutoDetect; FxpStyle := StxpBlue; FBorderColor := ClNavy; FMouseInColor := $000097E5; FFocusHighlightColor := $00EE8269; FHighLightColor := ClWhite; FVersion := HbtXPButtonVersion; FPushHighLightColor := Clwhite; FKind := bkCustom; FLayout := blGlyphLeft; FSpacing := 4; FMargin := -1; FNumGlyphs:=1; Height:=23; width:=80; ControlStyle := ControlStyle + [csReflector]; DoubleBuffered := True; end; destructor THbtXpBitBtn.Destroy; begin inherited Destroy; TButtonGlyph(FGlyph).Free; FCanvas.Free; end; procedure THbtXpBitBtn.CreateHandle; var State: TButtonState; begin if Enabled then State := bsUp else State := bsDisabled; inherited CreateHandle; TButtonGlyph(FGlyph).CreateButtonGlyph(State); end; procedure THbtXpBitBtn.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); with Params do Style := Style or BS_OWNERDRAW; end; procedure THbtXpBitBtn.SetButtonStyle(ADefault: Boolean); begin if ADefault IsFocused then begin IsFocused := ADefault; Refresh; end; end; procedure THbtXpBitBtn.Click; var Form: TCustomForm; Control: TWinControl; begin case FKind of bkClose: begin Form := GetParentForm(Self); if Form nil then Form.Close else inherited Click; end; bkHelp: begin Control := Self; while (Control nil) and (Control.HelpContext = 0) do Control := Control.Parent; if Control nil then Application.HelpContext(Control.HelpContext) else inherited Click; end; else inherited Click; end; end; procedure THbtXpBitBtn.CNMeasureItem(var Message: TWMMeasureItem); begin with Message.MeasureItemStruct^ do begin itemWidth := Width; itemHeight := Height; end; end; procedure THbtXpBitBtn.CNDrawItem(var Message: TWMDrawItem); Var SaveIndex:Integer; begin with Message.DrawItemStruct^ do begin SaveIndex := SaveDC(hDC); FCanvas.Lock; try FCanvas.Handle := hDC; FCanvas.Font := Font; FCanvas.Brush := Brush; DrawButton(rcItem, itemState); finally FCanvas.Handle := 0; FCanvas.Unlock; RestoreDC(hDC, SaveIndex); end; end; Message.Result := 1; end; procedure THbtXpBitBtn.CMFontChanged(var Message: TMessage); begin inherited; Invalidate; end; procedure THbtXpBitBtn.CMEnabledChanged(var Message: TMessage); begin inherited; Invalidate; end; procedure THbtXpBitBtn.WMLButtonDblClk(var Message: TWMLButtonDblClk); begin Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos)); end; function THbtXpBitBtn.GetPalette: HPALETTE; begin Result := Glyph.Palette; end; procedure THbtXpBitBtn.SetGlyph(Value: TBitmap); begin TButtonGlyph(FGlyph).Glyph := Value as TBitmap; with (Value as TBitmap).Canvas do begin Brush.Style := bsClear; end; FModifiedGlyph := True; Invalidate; end; function THbtXpBitBtn.GetGlyph: TBitmap; begin Result := TButtonGlyph(FGlyph).Glyph; end; procedure THbtXpBitBtn.GlyphChanged(Sender: TObject); begin Invalidate; end; function THbtXpBitBtn.IsCustom: Boolean; begin Result := Kind = bkCustom; end; procedure THbtXpBitBtn.SetStyle(Value: TButtonStyle); begin if Value FStyle then begin FStyle := Value; Invalidate; end; end; procedure THbtXpBitBtn.SetKind(Value: TBitBtnKind); begin if Value FKind then begin if Value bkCustom then begin Default := Value in [bkOK, bkYes]; Cancel := Value in [bkCancel, bkNo]; ModalResult := BitBtnModalResults[Value]; TButtonGlyph(FGlyph).Glyph := GetBitBtnGlyph(Value); NumGlyphs := 2; FModifiedGlyph := False; end; FKind := Value; Invalidate; end; end; function THbtXpBitBtn.IsCustomCaption: Boolean; begin // end; function THbtXpBitBtn.GetKind: TBitBtnKind; begin if FKind bkCustom then if ((FKind in [bkOK, bkYes]) xor Default) or ((FKind in [bkCancel, bkNo]) xor Cancel) or (ModalResult BitBtnModalResults[FKind]) or FModifiedGlyph then FKind := bkCustom; Result := FKind; end; procedure THbtXpBitBtn.SetLayout(Value: TButtonLayout); begin if FLayout Value then begin FLayout := Value; Invalidate; end; end; function THbtXpBitBtn.GetNumGlyphs: TNumGlyphs; begin Result := TButtonGlyph(FGlyph).NumGlyphs; end; procedure THbtXpBitBtn.SetNumGlyphs(Value: TNumGlyphs); begin if Value else if Value 4 then Value := 4; if Value TButtonGlyph(FGlyph).NumGlyphs then begin TButtonGlyph(FGlyph).NumGlyphs := Value; Invalidate; end; end; procedure THbtXpBitBtn.SetSpacing(Value: Integer); begin if FSpacing Value then begin FSpacing := Value; Invalidate; end; end; procedure THbtXpBitBtn.SetMargin(Value: Integer); begin if (Value FMargin) and (Value = - 1) then begin FMargin := Value; Invalidate; end; end; procedure THbtXpBitBtn.ActionChange(Sender: TObject; CheckDefaults: Boolean); procedure CopyImage(ImageList: TCustomImageList; Index: Integer); begin with Glyph do begin Width := ImageList.Width; Height := ImageList.Height; Canvas.Brush.Color := clFuchsia;//! for lack of a better color Canvas.FillRect(Rect(0,0, Width, Height)); ImageList.Draw(Canvas, 0, 0, Index); end; end; begin inherited ActionChange(Sender, CheckDefaults); if Sender is TCustomAction then with TCustomAction(Sender) do begin { Copy image from action's imagelist } if (Glyph.Empty) and (ActionList nil) and (ActionList.Images nil) and (ImageIndex = 0) and (ImageIndex CopyImage(ActionList.Images, ImageIndex); end; end; procedure DestroyLocals; far; var I: TBitBtnKind; begin for I := Low(TBitBtnKind) to High(TBitBtnKind) do BitBtnGlyphs[I].Free; end; procedure THbtXpBitBtn.CMMouseEnter(var Message: TMessage); begin inherited; FMouseInControl := True; Invalidate; end; procedure THbtXpBitBtn.CMMouseLeave(var Message: TMessage); begin inherited; FMouseInControl := False; Invalidate; end; function THbtXpBitBtn.getVersion: String; begin Result := Format( '%d.%d', [ Hi( FVersion ), Lo( FVersion ) ] ); end; procedure THbtXpBitBtn.SetBorderColor(const Value: TColor); begin FBorderColor := Value; Invalidate; end; procedure THbtXpBitBtn.SetFocuseHighlightColore(const Value: Tcolor); begin FFocusHighlightColor := Value; Invalidate; end; procedure THbtXpBitBtn.SetMouseInColor(const Value: TColor); begin FMouseInColor := Value; Invalidate; end; procedure THbtXpBitBtn.SetPushHighLightColor(const Value: Tcolor); begin FPushHighLightColor := Value; Invalidate; end; procedure THbtXpBitBtn.SetVersion(const Value: String); begin end; procedure THbtXpBitBtn.SetxpStyle(const Value: TXpStyle); begin FxpStyle := Value; end; procedure THbtXpBitBtn.SetGradiantDefualt(var thisCanvas: TCanvas; var thisRect: Trect); var x, y, z, stelle, mx, bis, faColorsh, mass: Integer; Faktor: double; A:HbtRGBArray; B: array of HBtRGBArray; merkw: integer; merks: TPenStyle; merkp: TColor; FColor:HbtColor; begin mass:=0; SetLength(FColor,4); case FxpStyle Of StxpBlue : begin FLeftTopColor := $00fdfdfd; FMiddleColor := $00fdf7f6; FRightDownColor := $00ecdfde; FMixColor := $00fdf5f4; end; end; FColor[0]:=FLeftTopColor; FColor[1]:=FMixColor; FColor[2]:=FRightDownColor; FColor[3]:=FMiddleColor; If thiscanvasNil Then begin mx := High(FColor); if mx 0 then begin mass := (thisRect.Bottom) - (thisRect.Top); SetLength(b, mx + 1); for x := 0 to mx do begin FColor[x] := ColorToRGB(FColor[x]); b[x][0] := GetRValue(FColor[x]); b[x][1] := GetGValue(FColor[x]); b[x][2] := GetBValue(FColor[x]); end; merkw := thisCanvas.Pen.Width; merks := thisCanvas.Pen.Style; merkp := thisCanvas.Pen.Color; thisCanvas.Pen.Width := 1; thisCanvas.Pen.Style := psSolid; faColorsh := Round(mass / mx); for y := 0 to mx - 1 do begin if y = mx - 1 then bis := mass - y * faColorsh - 1 else bis := faColorsh; for x := 0 to bis do begin Stelle := x + y * faColorsh; faktor := x / bis; for z := 0 to 2 do a[z] := Trunc(b[y][z] + ((b[y + 1][z] - b[y][z]) * Faktor)); thisCanvas.Pen.Color := RGB(a[0], a[1], a[2]); thisCanvas.MoveTo(thisRect.Left , thisRect.Top + Stelle); thisCanvas.LineTo(thisRect.Right, thisRect.Top + Stelle); end; end; b := nil; thisCanvas.Pen.Width := merkw; thisCanvas.Pen.Style := merks; thisCanvas.Pen.Color := merkp; end end; end; procedure THbtXpBitBtn.SetGradiantPush(var thisCanvas: TCanvas; var thisRect: Trect); var x, y, z, stelle, mx, bis, faColorsh, mass: Integer; Faktor: double; A:HbtRGBArray; B: array of HBtRGBArray; merkw: integer; merks: TPenStyle; merkp: TColor; FColor:HbtColor; begin mass:=0; SetLength(FColor,4); case FxpStyle Of StxpBlue : begin FLeftTopColor := $00BFA6A2; FMiddleColor := $00ecdfde; FRightDownColor := $00fdfdfd; FMixColor := $00ecdfde; end; end; FColor[0]:=FLeftTopColor; FColor[1]:=FMixColor; FColor[2]:=FRightDownColor; FColor[3]:=FMiddleColor; If thiscanvasNil Then begin mx := High(FColor); if mx 0 then begin mass := (thisRect.Bottom) - (thisRect.Top); SetLength(b, mx + 1); for x := 0 to mx do begin FColor[x] := ColorToRGB(FColor[x]); b[x][0] := GetRValue(FColor[x]); b[x][1] := GetGValue(FColor[x]); b[x][2] := GetBValue(FColor[x]); end; merkw := thisCanvas.Pen.Width; merks := thisCanvas.Pen.Style; merkp := thisCanvas.Pen.Color; thisCanvas.Pen.Width := 1; thisCanvas.Pen.Style := psSolid; faColorsh := Round(mass / mx); for y := 0 to mx - 1 do begin if y = mx - 1 then bis := mass - y * faColorsh - 1 else bis := faColorsh; for x := 0 to bis do begin Stelle := x + y * faColorsh; faktor := x / bis; for z := 0 to 2 do a[z] := Trunc(b[y][z] + ((b[y + 1][z] - b[y][z]) * Faktor)); thisCanvas.Pen.Color := RGB(a[0], a[1], a[2]); thisCanvas.MoveTo(thisRect.Left , thisRect.Top + Stelle); thisCanvas.LineTo(thisRect.Right, thisRect.Top + Stelle); end; end; b := nil; thisCanvas.Pen.Width := merkw; thisCanvas.Pen.Style := merks; thisCanvas.Pen.Color := merkp; end end; end; procedure THbtXpBitBtn.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited MouseDown(Button, Shift, X, Y); if (Button = mbLeft) and Enabled then begin FState := bsDown; Invalidate; end; end; procedure THbtXpBitBtn.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited MouseUp(Button, Shift, X, Y); if (Button = mbLeft) and Enabled then begin fstate:= bsUp; Invalidate; end; end; procedure THbtXpBitBtn.SetGradiantMouseIn(var thisCanvas: TCanvas; var thisRect: Trect); var x, y, z, stelle, mx, bis, faColorsh, mass: Integer; Faktor: double; A:HbtRGBArray; B: array of HBtRGBArray; merkw: integer; merks: TPenStyle; merkp: TColor; FColor:HbtColor; begin mass:=0; SetLength(FColor,4); case FxpStyle Of StxpBlue : begin FLeftTopColor := $00fdfdfd; FMiddleColor := $00fdf7f6; FRightDownColor := $00ecdfde; FMixColor := $00fdf5f4; end; end; FColor[0]:=FLeftTopColor; FColor[1]:=FhighLightColor; FColor[2]:=FRightDownColor; FColor[3]:=FHighLightColor; If thiscanvasNil Then begin mx := High(FColor); if mx 0 then begin mass := (thisRect.Bottom) - (thisRect.Top); SetLength(b, mx + 1); for x := 0 to mx do begin FColor[x] := ColorToRGB(FColor[x]); b[x][0] := GetRValue(FColor[x]); b[x][1] := GetGValue(FColor[x]); b[x][2] := GetBValue(FColor[x]); end; merkw := thisCanvas.Pen.Width; merks := thisCanvas.Pen.Style; merkp := thisCanvas.Pen.Color; thisCanvas.Pen.Width := 1; thisCanvas.Pen.Style := psSolid; faColorsh := Round(mass / mx); for y := 0 to mx - 1 do begin if y = mx - 1 then bis := mass - y * faColorsh - 1 else bis := faColorsh; for x := 0 to bis do begin Stelle := x + y * faColorsh; faktor := x / bis; for z := 0 to 2 do a[z] := Trunc(b[y][z] + ((b[y + 1][z] - b[y][z]) * Faktor)); thisCanvas.Pen.Color := RGB(a[0], a[1], a[2]); thisCanvas.MoveTo(thisRect.Left , thisRect.Top + Stelle); thisCanvas.LineTo(thisRect.Right, thisRect.Top + Stelle); end; end; b := nil; thisCanvas.Pen.Width := merkw; thisCanvas.Pen.Style := merks; thisCanvas.Pen.Color := merkp; end end; end; procedure THbtXpBitBtn.sethighLightColor(const Value: Tcolor); begin FHighLightColor := Value; Invalidate; end; procedure THbtXpBitBtn.SetGradiantDisabled(var thisCanvas: TCanvas; var thisRect: Trect); var x, y, z, stelle, mx, bis, faColorsh, mass: Integer; Faktor: double; A:HbtRGBArray; B: array of HBtRGBArray; merkw: integer; merks: TPenStyle; merkp: TColor; FColor:HbtColor; begin mass:=0; SetLength(FColor,4); case FxpStyle Of StxpBlue : begin FLeftTopColor := $00EdF1F1; FMiddleColor := $00EdF1F1; FRightDownColor := $00EdF1F1; FMixColor := $00EdF1F1; end; end; FColor[0]:=FLeftTopColor; FColor[1]:=FMixColor; FColor[2]:=FRightDownColor; FColor[3]:=FMiddleColor; If thiscanvasNil Then begin mx := High(FColor); if mx 0 then begin mass := (thisRect.Bottom) - (thisRect.Top); SetLength(b, mx + 1); for x := 0 to mx do begin FColor[x] := ColorToRGB(FColor[x]); b[x][0] := GetRValue(FColor[x]); b[x][1] := GetGValue(FColor[x]); b[x][2] := GetBValue(FColor[x]); end; merkw := thisCanvas.Pen.Width; merks := thisCanvas.Pen.Style; merkp := thisCanvas.Pen.Color; thisCanvas.Pen.Width := 1; thisCanvas.Pen.Style := psSolid; faColorsh := Round(mass / mx); for y := 0 to mx - 1 do begin if y = mx - 1 then bis := mass - y * faColorsh - 1 else bis := faColorsh; for x := 0 to bis do begin Stelle := x + y * faColorsh; faktor := x / bis; for z := 0 to 2 do a[z] := Trunc(b[y][z] + ((b[y + 1][z] - b[y][z]) * Faktor)); thisCanvas.Pen.Color := RGB(a[0], a[1], a[2]); thisCanvas.MoveTo(thisRect.Left , thisRect.Top + Stelle); thisCanvas.LineTo(thisRect.Right, thisRect.Top + Stelle); end; end; b := nil; thisCanvas.Pen.Width := merkw; thisCanvas.Pen.Style := merks; thisCanvas.Pen.Color := merkp; end end; end; procedure THbtXpBitBtn.DrawButton(thisRect: TRect; State: UINT); //------------------------------------------------------------------------------ Function CaptionRect(Totalwidth,TotalHeight,TextWidth,TextHeight:Integer):TRect; Var Left,Top,Right,Bottom:Integer; begin Left := (TotalWidth - TextWidth) Div 2; Top := (TotalHeight - TextHeight)Div 2; Right := Left+TextWidth; Bottom := Top+TextHeight; Result := Rect(Left,Top,Right,Bottom); end; //---------------------------------------------------------------------------- Function ClyphRect(Totalwidth,TotalHeight,TextWidth,TextHeight:Integer):TRect; Var GlyphWidth,GlyphHeight:Integer; Left,Top,Right,Bottom:Integer; begin Left := (TotalWidth - TextWidth) Div 2; Top := (TotalHeight - TextHeight)Div 2; Right := Left+TextWidth; Bottom := Top+TextHeight; Result := Rect(Left,Top,Right,Bottom); end; //---------------------------------------------------------------------------- Procedure DrawFocus(Var thisCanvas: Tcanvas ;FocusColor:Tcolor); Var FocusRect:TRect; begin FocusRect := Rect(FRect.Left+2,FRect.Top+2,FRect.Right-2,FRect.Bottom-2); with FocusRect do begin thisCanvas.Pen.Color := clWindowFrame; thisCanvas.Brush.Color := FocusColor; Windows.DrawFocusRect(thisCanvas.Handle,FocusRect); end; end; //--------------------------------------------------------------------------- Procedure DrawHighLight(Var thisCanvas: Tcanvas ;HighLightColor:Tcolor); Var HighLightRect:TRect; begin HighLightRect := Rect(FRect.Left+1,FRect.Top+1,FRect.Right-1,FRect.Bottom-1); with HighLightRect do begin ExcludeClipRect(thisCanvas.Handle,FRect.Left,FRect.Top,FRect.Right,FRect.Bottom); SelectClipRgn(thisCanvas.Handle, 0); thisCanvas.Brush.Style := bsClear; thisCanvas.Pen.Width := 1; thisCanvas.Pen.Color := HighLightColor; thisCanvas.RoundRect(FRect.Left+1,FRect.Top+1,FRect.Right-1,FRect.Bottom-1,3,3); end; end; //---------------------------------------------------------------------------- Procedure DrawCaption(var thisCanvas:Tcanvas;thisCaption:Tcaption;thisFlags:Integer;UseOffset:Boolean); Var CaptionFalg: Longint; H,W:Integer; //W As Caption Width H As Text height CRect: TRect; begin CaptionFalg :=DrawTextBiDiModeFlags(DT_SINGLELINE); H:= thisCanvas.TextHeight('0'); W:= thisCanvas.TextWidth(Caption); CRect := CaptionRect(ClientWidth,ClientHeight,w,h); TButtonGlyph(FGlyph).DrawButtonText(thisCanvas,thisCaption,CRect,FState,CaptionFalg); end; //---------------------------------------------------------------------------- Procedure DrawDisabledCaption(var thisCanvas:Tcanvas;thisCaption:Tcaption;thisFlags:Integer); Var CaptionFalg: Longint; H,W:Integer; //W As Caption Width H As Text height CRect: TRect; begin CaptionFalg :=DrawTextBiDiModeFlags(DT_SINGLELINE); H:= thisCanvas.TextHeight('0'); W:= thisCanvas.TextWidth(Caption); CRect := CaptionRect(ClientWidth,ClientHeight,w,h); TButtonGlyph(FGlyph).DrawButtonText(thisCanvas,thisCaption,CRect,FState,CaptionFalg); end; //---------------------------------------------------------------------------- Procedure DrawGlyph(var ThisCanvas:TCanvas;thisRect:TRect;ThisOffset:TPoint;ThisLayout:TButtonLayOut; ThisCaption:TCaption;thisMargin:Integer;ThisSpacing:Integer;Var thisGlyphPos:TPoint; Var ThisTextBound:TRect;UseOffset:Boolean;ThisBIDIFlags:Integer); begin TButtonGlyph(FGlyph).Draw(ThisCanvas,thisRect,ThisOffset,ThisCaption,ThisLayout,thisMargin,ThisSpacing,FState,True,ThisBIDIFlags,UseOffset); end; //------------------------------------------------------------------------------ var // State :Cardinal; IsDown, IsDefault,IsDisabled: Boolean; GradiantRect,FocusRoundRect,CRect:TRect; Flags: Longint; Offset,GPos: TPoint; begin Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT; IsDown := State and ODS_SELECTED 0; IsDefault := State and ODS_FOCUS 0; IsDisabled := State and ODS_DISABLED 0; if IsDown then Flags := Flags or DFCS_PUSHED; if IsDisabled then Flags := Flags or DFCS_INACTIVE; if not Enabled then FState := bsDisabled else if IsDown then FState := bsDown else FState := bsUp; //--------------------------------------------------------------------- //--------------------------------------------------------------------- //-------------------------- NorMal Button ---------------------------- //--------------------------------------------------------------------- //--------------------------------------------------------------------- FRect := ClientRect; if not IsDisabled Then begin case FxpStyle of StxpBlue : FCanvas.pen.Color := FBorderColor; end; end; FCanvas.Brush.Style := bsSolid; FCanvas.Pen.Style := psSolid; FCanvas.Font.Color := Font.Color; RoundRect(FCanvas.Handle,FRect.Left,FRect.Top,FRect.Right,FRect.Bottom,3,3); GradiantRect := Rect(FRect.Left+2,FRect.Top+2,FRect.Right-2,FRect.Bottom-2); //------------------------------------------------------------------------ if not IsDisabled Then begin FCanvas.Lock; try SetGradiantDefualt(Fcanvas,GradiantRect); if (Caption '') and (FGlyph = Nil ) Then DrawCaption(Fcanvas,Caption,Flags,false); if (Caption '') and (FGlyph Nil ) Then begin CRect := CaptionRect(ClientWidth,ClientHeight,FCanvas.TextWidth(Caption),FCanvas.TextHeight(Caption)); DrawGlyph(FCanvas,ClientRect,Offset,FLayout,Caption,FMargin,FSpacing,GPos,CRect,False,DrawTextBiDiModeFlags(0)); end; finally FCanvas.Unlock; end; end; if IsDisabled Then begin case FxpStyle Of StxpBlue : FCanvas.Pen.Color := $0092A1A1; end;//end of Case FCanvas.Pen.Style := psSolid; FCanvas.Lock; try SetGradiantDisabled(Fcanvas,GradiantRect); if (Caption '') and (FGlyph = Nil ) Then DrawCaption(Fcanvas,Caption,Flags,false); if (Caption '') and (FGlyph Nil ) Then begin CRect := CaptionRect(ClientWidth,ClientHeight,FCanvas.TextWidth(Caption),FCanvas.TextHeight(Caption)); DrawGlyph(FCanvas,ClientRect,Offset,FLayout,Caption,FMargin,FSpacing,GPos,CRect,False,DrawTextBiDiModeFlags(0)); end; finally FCanvas.Unlock; end; end; //------------------------------------------------------------------------ if not (csDesigning In ComponentState) Then begin //--------------------------------------------------------------------- //--------------------------------------------------------------------- //------------------------ {Disabled Button } ------------------------- //--------------------------------------------------------------------- //--------------------------------------------------------------------- if IsDisabled Then begin case FxpStyle Of StxpBlue : FCanvas.Pen.Color := $0092A1A1; end;//end of Case FCanvas.Pen.Style := psSolid; FCanvas.Lock; try SetGradiantDisabled(Fcanvas,GradiantRect); if (Caption '') and (FGlyph = Nil ) Then DrawCaption(Fcanvas,Caption,Flags,false); if (Caption '') and (FGlyph Nil ) Then begin CRect := CaptionRect(ClientWidth,ClientHeight,FCanvas.TextWidth(Caption),FCanvas.TextHeight(Caption)); DrawGlyph(FCanvas,ClientRect,Offset,FLayout,Caption,FMargin,FSpacing,GPos,CRect,False,DrawTextBiDiModeFlags(0)); end; finally FCanvas.Unlock; end; end; //--------------------------------------------------------------------- //--------------------------------------------------------------------- //-------------------------{Down Button }------------------------------ //--------------------------------------------------------------------- //--------------------------------------------------------------------- if IsDown Then begin FCanvas.Lock; Try SetGradiantPush(Fcanvas,GradiantRect); DrawFocus(Fcanvas,clBtnFace); if (Caption '') and (FGlyph = Nil ) Then DrawCaption(Fcanvas,Caption,Flags,True); if (Caption '') and (FGlyph Nil ) Then begin CRect := CaptionRect(ClientWidth,ClientHeight,FCanvas.TextWidth(Caption),FCanvas.TextHeight(Caption)); DrawGlyph(FCanvas,ClientRect,Offset,FLayout,Caption,FMargin,FSpacing,GPos,CRect,True,DrawTextBiDiModeFlags(0)); end; Finally FCanvas.Unlock; end;//end of Try end; //--------------------------------------------------------------------- //------------------------ Focus Button ------------------------------ //--------------------------------------------------------------------- //--------------------------------------------------------------------- if IsFocused then begin FCanvas.Lock; Try SetGradiantDefualt(Fcanvas,GradiantRect); DrawFocus(Fcanvas,clBtnface); DrawHighLight(fcanvas,FFocusHighlightColor); if (Caption '') and (FGlyph = Nil ) Then DrawCaption(Fcanvas,Caption,Flags,false); if (Caption '') and (FGlyph Nil ) Then begin CRect := CaptionRect(ClientWidth,ClientHeight,FCanvas.TextWidth(Caption),FCanvas.TextHeight(Caption)); DrawGlyph(FCanvas,ClientRect,Offset,FLayout,Caption,FMargin,FSpacing,GPos,CRect,False,DrawTextBiDiModeFlags(0)); end; finally FCanvas.Unlock; end; end; //--------------------------------------------------------------------- //--------------------------------------------------------------------- //--------------------- Focus and Pudh Button ------------------------- //--------------------------------------------------------------------- //--------------------------------------------------------------------- if IsDown and IsFocused Then begin FCanvas.Lock; Try SetGradiantPush(Fcanvas,GradiantRect); DrawFocus(FCanvas,clBtnFace); DrawHighLight(Fcanvas,FPushHighLightColor); if (Caption '') and (FGlyph = Nil ) Then DrawCaption(Fcanvas,Caption,Flags,True); if (Caption '') and (FGlyph Nil ) Then begin CRect := CaptionRect(ClientWidth,ClientHeight,FCanvas.TextWidth(Caption),FCanvas.TextHeight(Caption)); DrawGlyph(FCanvas,ClientRect,Offset,FLayout,Caption,FMargin,FSpacing,GPos,CRect,True,DrawTextBiDiModeFlags(0)); end; Finally FCanvas.Unlock; end;//end of Try end; //--------------------------------------------------------------------- //--------------------------------------------------------------------- //-------------------------- MouseIn Button --------------------------- //--------------------------------------------------------------------- //--------------------------------------------------------------------- if FMouseInControl Then begin FCanvas.Lock; try SetGradiantDefualt(Fcanvas,GradiantRect); DrawHighLight(fcanvas,FMouseInColor); if (Caption '') and (FGlyph = Nil )Then DrawCaption(Fcanvas,Caption,Flags,False); if (Caption '') and (FGlyph Nil ) Then begin CRect := CaptionRect(ClientWidth,ClientHeight,FCanvas.TextWidth(Caption),FCanvas.TextHeight(Caption)); DrawGlyph(FCanvas,ClientRect,Offset,FLayout,Caption,FMargin,FSpacing,GPos,CRect,False,DrawTextBiDiModeFlags(0)); end; finally FCanvas.Unlock; end; end; //--------------------------------------------------------------------- //--------------------------------------------------------------------- //--------------------- Focus and MouseIn Button ---------------------- //--------------------------------------------------------------------- //--------------------------------------------------------------------- if IsFocused and FMouseInControl Then begin FCanvas.Lock; Try SetGradiantDefualt(Fcanvas,GradiantRect); DrawFocus(Fcanvas,clBtnFace); DrawHighLight(FCanvas,FMouseInColor); if (Caption '') and (FGlyph = Nil ) Then DrawCaption(Fcanvas,Caption,Flags,False); if (Caption '') and (FGlyph Nil ) Then begin CRect := CaptionRect(ClientWidth,ClientHeight,FCanvas.TextWidth(Caption),FCanvas.TextHeight(Caption)); DrawGlyph(FCanvas,ClientRect,Offset,FLayout,Caption,FMargin,FSpacing,GPos,CRect,False,DrawTextBiDiModeFlags(0)); end; finally FCanvas.Unlock; end; end; //--------------------------------------------------------------------- //--------------------------------------------------------------------- //--------------------- Focus and MouseIn and ISDown Button ----------- //--------------------------------------------------------------------- //--------------------------------------------------------------------- if IsFocused and IsDown and FMouseInControl Then begin FCanvas.Lock; Try SetGradiantPush(Fcanvas,GradiantRect); DrawFocus(FCanvas,clBtnFace); DrawHighLight(fcanvas,FPushHighLightColor); if (Caption '') and (FGlyph = Nil ) Then DrawCaption(Fcanvas,Caption,Flags,True); if (Caption '') and (FGlyph Nil ) Then begin CRect := CaptionRect(ClientWidth,ClientHeight,FCanvas.TextWidth(Caption),FCanvas.TextHeight(Caption)); DrawGlyph(FCanvas,ClientRect,Offset,FLayout,Caption,FMargin,FSpacing,GPos,CRect,True,DrawTextBiDiModeFlags(0)); end; Finally FCanvas.Unlock; end;//end of Try end; end;//end of if not CsDesigning .... end; Procedure Register; begin RegisterComponent('Hbt Xp pack ',[ThbtXpBitBtn]); end; initialization FillChar(BitBtnGlyphs, SizeOf(BitBtnGlyphs), 0); finalization DestroyLocals; end.