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

📄 aqdockinguithemed.pas

📁 AutomatedDocking Library 控件源代码修改 适合Delphi 2009 和C++ Builder 20009 使用。 修正汉字不能正确显示问题
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    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 + -