📄 scommondata.pas
字号:
if not Assigned(SkinManager) or not SkinManager.SkinData.Active then begin
Result := True;
Exit
end
else Result := FUpdating;
if (Self = nil) or (FOwnerControl = nil) or (csDestroying in FOwnerControl.ComponentState) then Exit;
if not Self.FUpdating and (FOwnerControl <> nil) and (FOwnerControl.Parent <> nil)
then Result := GetBoolMsg(FOwnerControl.Parent, AC_PREPARING)
else Result := True
end;
procedure TsCommonData.InitCacheBmp;
begin
if not Assigned(FCacheBmp) then FCacheBmp := TBitmap.Create;
if FCacheBmp.PixelFormat <> pf24bit then FCacheBmp.PixelFormat := pf24bit;
if FCacheBmp.HandleType <> bmDIB then FCacheBmp.HandleType := bmDIB;
if Assigned(FOwnerControl) then begin
if FCacheBmp.Width <> FOwnerControl.Width then FCacheBmp.Width := FOwnerControl.Width;
if FCacheBmp.Height <> FOwnerControl.Height then FCacheBmp.Height := FOwnerControl.Height;
end
end;
procedure TsCommonData.Invalidate;
begin
if Assigned(FOwnerControl) and not ((csDestroying in FOwnerControl.ComponentState) or (csLoading in FOwnerControl.ComponentState)) then begin
BGChanged := True;
if ControlIsReady(FOwnerControl) then FOwnerControl.Invalidate
end;
end;
procedure TsCommonData.Loaded;
begin
UpdateData(Self);
{$IFDEF CHECKXP}
if Assigned(FownerControl) and not Skinned then begin
if UseThemes then
FownerControl.ControlStyle := FownerControl.ControlStyle - [csParentBackground]; // Patching of bug with TGraphicControls repainting when XPThemes used
end;
{$ENDIF}
if Skinned and Assigned(FOwnerControl) and Assigned(FOwnerControl.Parent) and not (csLoading in FOwnerControl.ComponentState) then begin
if FOwnerControl is TWinControl then begin
AddToAdapter(TWinControl(FOwnerControl))
end;
if ((FOwnerControl is TCustomEdit) or (COC = COC_TsAlphaListBox)) then begin
if not CustomColor and (TsHackedControl(FOwnerControl).Color <> SkinManager.gd[SkinIndex].Color) then TsHackedControl(FOwnerControl).Color := SkinManager.gd[SkinIndex].Color;
if not CustomFont and (TsHackedControl(FOwnerControl).Font.Color <> SkinManager.gd[SkinIndex].FontColor[1]) then TsHackedControl(FOwnerControl).Font.Color := SkinManager.gd[SkinIndex].FontColor[1];
end;
end;
end;
function TsCommonData.ManagerStored: boolean;
begin
Result := (FSkinManager <> nil)
end;
function TsCommonData.ParentTextured: boolean;
begin
if Assigned(FOwnerControl) and Assigned(FOwnerControl.Parent) and FOwnerControl.Parent.HandleAllocated
then Result := GetBoolMsg(FOwnerControl.Parent, AC_CHILDCHANGED)
else Result := False;
end;
function TsCommonData.RepaintIfMoved: boolean;
begin
if (Self = nil) or UrgentPainting or not Skinned or{$IFNDEF ALITE}(FOwnerControl is TsTabSheet) or{$ENDIF} (FOwnerControl = nil) or
(csCreating in FOwnerControl.ControlState) or not FOwnerControl.Visible then begin
Result := True;
Exit;
end;
if (SkinIndex < 0) or (SkinIndex > High(SkinManager.gd)) then { if is not skinned } Result := False else begin
Result := (FOwnerControl <> nil) and not FOwnerControl.Enabled;
if not Result then Result := (SkinManager.gd[SkinIndex].Transparency > 0);
if Result and Assigned(FOwnerControl) and Assigned(FOwnerControl.Parent) and FOwnerControl.Parent.HandleAllocated then begin
Result := GetBoolMsg(FOwnerControl.Parent, AC_CHILDCHANGED);
end;
end;
end;
procedure TsCommonData.SetCustomColor(const Value: boolean);
begin
if FCustomColor <> Value then begin
FCustomColor := Value;
if Skinned and Assigned(FOwnerControl) and (FOwnerControl is TCustomEdit) and not (csLoading in FOwnerControl.ComponentState) then begin // v4.32
if not CustomColor and (TsHackedControl(FOwnerControl).Color <> SkinManager.gd[SkinIndex].Color) then TsHackedControl(FOwnerControl).Color := SkinManager.gd[SkinIndex].Color;
if not CustomFont and (TsHackedControl(FOwnerControl).Font.Color <> SkinManager.gd[SkinIndex].FontColor[1]) then TsHackedControl(FOwnerControl).Font.Color := SkinManager.gd[SkinIndex].FontColor[1];
Invalidate
end;
end;
end;
procedure TsCommonData.SetCustomFont(const Value: boolean);
begin
if FCustomFont <> Value then begin
FCustomFont := Value;
Invalidate
end;
end;
procedure TsCommonData.SetSkinManager(const Value: TsSkinManager);
var
m : TMEssage;
begin
if FSkinManager <> Value then begin
if Value <> DefaultManager then FSkinManager := Value else FSkinManager := nil;
if (FOwnerControl <> nil) and (csLoading in FOwnerControl.ComponentState) then Exit;
if Assigned(Value) and (Length(Value.gd) > 0) then UpdateIndexes else SkinIndex := -1;
if Assigned(FOwnerObject) and (FOwnerObject is TsSkinProvider) then begin
if Assigned(Value) and (Length(Value.gd) > 0) and Value.IsValidSkinIndex(SkinIndex)
then m.WParam := MakeWParam(0, AC_REFRESH) else m.WParam := MakeWParam(0, AC_REMOVESKIN);
m.Msg := SM_ALPHACMD;
m.LParam := LongWord(Value);
TsSkinProvider(FOwnerObject).DsgnWndProc(m);
end
else if (FOwnerControl <> nil) and (FOwnerControl.Parent <> nil) and not (csDestroying in FOwnerControl.ComponentState) then begin
try
if Assigned(Value) and (Length(Value.gd) > 0) and Value.IsValidSkinIndex(SkinIndex)
then FOwnerControl.Perform(SM_ALPHACMD, MakeWParam(0, AC_REFRESH), LongWord(Value))
else FOwnerControl.Perform(SM_ALPHACMD, MakeWParam(0, AC_REMOVESKIN), LongWord(Value));
except
end;
end;
end;
end;
procedure TsCommonData.SetSkinSection(const Value: string);
begin
if FSkinSection <> Value then begin
if Value = '' then FSkinSection := s_Unknown else FSkinSection := UpperCase(Value);
if Assigned(SkinManager) and (Length(SkinManager.gd) > 0) then UpdateIndexes else SkinIndex := -1;
if (FOwnerControl <> nil) and not (csLoading in FOwnerControl.ComponentState) and not (csReading in FOwnerControl.ComponentState) {v5.45} and
(FOwnerControl.Parent <> nil) and not (csDestroying in FOwnerControl.ComponentState) then begin
if Assigned(SkinManager) and (Length(SkinManager.gd) > 0) and SkinManager.IsValidSkinIndex(SkinIndex)
then FOwnerControl.Perform(SM_ALPHACMD, MakeWParam(0, AC_REFRESH), LongWord(SkinManager))
else FOwnerControl.Perform(SM_ALPHACMD, MakeWParam(0, AC_REMOVESKIN), LongWord(SkinManager));
end;
end;
end;
procedure TsCommonData.SetUpdating(const Value: boolean);
begin
FUpdating := Value;
end;
function TsCommonData.Skinned(CheckSkinActive : boolean = False): boolean;
begin
try
if (Self = nil) or ((Self.FOwnerObject <> nil) and (csDestroying in TComponent(Self.FOwnerObject).ComponentState)) or
(SkinManager = nil) or (csDestroying in SkinManager.ComponentState)
then Result := False
else Result := (not CheckSkinActive or SkinManager.SkinData.Active) and SkinManager.IsValidSkinIndex(SkinIndex);
finally
end;
end;
function CommonMessage(var Message: TMessage; SkinData : TsCommonData) : boolean;
var
i : integer;
begin
Result := False;
if SkinData <> nil then with SkinData do if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
AC_SETTRANSBGCHANGED : begin
if BgIsTransparent(SkinData) and (Message.WParamLo = 1) then BGChanged := True;
end;
AC_UPDATESECTION : if UpperCase(SkinSection) = GlobalSectionName then begin
RestrictDrawing := False;
Invalidate;
end;
AC_SETGRAPHCONTROL : GraphControl := pointer(Message.LParam);
AC_PREPARING : begin
Message.LParam := integer(BGChanged or Updating);
Result := True;
end;
AC_UPDATING : FUpdating := Message.WParamLo = 1;
AC_GETHALFVISIBLE : begin
Message.LParam := integer(HalfVisible);
Result := True;
end;
AC_URGENTPAINT : UrgentPainting := Message.WParamLo = 1;
AC_CHILDCHANGED : if (SkinData.SkinIndex > -1) then begin
if (SkinData.SkinManager.gd[SkinData.SkinIndex].Transparency = 100) and (FOwnerControl <> nil) and (FOwnerControl.Parent <> nil)
then Message.LParam := integer(ParentTextured)
else Message.LParam := integer((SkinData.SkinManager.gd[SkinData.SkinIndex].GradientPercent + SkinData.SkinManager.gd[SkinData.SkinIndex].ImagePercent > 0) or SkinData.RepaintIfMoved);
Message.Result := Message.LParam;
Result := True;
end;
AC_SETNEWSKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
FUpdating := True;
UpdateIndexes;
RestrictDrawing := False;
end;
AC_SETBGCHANGED : BGChanged := True;
AC_SETHALFVISIBLE : HalfVisible := True;
AC_REFRESH : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
BGChanged := True;
Updating := False;
if Skinned and Assigned(FOwnerControl) then begin
if (FOwnerControl is TCustomEdit) then begin
if not CustomColor then TsHackedControl(FOwnerControl).Color := SkinData.SkinManager.gd[SkinIndex].Color;
if not CustomFont then TsHackedControl(FOwnerControl).Font.Color := SkinData.SkinManager.gd[SkinIndex].FontColor[1];
end;
if (FOwnerControl is TWinControl) then AddToAdapter(TWinControl(FOwnerControl))
end;
end;
AC_REMOVESKIN : if LongWord(Message.LParam) = LongWord(SkinData.SkinManager) then begin
if (SkinData.SkinManager <> nil) and (csDestroying in SkinData.SkinManager.ComponentState) then FSkinManager := nil;
BorderIndex := -1;
SkinIndex := -1;
Texture := -1;
HotTexture := -1;
FUpdating := True;
if Assigned(FCacheBmp) then begin
FCacheBmp.Width := 0;
FCacheBmp.Height := 0;
end;
if Assigned(FOwnerControl) and (FOwnerControl is TCustomEdit) then begin // v4.32
if not CustomColor then TsHackedControl(FOwnerControl).Color := clWindow;
if not CustomFont then TsHackedControl(FOwnerControl).Font.Color := clWindowText;
end
{$IFDEF CHECKXP}
// if UseThemes and (SkinData.FOwnerControl <> nil) and (SkinData.FOwnerControl is TWinControl) then begin
// SetWindowTheme(TWinControl(SkinData.FOwnerControl).Handle, nil, nil);
// end;
{$ENDIF}
end;
AC_GETCACHE : begin
GlobalCacheInfo.Ready := False;
if Assigned(FCacheBmp) then GlobalCacheInfo := MakeCacheInfo(FCacheBmp);
end;
AC_GETCONTROLCOLOR : begin
if SkinData.Skinned then begin
case SkinData.SkinManager.gd[SkinData.Skinindex].Transparency of
0 : begin
if SkinData.CustomColor and (SkinData.FOwnerControl <> nil)
then ParentCenterColor := TsHackedControl(SkinData.FOwnerControl).Color
else ParentCenterColor := SkinData.SkinManager.gd[SkinData.Skinindex].Color;
end;
100 : begin
if FOwnerControl.Parent <> nil
then begin
SendMessage(FOwnerControl.Parent.Handle, SM_ALPHACMD, MakeWParam(0, AC_GETCONTROLCOLOR), 0);
if ParentCenterColor = clFuchsia {if AlphaMessage not supported} then ParentCenterColor := ColortoRGB(TsHackedControl(FOwnerControl.Parent).Color)
end
else ParentCenterColor := ColorToRGB(TsHackedControl(FOwnerControl).Color);
end
else begin
if FOwnerControl.Parent <> nil
then begin
SendMessage(FOwnerControl.Parent.Handle, SM_ALPHACMD, MakeWParam(0, AC_GETCONTROLCOLOR), 0);
if ParentCenterColor = clFuchsia {if AlphaMessage not supported} then ParentCenterColor := ColortoRGB(TsHackedControl(FOwnerControl.Parent).Color)
end
else ParentCenterColor := ColorToRGB(TsHackedControl(FOwnerControl).Color);
// Mixing of colors
C1.C := ParentCenterColor;
C2.C := SkinData.SkinManager.gd[SkinData.Skinindex].Color;
C1.R := IntToByte(((C1.R - C2.R) * SkinData.SkinManager.gd[SkinData.Skinindex].Transparency + C2.R shl 8) shr 8);
C1.G := IntToByte(((C1.G - C2.G) * SkinData.SkinManager.gd[SkinData.Skinindex].Transparency + C2.G shl 8) shr 8);
C1.B := IntToByte(((C1.B - C2.B) * SkinData.SkinManager.gd[SkinData.Skinindex].Transparency + C2.B shl 8) shr 8);
ParentCenterColor := C1.C;
end
end;
end
else if Assigned(FOwnerControl) then ParentCenterColor := ColorToRGB(TsHackedControl(FOwnerControl).Color);
Result := True;
end;
AC_SETCHANGEDIFNECESSARY : begin
b := SkinData.RepaintIfMoved;
SkinData.BGChanged := SkinData.BGChanged or b;
if (SkinData.FOwnerControl <> nil) and (SkinData.FOwnerControl is TWinControl) then begin
if (Message.WParamLo = 1) then RedrawWindow(TWinControl(SkinData.FOwnerControl).Handle, nil, 0, RDW_NOERASE + RDW_NOINTERNALPAINT + RDW_INVALIDATE + RDW_ALLCHILDREN);
if b and Assigned(FOwnerControl) then for i := 0 to TWinControl(SkinData.FOwnerControl).ControlCount - 1 do begin
if (i < TWinControl(SkinData.FOwnerControl).ControlCount) and not (csDestroying in TWinControl(SkinData.FOwnerControl).Controls[i].ComponentState)
then SendAMessage(TWinControl(FOwnerControl).Controls[i], AC_SETCHANGEDIFNECESSARY)
end
end;
end;
AC_GETAPPLICATION : begin Message.Result := longint(Application); Exit end;
AC_CTRLHANDLED : begin
Message.LParam := 1;
Result := True;
end;
end;
end;
procedure TsCommonData.UpdateIndexes;
begin
BGChanged := True;
if Assigned(SkinManager) then SkinIndex := SkinManager.GetSkinIndex(SkinSection) else SkinIndex := -1;
if SkinIndex > -1 then begin
BorderIndex := SkinManager.GetMaskIndex(SkinIndex, SkinSection, s_BordersMask);
Texture := SkinManager.GetTextureIndex(SkinIndex, SkinSection, s_Pattern);
HotTexture := SkinManager.GetTextureIndex(SkinIndex, SkinSection, s_HotPattern);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -