📄 sframeadapter.pas
字号:
end
else begin
if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
AC_SETTRANSBGCHANGED : if BgIsTransparent(SkinData) then FCOmmonData.BGChanged := True;
{ AC_URGENTPAINT : begin
FCommonData.UrgentPainting := boolean(Message.wParam);
if FCommonData.UrgentPainting then PrepareCache;
CommonWndProc(Message, FCommonData);
Exit;
end; }
AC_CHILDCHANGED : begin
if (SkinData.SkinIndex < 0) or not Assigned(SkinData.SkinManager)
then Message.LParam := 0
else Message.LParam := integer((SkinData.SkinManager.gd[SkinData.SkinIndex].GradientPercent + SkinData.SkinManager.gd[SkinData.SkinIndex].ImagePercent > 0) or SkinData.RepaintIfMoved);
Message.Result := Message.LParam;
Exit;
end;
AC_PREPARING : begin
Message.LParam := integer(FCommonData.BGChanged or FCommonData.Updating);
Exit
end;
AC_UPDATING : begin
FCommonData.Updating := Message.WParamLo = 1;
for i := 0 to Frame.ControlCount - 1 do Frame.Controls[i].Perform(Message.Msg, Message.WParam, Message.LParam);
Exit;
end;
AC_GETCACHE : begin
GlobalCacheInfo := MakeCacheInfo(FCommonData.FCacheBmp);
Exit;
end;
AC_ENDPARENTUPDATE : if IsNT or (not IsNT and FCommonData.Updating) {for win9x} then begin
// AC_ENDPARENTUPDATE : if FCommonData.Updating then begin // 5.40
FCommonData.Updating := False;
// RedrawWindow(Frame.Handle, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ERASE);
RedrawWindow(Frame.Handle, nil, 0, RDW_INTERNALPAINT or RDW_ALLCHILDREN or RDW_INVALIDATE or RDW_ERASE or RDW_FRAME or RDW_UPDATENOW);
Exit;
end else Exit;
AC_GETCONTROLCOLOR : begin
if SkinData.Skinned then begin //???? Not all controls may be Hot ???? but... in thinking
case SkinData.SkinManager.gd[SkinData.Skinindex].Transparency of
0 : ParentCenterColor := SkinData.SkinManager.gd[SkinData.Skinindex].Color;
100 : begin if Frame.Parent <> nil
then begin
SendMessage(Frame.Parent.Handle, SM_ALPHACMD, MakeWParam(0, AC_GETCONTROLCOLOR), 0);
if ParentCenterColor = clFuchsia {if AlphaMessage not supported} then ParentCenterColor := TsHackedControl(Frame.Parent).Color
end
else ParentCenterColor := ColorToRGB(Frame.Color);
end
else begin
if Frame.Parent <> nil
then SendMessage(Frame.Parent.Handle, SM_ALPHACMD, MakeWParam(0, AC_GETCONTROLCOLOR), 0)
else ParentCenterColor := ColorToRGB(Frame.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(Frame) then ParentCenterColor := ColorToRGB(TsHackedControl(Frame).Color);
end
end
else case Message.Msg of
CM_MOUSEENTER : if not (csDesigning in ComponentState) then begin
OldWndProc(Message);
for i := 0 to Frame.ControlCount - 1 do begin
if (Frame.Controls[i] is TsSpeedButton) and (Frame.Controls[i] <> Pointer(Message.LParam)) and TsSpeedButton(Frame.Controls[i]).SkinData.FMouseAbove then begin
Frame.Controls[i].Perform(CM_MOUSELEAVE, 0, 0) // !!!!
end;
end;
if DefaultManager <> nil then DefaultManager.ActiveControl := Frame.Handle;
end;
CM_VISIBLECHANGED : begin
FCommonData.BGChanged := True;
OldWndProc(Message);
if Assigned(SkinData.SkinManager) then SendMessage(Frame.Handle, SM_ALPHACMD, MakeWParam(0, AC_REFRESH), LongWord(SkinData.SkinManager));
// Frame.Repaint;
// FCommonData.BGChanged := False;
end;
WM_SIZE, WM_MOVE : begin
FCommonData.BGChanged := FCommonData.BGChanged or (Message.Msg = WM_SIZE) or FCommonData.RepaintIfMoved;
if FCommonData.BGChanged then begin
m := MakeMessage(SM_ALPHACMD, MakeWParam(1, AC_SETBGCHANGED), 0, 0);
Frame.BroadCast(m);
end;
OldWndProc(Message);
// Frame.Repaint;
// if not FCommonData.Updating then FCommonData.BGChanged := False;
end;
WM_PARENTNOTIFY : if ((Message.WParam and $FFFF = WM_CREATE) or (Message.WParam and $FFFF = WM_DESTROY)) and not (csLoading in ComponentState) and not (csCreating in Frame.ControlState) then begin
OldWndProc(Message);
UpdateScrolls(ListSW, False);
if Message.WParamLo = WM_CREATE then AddToAdapter(Frame);
end
else OldWndProc(Message);
CM_SHOWINGCHANGED : begin
OldWndProc(Message);
RefreshScrolls(SkinData, ListSW);
AddToAdapter(Frame);
end;
WM_PAINT : begin
if (csDesigning in Frame.ComponentState) or (Frame.Parent = nil) or (csDestroying in ComponentState)
then OldWndProc(Message)
else OurPaintHandler(TWMPaint(Message));
end;
WM_PRINT : if FCommonData.Skinned then begin
FCommonData.Updating := False;
if ControlIsReady(Frame) then begin
OurPaintHandler(TWMPaint(Message), False);
Ac_NCPaint(ListSW, Frame.Handle, Message.wParam, Message.lParam, -1, TWMPaint(Message).DC);
end;
end
else OldWndProc(Message);
WM_NCPAINT, WM_ERASEBKGND : if csDesigning in Frame.ComponentState then OldWndProc(Message) else begin
FCommonData.Updating := FCommonData.Updating;
Message.Result := 1;
end;
else OldWndProc(Message);
end;
end;
end;
procedure TsFrameAdapter.OurPaintHandler(Msg: TWMPaint; DefaultDrawing : boolean = True);
var
Changed : boolean;
DC, SavedDC : hdc;
PS : TPaintStruct;
begin
BeginPaint(Frame.Handle, PS);
if not DefaultDrawing then DC := Msg.DC else DC := GetDC(Frame.Handle);
SavedDC := SaveDC(DC);
try
FCommonData.Updating := FCommonData.Updating;
if not FCommonData.Updating then begin
FCommonData.BGChanged := FCommonData.BGChanged or FCommonData.HalfVisible; // v4.54
if SkinData.RepaintIfMoved and (Frame.Parent <> nil) then begin
FCommonData.HalfVisible := not (PtInRect(Frame.Parent.ClientRect, Point(Frame.Left + 1, Frame.Top + 1)));
FCommonData.HalfVisible := FCommonData.HalfVisible or not PtInRect(Frame.Parent.ClientRect, Point(Frame.Left + Frame.Width - 1, Frame.Top + Frame.Height - 1));
end
else FCommonData.HalfVisible := False;
Changed := FCommonData.BGChanged;
if Changed and not FCommonData.UrgentPainting then PrepareCache;
CopyWinControlCache(Frame, FCommonData, Rect(0, 0, 0, 0), Rect(0, 0, Frame.Width, Frame.Height), DC, True);
sVCLUtils.PaintControls(DC, Frame, Changed, Point(0, 0));
// if DefaultDrawing then v5.45
SetParentUpdated(Frame);
end;
finally
RestoreDC(DC, SavedDC);
if DefaultDrawing then ReleaseDC(Frame.Handle, DC);
EndPaint(Frame.Handle, PS);
end;
end;
procedure TsFrameAdapter.PrepareCache;
begin
SkinData.InitCacheBmp;
SkinData.FCacheBmp.Width := Frame.Width;
SkinData.FCacheBmp.Height := Frame.Height;
SkinData.FCacheBMP.Canvas.Font.Assign(Frame.Font);
SendMessage(Frame.Parent.Handle, SM_ALPHACMD, MakeWParam(0, AC_GETCACHE), 0);
PaintItem(SkinData, GlobalCacheInfo, False, 0, Rect(0, 0, Frame.Width, Frame.Height),
Point(Frame.Left, Frame.Top), SkinData.FCacheBMP, False);
SkinData.BGChanged := False;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -