📄 aqdockinguithemed.pas
字号:
ACanvas.Brush.Color := clBtnFace;
ACanvas.FillRect(ARect);
CloseThemeData(Theme);
end
else
inherited DoDrawSplitter(ACanvas, ARect, AOrientation);
end;
procedure TaqThemedUIStyle.DoDrawControl(
ACanvas: TCanvas; ARect: TRect; AKind: TaqDockControlDrawKind);
begin
inherited DoDrawControl(ACanvas, ARect, AKind);
end;
procedure TaqThemedUIStyle.DoDrawTabButton(ACanvas: TCanvas; ARect: TRect;
AState: TaqTabButtonState; AKind: TaqTabButtonKind);
const
Parts: array [TaqTabButtonKind] of Integer =
(SPNP_DOWNHORZ, SPNP_UPHORZ, 0, CP_DROPDOWNBUTTON, CP_DROPDOWNBUTTON);
States: array [TaqTabButtonState] of Integer =
(UPS_NORMAL, UPS_HOT, UPS_PRESSED, UPS_DISABLED);
var
Theme: HTHEME;
begin
if FThemeAvailable and (AKind <> tbkClose) then
begin
if not (AKind in [tbkPopup, tbkPopupEx]) then
Theme := OpenThemeData(TWinControl(TControlCanvas(ACanvas).Control).Handle, 'Spin')
else
Theme := OpenThemeData(TWinControl(TControlCanvas(ACanvas).Control).Handle, 'ComboBox');
end
else
Theme := 0;
if Theme <> 0 then
begin
DrawThemeBackground(Theme, ACanvas.Handle, Parts[AKind], States[AState], ARect, @ARect);
CloseThemeData(Theme);
end
else
inherited DoDrawTabButton(ACanvas, ARect, AState, AKind);
end;
procedure TaqThemedUIStyle.DoDrawTabItem(ACanvas: TCanvas; ARect: TRect;
const ACaption: string; AState: TaqTabItemState; APosition: TaqTabItemPosition;
AOrientation: TaqOrientation;
AButtonAreaWidthBefore: Integer; AButtonAreaWidthAfter: Integer;
ADrawImage: Boolean; AImages: TCustomImageList; AImageIndex: Integer);
const
Parts: array [TaqTabItemPosition] of Integer =
(TABP_TABITEMLEFTEDGE, TABP_TABITEM, TABP_TABITEMRIGHTEDGE);
States: array [TaqTabItemState] of Integer =
(TIS_NORMAL, TIS_HOT, TIS_SELECTED, TIS_DISABLED, TIS_SELECTED{TIS_FOCUSED});
Border: array [TaqTabOrientation] of Cardinal =
(BF_TOP, BF_BOTTOM);
State2: array [TaqTabItemState] of Cardinal =
(0, 0, 0, DTT_GRAYED, 0);
var
Theme: HTHEME;
PadRect, ContentRect: TRect;
ActiveTab: Boolean;
PartId: Integer;
begin
if FThemeAvailable then
Theme := OpenThemeData(TWinControl(TControlCanvas(ACanvas).Control).Handle, 'Tab')
else
Theme := 0;
if Theme <> 0 then
begin
ActiveTab := AState in [tisSelected, tisFocused];
if ActiveTab then
PartId := Parts[tipMiddle]
else
PartId := Parts[APosition];
GetThemeBackgroundContentRect(Theme, ACanvas.Handle, PartId,
States[AState], ARect, @ContentRect);
if ActiveTab then
Dec(ARect.Left, 2);
// if APosition <> tipLast then
Inc(ARect.Right);
case AOrientation of
orTop:
begin
PadRect := ARect;
PadRect.Top := PadRect.Bottom - FMetrics[dumTabPadding];
if ActiveTab then
Dec(ARect.Bottom, FMetrics[dumTabPadding] - 2)
else
begin
Inc(ARect.Top, FMetrics[dumTabTopOffset]);
Dec(ARect.Bottom, FMetrics[dumTabPadding]);
end;
end;
orBottom:
begin
PadRect := ARect;
PadRect.Bottom := PadRect.Top + FMetrics[dumTabPadding];
if ActiveTab then
begin
Inc(ARect.Top, FMetrics[dumTabPadding] - 2);
Dec(ARect.Bottom);
end
else
begin
Dec(ARect.Bottom, FMetrics[dumTabTopOffset] + 1);
Inc(ARect.Top, FMetrics[dumTabPadding]);
end;
end;
end;
DrawThemeEx(Theme, ACanvas, ARect, PartId, States[AState],
AOrientation);
CloseThemeData(Theme);
if ActiveTab then
Inc(ARect.Left, 2);
// if APosition <> tipLast then
Dec(ARect.Right);
Inc(ContentRect.Left, AButtonAreaWidthBefore);
Dec(ContentRect.Right, AButtonAreaWidthAfter);
DoDrawTabItemContent(ACanvas, ContentRect, ACaption, AState,
AOrientation, ADrawImage, True, TabFont,
ActiveTabFont, AImages, AImageIndex, True);
end
else
inherited DoDrawTabItem(ACanvas, ARect, ACaption, AState, APosition,
AOrientation, AButtonAreaWidthBefore, AButtonAreaWidthAfter, ADrawImage, AImages, AImageIndex);
end;
procedure TaqThemedUIStyle.DoDrawTabPane(ACanvas: TCanvas; ARect: TRect;
AOrientation: TaqTabOrientation);
var
Theme: HTHEME;
const
Border: array [TaqTabOrientation] of Cardinal =
(BF_TOP or BF_RIGHT or BF_LEFT, BF_BOTTOM or BF_RIGHT or BF_LEFT);
Orientations: array [TaqTabOrientation] of TaqOrientation =
(orTop, orBottom);
begin
if FThemeAvailable then
Theme := OpenThemeData(TWinControl(TControlCanvas(ACanvas).Control).Handle, 'Tab')
else
Theme := 0;
if Theme <> 0 then
begin
ACanvas.Brush.Style := bsSolid;
ACanvas.Brush.Color := clBtnFace;
ACanvas.FillRect(ARect);
CloseThemeData(Theme);
Theme := OpenThemeData(TWinControl(TControlCanvas(ACanvas).Control).Handle, 'Tab');
case AOrientation of
dtoTop:
begin
ARect.Top := ARect.Bottom - FMetrics[dumTabPadding];
Inc(ARect.Bottom, 10);
end;
dtoBottom:
begin
ARect.Bottom := ARect.Top + FMetrics[dumTabPadding];
Dec(ARect.Top, 10);
end;
end;
DrawThemeEx(Theme, ACanvas, ARect, TABP_PANE, 0, Orientations[AOrientation]);
CloseThemeData(Theme);
end
else
inherited DoDrawTabPane(ACanvas, ARect, AOrientation);
end;
procedure TaqThemedUIStyle.DoDrawTabTarget(ACanvas: TCanvas; ARect: TRect);
begin
inherited DoDrawTabTarget(ACanvas, ARect);
end;
procedure TaqThemedUIStyle.DoDrawCaptionButtonWidget(ACanvas: TCanvas; ARect: TRect;
AState: TaqDockButtonState; ACaptionState: TaqDockCaptionState; AKind: TaqDockButtonKind);
const
States: array [TaqDockButtonState] of Integer =
(TS_NORMAL, TS_HOT, TS_PRESSED, TS_DISABLED);
var
Theme: HTHEME;
ButtonWidget: TaqCaptionButton;
begin
if FThemeAvailable then
begin
ButtonWidget := FCaptionButtonWidgets[AKind];
if (ButtonWidget.ImageIndex <> -1) and (ButtonWidget.Owner.Images <> nil) then
begin
Theme := OpenThemeData(GetDesktopWindow, 'Toolbar');
if Theme <> 0 then
begin
DrawThemeBackground(Theme, ACanvas.Handle, TP_BUTTON, States[AState],
ARect, @ARect);
DrawImage(ButtonWidget.Owner.Images, ButtonWidget.ImageIndex,
ACanvas, ARect, AState <> dbsDisabled, CaptionButtons.DrawStyle);
CloseThemeData(Theme);
end
end
else
DrawCaptionWidget(ACanvas, ARect, AState, ACaptionState, ButtonWidget.PartIndex);
end
else
inherited DoDrawCaptionButtonWidget(ACanvas, ARect, AState, ACaptionState, AKind);
end;
function TaqThemedUIStyle.GetMetric(
AMetric: TaqDockingUIMetric): Integer;
begin
Result := inherited GetMetric(AMetric);
if FThemeAvailable then
case AMetric of
dumCaptionBorderX: Result := 3;
dumCaptionBorderY: Result := 1;
end;
end;
procedure TaqThemedUIStyle.CheckAeroStyle;
var
ThemeFile: PWideChar;
ThemeName: PWideChar;
const
cFileNameLength = 256;
cAeroName = 'Aero';
begin
GetMem(ThemeFile, cFileNameLength);
if GetCurrentThemeName(ThemeFile, cFileNameLength, nil, 0, nil, 0) = S_OK then
begin
GetMem(ThemeName, cFileNameLength);
GetThemeDocumentationProperty(ThemeFile, SZ_THDOCPROP_CANONICALNAME, ThemeName, cFileNameLength);
if (ThemeName = cAeroName) then
CaptionButtonWidthRatio := cVistaAeroStyleButtonRatio;
FreeMem(ThemeName);
end;
FreeMem(ThemeFile);
end;
procedure TaqThemedUIStyle.SetCaptionButtons(
const Value: TaqCaptionButtonWidgets);
begin
if Value <> FCaptionButtonWidgets then
begin
if Value <> nil then
FCaptionButtonWidgets.Assign(Value)
else
FCaptionButtonWidgets.Reset;
end;
end;
procedure TaqThemedUIStyle.GetChildren(Proc: TGetChildProc;
Root: TComponent);
begin
Proc(FCaptionButtonWidgets);
end;
procedure TaqThemedUIStyle.ReadState(Reader: TReader);
var
OldOnFind: TFindComponentClassEvent;
OldOnCreate: TCreateComponentEvent;
begin
OldOnFind := Reader.OnFindComponentClass;
OldOnCreate := Reader.OnCreateComponent;
Reader.OnFindComponentClass := DoFindComponentClass;
Reader.OnCreateComponent := DoCreateComponent;
inherited ReadState(Reader);
Reader.OnFindComponentClass := OldOnFind;
Reader.OnCreateComponent := OldOnCreate;
end;
procedure TaqThemedUIStyle.DoFindComponentClass(Reader: TReader;
const ClassName: string; var ComponentClass: TComponentClass);
begin
if ClassName = TaqCaptionButtonWidgets.ClassName then
ComponentClass := TaqCaptionButtonWidgets;
end;
procedure TaqThemedUIStyle.DoCreateComponent(Reader: TReader;
ComponentClass: TComponentClass; var Component: TComponent);
begin
if ComponentClass = TaqCaptionButtonWidgets then
Component := FCaptionButtonWidgets;
end;
procedure TaqThemedUIStyle.ThemeChange(Sender: TObject);
begin
CheckTheme;
Change;
end;
class procedure TaqThemedUIStyle.DrawThemeEx(Theme: HTHEME;
ACanvas: TCanvas; ARect: TRect; PartId, StateId: Integer;
AOrientation: TaqOrientation);
var
Bmp: Graphics.TBitmap;
R: TRect;
Region: HRGN;
begin
case AOrientation of
orTop:
DrawThemeBackground(Theme, ACanvas.Handle, PartId, StateId, ARect, @ARect);
orLeft, orRight, orBottom:
begin
Bmp := Graphics.TBitmap.Create;
if AOrientation in [orLeft, orRight] then
begin
Bmp.Width := ARect.Bottom - ARect.Top;
Bmp.Height := ARect.Right - ARect.Left;
end
else
begin
Bmp.Width := ARect.Right - ARect.Left;
Bmp.Height := ARect.Bottom - ARect.Top;
end;
R := Rect(0, 0, Bmp.Width, Bmp.Height);
Bmp.Canvas.Brush.Style := bsSolid;
Bmp.Canvas.Brush.Color := clBtnFace;
Bmp.Canvas.FillRect(R);
GetThemeBackgroundRegion(Theme, ACanvas.Handle, PartId, StateId, ARect, Region);
DrawThemeBackground(Theme, Bmp.Canvas.Handle, PartId, StateId, R, @R);
DrawImageEx(Bmp, ACanvas, ARect, AOrientation, Region);
DeleteObject(Region);
Bmp.Free;
end;
end;
end;
class procedure TaqThemedUIStyle.DrawCaptionWidget(ACanvas: TCanvas;
ARect: TRect; AState: TaqDockButtonState;
ACaptionState: TaqDockCaptionState; AWidget: TaqCaptionButtonWidget);
const
States2: array [TaqDockButtonState] of Integer =
(PBS_NORMAL, PBS_HOT, PBS_PRESSED, PBS_DISABLED);
States: array [TaqDockButtonState] of Integer =
(TS_NORMAL, TS_HOT, TS_PRESSED, TS_DISABLED);
Orientation: array [Boolean] of TaqOrientation = (orRight, orTop);
function GetButtonState(ButtonStyle: TaqDockButtonState;
CanDefaulted: Boolean): Integer;
begin
if CanDefaulted and (ButtonStyle = dbsNormal) and
(not (ACaptionState in [dcsSelected, dcsFocused])) then
begin
Result := PBS_DEFAULTED;
Exit;
end;
Result := States2[ButtonStyle];
end;
var
Theme: HTHEME;
StyleName: WideString;
Hndl: THandle;
Bitmap, RotatedBitmap: Graphics.TBitmap;
X: Integer;
R: TRect;
begin
case AWidget of
bwNone:
Exit;
bwDropDown:
StyleName := 'Combobox';
bwPushButton:
StyleName := 'Button';
bwSpinUp..bwSpinLeft:
StyleName := 'Spin';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -