📄 aclfpainter.pas
字号:
unit acLFPainter;
{$I sDefs.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
sSkinManager, sStyleSimply, sMaskData, cxLookAndFeelPainters, cxGraphics, cxClasses;
type
TcxACLookAndFeelPainter = class(TcxFlatLookAndFeelPainter)
public
// colors
class function DefaultGroupColor: TColor; override;
class function DefaultGroupTextColor: TColor; override;
class function DefaultHeaderColor: TColor; override;
class function DefaultHeaderBackgroundColor: TColor; override;
class function DefaultGroupByBoxColor: TColor; override;
class function DefaultGroupByBoxTextColor: TColor; override;
class function DefaultSchedulerTextColor: TColor; override;
class function DefaultTimeGridMajorScaleTextColor: TColor; override;
class function DefaultTabsBackgroundColor: TColor; override;
class function DefaultSizeGripAreaColor: TColor; override;
class function DefaultContentColor: TColor; override;
class function DefaultInactiveColor: TColor; override;
class function DefaultInactiveTextColor: TColor; override;
class function DefaultContentTextColor: TColor; override;
class procedure DrawBorder(ACanvas: TcxCanvas; R: TRect); override;
class function BorderSize: Integer; override;
class function DefaultDateNavigatorHeaderColor: TColor; override;
// tabs
class procedure DrawTab(ACanvas: TcxCanvas; R: TRect; ABorders: TcxBorders; const AText: string; AState: TcxButtonState;
AVertical: Boolean; AFont: TFont; ATextColor, ABkColor: TColor; AShowPrefix: Boolean = False); override;
class procedure DrawTabBorder(ACanvas: TcxCanvas; R: TRect; ABorder: TcxBorder; ABorders: TcxBorders; AVertical: Boolean); override;
class procedure DrawTabsRoot(ACanvas: TcxCanvas; const R: TRect; ABorders: TcxBorders; AVertical: Boolean); override;
class function IsDrawTabImplemented(AVertical: Boolean): Boolean; override;
class function IsTabHotTrack(AVertical: Boolean): Boolean; override;
class function TabBorderSize(AVertical: Boolean): Integer; override;
// Scrollbar
class procedure DrawScrollBarPart(ACanvas: TcxCanvas; AHorizontal: Boolean; R: TRect; APart: TcxScrollBarPart; AState: TcxButtonState); override;
// buttons
class function IsButtonHotTrack: Boolean; override;
class function ButtonBorderSize(AState: TcxButtonState = cxbsNormal): Integer; override;
class function ExpandButtonSize: Integer; override;
class procedure DrawButton(ACanvas: TcxCanvas; R: TRect; const ACaption: string; AState: TcxButtonState; ADrawBorder: Boolean = True;
AColor: TColor = clDefault; ATextColor: TColor = clDefault; AWordWrap: boolean = False); override;
// size grip
class function SizeGripSize: TSize; override;
class procedure DrawSizeGrip(ACanvas: TcxCanvas; const ARect: TRect; ABackgroundColor: TColor = clDefault); override;
// header
class function HeaderBorderSize: Integer; override;
class procedure DrawHeader(ACanvas: TcxCanvas; const ABounds, ATextAreaBounds: TRect;
ANeighbors: TcxNeighbors; ABorders: TcxBorders; AState: TcxButtonState;
AAlignmentHorz: TAlignment; AAlignmentVert: TcxAlignmentVert; AMultiLine, AShowEndEllipsis: Boolean;
const AText: string; AFont: TFont; ATextColor, ABkColor: TColor;
AOnDrawBackground: TcxDrawBackgroundEvent = nil; AIsLast: Boolean = False;
AIsGroup: Boolean = False); override;
class procedure DrawHeaderPressed(ACanvas: TcxCanvas; const ABounds: TRect); override;
class function IsHeaderHotTrack: Boolean; override;
class procedure DrawHeaderBorder(ACanvas: TcxCanvas; const R: TRect; ANeighbors: TcxNeighbors; ABorders: TcxBorders); override;
class procedure DrawHeaderControlSection(ACanvas: TcxCanvas; const ABounds, ATextAreaBounds: TRect;
ANeighbors: TcxNeighbors; ABorders: TcxBorders; AState: TcxButtonState;
AAlignmentHorz: TAlignment; AAlignmentVert: TcxAlignmentVert; AMultiLine,
AShowEndEllipsis: Boolean; const AText: string; AFont: TFont; ATextColor,
ABkColor: TColor); override;
class procedure DrawHeaderControlSectionBorder(ACanvas: TcxCanvas; const R: TRect;
ABorders: TcxBorders; AState: TcxButtonState); override;
class procedure DrawHeaderEx(ACanvas: TcxCanvas; const ABounds, ATextAreaBounds: TRect;
ANeighbors: TcxNeighbors; ABorders: TcxBorders; AState: TcxButtonState;
AAlignmentHorz: TAlignment; AAlignmentVert: TcxAlignmentVert; AMultiLine, AShowEndEllipsis: Boolean;
const AText: string; AFont: TFont; ATextColor, ABkColor: TColor;
AOnDrawBackground: TcxDrawBackgroundEvent = nil); override;
class function HeaderBorders(ANeighbors: TcxNeighbors): TcxBorders; override;
// filter
class function DefaultFilterBoxColor: TColor; override;
class function DefaultFilterBoxTextColor: TColor; override;
class function FilterCloseButtonSize: TPoint; override;
class function FilterDropDownButtonSize: TPoint; override;
class function FilterActivateButtonSize: TPoint; override;
class procedure DrawFilterDropDownButton(ACanvas: TcxCanvas; R: TRect; AState: TcxButtonState; AIsFilterActive: Boolean); override;
class procedure DrawFilterCloseButton(ACanvas: TcxCanvas; R: TRect; AState: TcxButtonState); override;
// checkbox
class procedure DrawCheckButton(ACanvas: TcxCanvas; R: TRect; AState: TcxButtonState; AChecked: Boolean); overload; override;
class procedure DrawCheckButton(ACanvas: TcxCanvas; R: TRect; AState: TcxButtonState; ACheckState: TcxCheckBoxState); overload; override;
// footer
class procedure DrawFooterBorder(ACanvas: TcxCanvas; const R: TRect); override;
class function FooterBorderSize: Integer; override;
class procedure DrawFooterCellBorder(ACanvas: TcxCanvas; const R: TRect); override;
class function DefaultFooterColor: TColor; override;
class function DefaultFooterTextColor: TColor; override;
class function DefaultTabColor: TColor; override;
// Glyphs
class procedure DrawSortingMark(ACanvas: TcxCanvas; const R: TRect; AAscendingSorting: Boolean); override;
//
class procedure DrawMonthHeader(ACanvas: TcxCanvas; const ABounds: TRect;
const AText: string; ANeighbors: TcxNeighbors; const AViewParams: TcxViewParams;
AArrows: TcxHeaderArrows; ASideWidth: Integer; AOnDrawBackground: TcxDrawBackgroundEvent = nil); override;
end;
procedure PaintConstBorder(Size: integer; MaskData: TsMaskData; R: TRect; Canvas : TcxCanvas);
implementation
uses sGraphUtils, sSkinProps, acntUtils, sConst, sAlphaGraph, math, sVCLUtils;
function Skinned : boolean; begin
Result := (DefaultManager <> nil) and DefaultManager.SkinData.Active
end;
procedure PaintConstBorder(Size: integer; MaskData: TsMaskData; R: TRect; Canvas : TcxCanvas);
var
w, h, dw, dh, x, y : integer;
c : TColor;
begin
with DefaultManager do begin
if (WidthOf(R) < 4) or (HeightOf(R) < 4) or (MaskData.ImageCount = 0) then Exit;
dw := WidthOf(MaskData.R) div MaskData.ImageCount;
dh := HeightOf(MaskData.R) div (1 + MaskData.MaskType);
w := dw div 3;
h := dh div 3;
c := DefaultManager.GetGlobalColor;
StretchBlt(Canvas.Handle, R.Left, R.Top + Size, Size, R.Bottom - 2 * Size, MasterBitmap.Canvas.Handle,
MaskData.R.Left, MaskData.R.Top + h, Size, h, SRCCOPY); // left - middle
StretchBlt(Canvas.Handle, R.Left + Size, R.Top, R.Right - 2 * Size, Size, MasterBitmap.Canvas.Handle,
MaskData.R.Left + w, MaskData.R.Top, w, Size, SRCCOPY); // top - middle
StretchBlt(Canvas.Handle, R.Left + Size, R.Bottom - Size, R.Right - 2 * Size, Size, MasterBitmap.Canvas.Handle,
MaskData.R.Left + w, MaskData.R.Top + dh - Size, w, Size, SRCCOPY); // bottom - middle
StretchBlt(Canvas.Handle, R.Right - Size, R.Top + Size, Size, R.Bottom - 2 * Size, MasterBitmap.Canvas.Handle,
MaskData.R.Left + dw - Size, MaskData.R.Top + h, Size, h, SRCCOPY); // right - middle
BitBlt(Canvas.Handle, R.Left, R.Top, Size, Size, MasterBitmap.Canvas.Handle, MaskData.R.Left, MaskData.R.Top, SRCCOPY); // left - top
BitBlt(Canvas.Handle, R.Left, R.Bottom - Size, Size, Size, MasterBitmap.Canvas.Handle, MaskData.R.Left, MaskData.R.Top + dh - Size, SRCCOPY); // left - bottom
BitBlt(Canvas.Handle, R.Right - Size, R.Bottom - Size, Size, Size, MasterBitmap.Canvas.Handle, MaskData.R.Left + dw - Size, MaskData.R.Top + dh - Size, SRCCOPY); // right - bottom
BitBlt(Canvas.Handle, R.Right - Size, R.Top, Size, Size, MasterBitmap.Canvas.Handle, MaskData.R.Left + dw - Size, MaskData.R.Top, SRCCOPY); // right - top
for x := 0 to Size - 1 do for y := 0 to Size - 1 do begin
if Canvas.Canvas.Pixels[R.Left + x, R.Top + y] = clFuchsia then Canvas.Canvas.Pixels[R.Left + x, R.Top + y] := c;
if Canvas.Canvas.Pixels[R.Left + x, R.Bottom - Size + y] = clFuchsia then Canvas.Canvas.Pixels[R.Left + x, R.Bottom - Size + y] := c;
if Canvas.Canvas.Pixels[R.Right - Size + x, R.Bottom - Size + y] = clFuchsia then Canvas.Canvas.Pixels[R.Right - Size + x, R.Bottom - Size + y] := c;
if Canvas.Canvas.Pixels[R.Right - Size + x, R.Top + y] = clFuchsia then Canvas.Canvas.Pixels[R.Right - Size + x, R.Top + y] := c;
end;
end;
end;
{ TcxACLookAndFeelPainter }
class function TcxACLookAndFeelPainter.BorderSize: Integer;
begin
if Skinned then Result := 2 else Result := inherited BorderSize;
end;
class function TcxACLookAndFeelPainter.ButtonBorderSize(AState: TcxButtonState): Integer;
begin
if Skinned then Result := 4 else Result := inherited ButtonBorderSize(AState)
end;
class function TcxACLookAndFeelPainter.DefaultSizeGripAreaColor: TColor;
begin
if Skinned then Result := DefaultManager.GetActiveEditColor else Result := inherited DefaultSizeGripAreaColor
end;
class function TcxACLookAndFeelPainter.DefaultContentColor: TColor;
begin
if Skinned then Result := DefaultManager.GetActiveEditColor else Result := inherited DefaultContentColor
end;
class function TcxACLookAndFeelPainter.DefaultContentTextColor: TColor;
var
i : integer;
begin
if Skinned then begin
i := DefaultManager.GetSkinIndex(s_Edit);
if DefaultManager.IsValidSkinIndex(i) then Result := DefaultManager.gd[i].FontColor[1] else Result := 0;
end
else Result := inherited DefaultContentTextColor
end;
class function TcxACLookAndFeelPainter.DefaultDateNavigatorHeaderColor: TColor;
begin
Result := clYellow//!!!
end;
class function TcxACLookAndFeelPainter.DefaultFilterBoxColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalColor else Result := inherited DefaultFilterBoxColor
end;
class function TcxACLookAndFeelPainter.DefaultFilterBoxTextColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalFontColor else Result := inherited DefaultFilterBoxTextColor
end;
class function TcxACLookAndFeelPainter.DefaultFooterColor: TColor;
begin
if Skinned then Result := DefaultManager.GetActiveEditColor else Result := inherited DefaultFooterColor
end;
class function TcxACLookAndFeelPainter.DefaultFooterTextColor: TColor;
begin
if Skinned then Result := DefaultManager.GetActiveEditFontColor else Result := inherited DefaultFooterTextColor
end;
class function TcxACLookAndFeelPainter.DefaultGroupByBoxColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalColor else Result := inherited DefaultGroupByBoxColor
end;
class function TcxACLookAndFeelPainter.DefaultGroupByBoxTextColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalFontColor else Result := inherited DefaultGroupByBoxTextColor
end;
class function TcxACLookAndFeelPainter.DefaultGroupColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalColor else Result := inherited DefaultGroupColor
end;
class function TcxACLookAndFeelPainter.DefaultGroupTextColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalFontColor else Result := inherited DefaultGroupTextColor
end;
class function TcxACLookAndFeelPainter.DefaultHeaderBackgroundColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalFontColor else Result := inherited DefaultHeaderBackgroundColor
end;
class function TcxACLookAndFeelPainter.DefaultHeaderColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalColor else Result := inherited DefaultHeaderColor
end;
class function TcxACLookAndFeelPainter.DefaultInactiveColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalColor else Result := inherited DefaultInactiveColor
end;
class function TcxACLookAndFeelPainter.DefaultInactiveTextColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalFontColor else Result := inherited DefaultInactiveTextColor
end;
class function TcxACLookAndFeelPainter.DefaultSchedulerTextColor: TColor;
begin
Result := clRed//!!!
end;
class function TcxACLookAndFeelPainter.DefaultTabColor: TColor;
begin
if DefaultManager <> nil then Result := DefaultManager.GetGlobalColor else Result := inherited DefaultTabColor
end;
class function TcxACLookAndFeelPainter.DefaultTabsBackgroundColor: TColor;
begin
if Skinned then Result := DefaultManager.GetGlobalColor else Result := inherited DefaultTabsBackgroundColor
end;
class function TcxACLookAndFeelPainter.DefaultTimeGridMajorScaleTextColor: TColor;
begin
Result := clRed//!!!
end;
class procedure TcxACLookAndFeelPainter.DrawBorder(ACanvas: TcxCanvas; R: TRect);
var
i, m : integer;
begin
if Skinned then begin
i := DefaultManager.GetSkinIndex(s_Edit);
m := DefaultManager.GetMaskIndex(i, s_Edit, s_BordersMask);
if DefaultManager.IsValidImgIndex(m) then begin
PaintConstBorder(2, DefaultManager.ma[m], R, ACanvas);
end;
end
else inherited DrawBorder(ACanvas, R)
end;
Class procedure TcxACLookAndFeelPainter.DrawButton(ACanvas: TcxCanvas; R: TRect; const ACaption: string;
AState: TcxButtonState; ADrawBorder: Boolean = True; AColor: TColor = clDefault;
ATextColor: TColor = clDefault; AWordWrap: boolean = False);
var
i : integer;
TmpBmp : TBitmap;
State : integer;
CI : TCacheInfo;
begin
if Skinned then begin
i := DefaultManager.GetSkinIndex(s_Button);
if DefaultManager.IsValidSkinIndex(i) then begin
case AState of cxbsHot : State := 1; cxbsPressed : State := 2; else State := 0 end;
TmpBmp := CreateBmp24(WidthOf(R), HeightOf(R));
FillDC(TmpBmp.Canvas.Handle, Rect(0, 0, TmpBmp.Width, TmpBmp.Height), DefaultManager.GetGlobalColor);
CI := MakeCacheInfo(TmpBmp);
PaintItem(i, s_Button, CI, True, State, Rect(0, 0, TmpBmp.Width, TmpBmp.Height), Point(0, 0), TmpBmp, DefaultManager);
// PaintSmallItem(i, s_Button, CI, True, State, Rect(0, 0, TmpBmp.Width, TmpBmp.Height), Point(0, 0), TmpBmp, DefaultManager);
BitBlt(ACanvas.Handle, R.Left, R.Top, TmpBmp.Width, TmpBmp.Height, TmpBmp.Canvas.Handle, 0, 0, SRCCOPY);
if State = 0
then ACanvas.Font.Color := DefaultManager.gd[i].FontColor[1]
else ACanvas.Font.Color := DefaultManager.gd[i].HotFontColor[1];
ACanvas.Brush.Style := bsClear;
DrawText(ACanvas.Handle, PAnsiChar(ACaption), Length(ACaption), R, DT_EXPANDTABS + DT_VCENTER + DT_CENTER + DT_SINGLELINE);
FreeAndNil(TmpBmp);
end;
end else inherited DrawButton(ACanvas, R, ACaption, AState, ADrawBorder, AColor, ATextColor)
end;
class procedure TcxACLookAndFeelPainter.DrawCheckButton(ACanvas: TcxCanvas; R: TRect; AState: TcxButtonState; ACheckState: TcxCheckBoxState);
var
State, i, w, h, {x, y,} NewLeft, NewTop : integer;
TmpBmp : TBitmap;
begin
if Skinned then begin
case ACheckState of
cbsUnchecked : DefaultManager.GetMaskIndex(DefaultManager.ConstData.IndexGLobalInfo, s_GLobalInfo, s_SmallBoxUnChecked);
cbsChecked : i := DefaultManager.GetMaskIndex(DefaultManager.ConstData.IndexGLobalInfo, s_GLobalInfo, s_SmallBoxChecked);
cbsGrayed : i := DefaultManager.GetMaskIndex(DefaultManager.ConstData.IndexGLobalInfo, s_GLobalInfo, s_SmallBoxGrayed);
end;
if DefaultManager.IsValidImgIndex(i) then begin
TmpBmp := CreateBmp24(WidthOf(R), HeightOf(R));
FillDC(TmpBmp.Canvas.Handle, Rect(0, 0, TmpBmp.Width, TmpBmp.Height), DefaultManager.GetGlobalColor);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -