📄 sframeadapter.pas
字号:
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 + -