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

📄 sframeadapter.pas

📁 Alpha Controls.v5.46b Source
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit sFrameAdapter;
{$I sDefs.inc}
{.$DEFINE LOGGED}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  sConst, sCommondata, sPanel, acSBUtils{$IFDEF LOGGED}, sDebugMsgs{$ENDIF};

type
  TsFrameAdapter = class(TComponent)
{$IFNDEF NOTFORHELP}
  protected
    FCommonData: TsCommonData;
    procedure PrepareCache;
    procedure OurPaintHandler(Msg : TWMPaint; DefaultDrawing : boolean = True);
  public
    Frame : TFrame;
    OldWndProc: TWndMethod;
    ListSW : TacScrollWnd;
    procedure Loaded; override;
    procedure AfterConstruction; override;
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    procedure NewWndProc(var Message: TMessage); 
{$ENDIF} // NOTFORHELP
  published
    property SkinData : TsCommonData read FCommonData write FCommonData;
  end;

implementation

uses math, menus, sVclUtils, sBorders, sGraphUtils, sSkinProps, sSkinManager,
  sMaskData{$IFDEF CHECKXP}, UxTheme, Themes{$ENDIF}, acntUtils, sMessages, sStyleSimply,
  sAlphaGraph, sStrings, sSpeedButton;

const
  sWinControlForm = 'TWinControlForm';

{ TsFrameAdapter }

procedure TsFrameAdapter.AfterConstruction;
begin
  inherited;
  if Assigned(Frame) and GetBoolMsg(Frame, AC_CTRLHANDLED) then begin
    SkinData.UpdateIndexes;
{$IFDEF CHECKXP}
    Frame.ControlStyle := Frame.ControlStyle - [csParentBackground];
{$ENDIF}
  end;
end;

constructor TsFrameAdapter.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FCommonData := TsCommonData.Create(Self, True);
  if (FCommonData.SkinSection = ClassName) or (FCommonData.SkinSection = '') then FCommonData.SkinSection := s_GroupBox;
  FCommonData.COC := COC_TsFrameAdapter;

  if AOwner is TFrame then begin
    Frame := TFrame(AOwner);
    FCommonData.FOwnerControl := TControl(AOwner);
  end
  else begin
    Frame := nil;
    ShowError(LoadStr(s_FrameAdapterError1));
  end;

  if Frame <> nil then begin
    OldWndProc := Frame.WindowProc;
    Frame.WindowProc := NewWndProc;
  end;
end;

destructor TsFrameAdapter.Destroy;
begin
  if ListSW <> nil then FreeAndNil(ListSW);
  if (Frame <> nil) and Assigned(OldWndProc) then Frame.WindowProc := OldWndProc;
  Frame := nil;
  FreeAndNil(FCommonData);
  inherited Destroy;
end;

procedure TsFrameAdapter.Loaded;
var
  i : integer;
begin
  inherited Loaded;
  if Assigned(Frame) and GetBoolMsg(Frame, AC_CTRLHANDLED) and Assigned(SkinData) and Assigned(SkinData.SkinManager) then begin
    SkinData.UpdateIndexes;
    if not SkinData.SkinManager.SkinData.Active or (csDesigning in ComponentState) then Exit;
    if (csDesigning in Frame.ComponentState) and // Updating of form color in design-time
         (Frame.Parent.ClassName = sWinControlForm) and FCommonData.SkinManager.IsValidSkinIndex(FCommonData.SkinManager.ConstData.IndexGlobalInfo)
           then TsHackedControl(Frame.Parent).Color := SkinData.SkinManager.gd[FCommonData.SkinManager.ConstData.IndexGlobalInfo].Color;
    // Popups initialization
    for i := 0 to Frame.ComponentCount - 1 do begin
      if (Frame.Components[i] is TPopupMenu) and SkinData.SkinManager.SkinnedPopups then begin
        SkinData.SkinManager.SkinableMenus.HookPopupMenu(TPopupMenu(Frame.Components[i]), True);
      end
    end;
{$IFDEF CHECKXP}
    Frame.ControlStyle := Frame.ControlStyle - [csParentBackground];
{$ENDIF}
    if SkinData.Skinned then AddToAdapter(Frame)
  end;
end;

type
  TacWinControl = class(TWinControl);

procedure TsFrameAdapter.NewWndProc(var Message: TMessage);
var
  i : integer;
  m : TMessage;
begin
{$IFDEF LOGGED}
  AddToLog(Message);
{$ENDIF}
  if csDesigning in ComponentState then begin
    OldWndProc(Message);
    Exit;
  end;
  if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
    AC_CTRLHANDLED : begin Message.LParam := 1; Exit end; 
    AC_GETAPPLICATION : begin Message.Result := longint(Application); Exit end;
    AC_SETNEWSKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
      AlphaBroadCast(Frame, Message);
      CommonWndProc(Message, FCommonData);
      if not Assigned(SkinData.SkinManager) then Exit;
      for i := 0 to Frame.ComponentCount - 1 do
        if (Frame.Components[i] is TPopupMenu) and SkinData.SkinManager.SkinnedPopups
          then SkinData.SkinManager.SkinableMenus.HookPopupMenu(TPopupMenu(Frame.Components[i]), True);
      if (csDesigning in Frame.ComponentState) and // Updating of form color in design-time
           (Frame.Parent.ClassName = sWinControlForm) and (FCommonData.SkinManager.ConstData.IndexGlobalInfo > -1)
             then TsHackedControl(Frame.Parent).Color := SkinData.SkinManager.gd[FCommonData.SkinManager.ConstData.IndexGlobalInfo].Color;
      exit
    end;
    AC_REFRESH : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
      CommonWndProc(Message, FCommonData);
      if not Assigned(FCommonData.SkinManager) then Exit;
      if (csDesigning in Frame.ComponentState) and // Updating of form color in design-time
           (Frame.Parent.ClassName = sWinControlForm) and (FCommonData.SkinManager.ConstData.IndexGlobalInfo > -1)
             then TsHackedControl(Frame.Parent).Color := SkinData.SkinManager.gd[FCommonData.SkinManager.ConstData.IndexGlobalInfo].Color;
      AlphaBroadcast(Frame, Message);
      RedrawWindow(Frame.Handle, nil, 0, RDW_NOERASE or RDW_UPDATENOW or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME);
      RefreshScrolls(SkinData, ListSW);
      exit
    end;
    AC_STOPFADING : AlphaBroadcast(Frame, Message);
    AC_BEFORESCROLL : if GetBoolMsg(Frame, AC_CHILDCHANGED) or FCommonData.RepaintIfMoved then begin
      SendMessage(Frame.Handle, WM_SETREDRAW, 0, 0);
    end;
    AC_AFTERSCROLL : if GetBoolMsg(Frame, AC_CHILDCHANGED) or FCommonData.RepaintIfMoved then begin
      SendMessage(Frame.Handle, WM_SETREDRAW, 1, 0);
      RedrawWindow(Frame.Handle, nil, 0, RDW_NOERASE or RDW_UPDATENOW or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME);
    end;
    AC_REMOVESKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
      if ListSW <> nil then FreeAndNil(ListSW);
      CommonWndProc(Message, FCommonData);
      if (csDesigning in Frame.ComponentState) and // Updating of form color in design-time
           Assigned(Frame.Parent) and
           (Frame.Parent.ClassName = sWinControlForm)
             then TsHackedControl(Frame.Parent).Color := clBtnFace;
      AlphaBroadcast(Frame, Message);
      SetWindowPos(Frame.Handle, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_FRAMECHANGED);
      RedrawWindow(Frame.Handle, nil, 0, RDW_ERASE or RDW_UPDATENOW or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME);
      exit
    end;
    AC_GETCACHE : if SkinData <> nil then begin
      GlobalCacheInfo := MakeCacheInfo(SkinData.FCacheBmp);
      Exit;
    end;
  end;
  if (csDestroying in ComponentState) or (csDestroying in Frame.ComponentState) or not FCommonData.Skinned or not SkinData.SkinManager.SkinData.Active then begin
    OldWndProc(Message);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -