📄 accoolbar.pas
字号:
if Adjust then Inc(Result, 2);
if Images <> nil then begin
Adjust := True;
if Vertical then Inc(Result, Images.Height) else Inc(Result, Images.Width)
end
else if not Adjust then Inc(Result, ControlMargin);
end;
if Adjust then Inc(Result, ControlMargin);
inc(Result, GetGripSize(Band));
end;
end;
{
function TsCoolBar.ImageRect(Band: TCoolBand): TRect;
begin
Result.Left := Band.Control.Left;
Result.Top := Band.Control.Top;
if Vertical then begin
dec(Result.Top, GetCaptionSize(Band) - GetGripSize(Band));
inc(Result.Left, (Band.Width - Images.Width) div 2);
end
else begin
dec(Result.Left, GetCaptionSize(Band) - GetGripSize(Band));
inc(Result.Top, (Band.Height - Images.Height) div 2);
end;
Result.Right := Result.Left;
Result.Bottom := Result.Top;
if Assigned(Images) and (Band.ImageIndex > -1) then begin
inc(Result.Right, Images.Width);
inc(Result.Bottom, Images.Height);
end;
end;
}
procedure TsCoolBar.Loaded;
begin
inherited;
FCommonData.Loaded;
UpdateGripIndex;
end;
procedure TsCoolBar.PrepareCache;
var
CI : TCacheInfo;
begin
FCommonData.InitCacheBmp;
CI := GetParentCache(FCommonData);
PaintItem(FCommonData, CI, False, 0, Rect(0, 0, width, Height), Point(Left, Top), FCommonData.FCacheBMP, False);
FCommonData.BGChanged := False;
end;
procedure TsCoolBar.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
if not FCommonData.Skinned then inherited else begin
Message.Result := 1;
end;
end;
procedure TsCoolBar.WMNCPaint(var Message: TWMNCPaint);
var
DC, SavedDC: HDC;
RC, RW: TRect;
w, h : integer;
begin
if FCommonData.Skinned then begin
if (csDestroying in ComponentState) or FCommonData.Updating then Exit;
DC := GetWindowDC(Handle);
SavedDC := SaveDC(DC);
try
RC := ACClientRect(Handle);
ExcludeClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom);
{ Draw borders in non-client area }
w := WidthOf(Rc);
h := HeightOf(Rc);
if FCommonData.BGChanged then PrepareCache;
// Top
BitBlt(DC, 0, 0, Width, Rc.Top, SkinData.FCacheBmp.Canvas.Handle, 0, 0, SRCCOPY);
// Left
BitBlt(DC, 0, Rc.Top, Rc.Left, h, SkinData.FCacheBmp.Canvas.Handle, 0, Rc.Top, SRCCOPY);
// Bottom
BitBlt(DC, 0, Rc.Bottom, Width, Height - h - Rc.Top, SkinData.FCacheBmp.Canvas.Handle, 0, Rc.Bottom, SRCCOPY);
// Right
BitBlt(DC, Rc.Right, Rc.Top, Width - Rc.Left - w, h, SkinData.FCacheBmp.Canvas.Handle, Rc.Right, Rc.Top, SRCCOPY);
IntersectClipRect(DC, RW.Left, RW.Top, RW.Right, RW.Bottom);
finally
RestoreDC(DC, SavedDC);
ReleaseDC(Handle, DC);
end;
end
else inherited;
end;
procedure TsCoolBar.WMPaint(var Message: TWMPaint);
var
PS : TPaintStruct;
DC, SavedDC : hdc;
cR : TRect;
begin
if not FCommonData.Skinned then inherited else begin
BeginPaint(Handle, PS);
SavedDC := 0;
if Message.DC = 0 then begin
DC := GetDC(Handle);
SavedDC := SaveDC(DC);
end
else DC := Message.DC;
try
cR := Rect(1, 1, 1, 1);
GetClipBox(DC, cR);
ACPaint(DC);
finally
if Message.DC = 0 then begin
RestoreDC(DC, SavedDC);
ReleaseDC(Handle, DC);
end;
EndPaint(Handle, PS);
end;
end;
end;
procedure TsCoolBar.WndProc(var Message: TMessage);
var
rc : TRect;
i, w, h : integer;
SavedDC : hdc;
begin
{$IFDEF LOGGED}
AddToLog(Message);
{$ENDIF}
if Message.Msg = SM_ALPHACMD
then case Message.WParamHi of
AC_CTRLHANDLED : begin Message.LParam := 1; Exit end; // AlphaSkins supported
AC_GETAPPLICATION : begin Message.Result := longint(Application); Exit end;
AC_REMOVESKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
CommonWndProc(Message, FCommonData);
UpdateGripIndex;
if HandleAllocated then RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ERASE or RDW_FRAME);
AlphaBroadCast(Self, Message);
exit
end;
AC_SETNEWSKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
AlphaBroadCast(Self, Message);
CommonWndProc(Message, FCommonData);
UpdateGripIndex;
exit
end;
AC_REFRESH : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
CommonWndProc(Message, FCommonData);
AlphaBroadCast(Self, Message);
Repaint;
SendMessage(Handle, WM_NCPAINT, 0, 0);
exit
end;
AC_GETCACHE : begin
GlobalCacheInfo.X := ACClientRect(Handle).Left;
GlobalCacheInfo.Y := ACClientRect(Handle).Top;
if SkinData.Skinned then GlobalCacheInfo.Bmp := FCommonData.FCacheBmp else GlobalCacheInfo.Bmp := nil;
GlobalCacheInfo.Ready := GlobalCacheInfo.Bmp <> nil;
Exit;
end;
end;
if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
AC_ENDPARENTUPDATE : if FCommonData.Updating then {????} begin
FCommonData.Updating := False;
Repaint;
SendMessage(Handle, WM_NCPAINT, 0, 0);
end;
AC_PREPARING : begin
Message.LParam := integer(FCommonData.BGChanged or FCommonData.Updating);
end;
AC_URGENTPAINT : begin // v4.08
CommonWndProc(Message, FCommonData);
if FCommonData.UrgentPainting then begin
FCommonData.InitCacheBmp;
PaintItem(FCommonData, GetParentCache(FCommonData), False, 0, Rect(0, 0, width, Height), Point(Left, Top), FCommonData.FCacheBMP, False);
FCommonData.BGChanged := False;
end;
end
else CommonMessage(Message, FCommonData);
end
else begin
case Message.Msg of
CM_VISIBLECHANGED : begin
FCommonData.BGChanged := True;
if not FCommonData.Updating then Repaint;
inherited;
Exit;
end;
WM_KILLFOCUS, WM_SETFOCUS: begin inherited; exit end; // v4.12
WM_PRINT : begin
FCommonData.Updating := False;
try
RC := ACClientRect(Handle);
w := WidthOf(Rc);
h := HeightOf(Rc);
if FCommonData.BGChanged then PrepareCache;
// Top
BitBlt(TWMPaint(Message).DC, 0, 0, Width, Rc.Top, SkinData.FCacheBmp.Canvas.Handle, 0, 0, SRCCOPY);
// Left
BitBlt(TWMPaint(Message).DC, 0, Rc.Top, Rc.Left, h, SkinData.FCacheBmp.Canvas.Handle, 0, Rc.Top, SRCCOPY);
// Bottom
BitBlt(TWMPaint(Message).DC, 0, Rc.Bottom, Width, Height - h - Rc.Top, SkinData.FCacheBmp.Canvas.Handle, 0, Rc.Bottom, SRCCOPY);
// Right
BitBlt(TWMPaint(Message).DC, Rc.Right, Rc.Top, Width - Rc.Left - w, h, SkinData.FCacheBmp.Canvas.Handle, Rc.Right, Rc.Top, SRCCOPY);
MoveWindowOrg(TWMPaint(Message).DC, Rc.Left, Rc.Top);
IntersectClipRect(TWMPaint(Message).DC, 0, 0, w, h);
ACPaint(TWMPaint(Message).DC);
for i := 0 to Bands.Count - 1 do if Bands[i].Control <> nil then begin
SavedDC := SaveDC(TWMPaint(Message).DC);
MoveWindowOrg(TWMPaint(Message).DC, Bands[i].Control.Left, Bands[i].Control.Top);
IntersectClipRect(TWMPaint(Message).DC, 0, 0, Bands[i].Control.Width, Bands[i].Control.Height);
Bands[i].Control.Perform(WM_PAINT, Message.WParam, Message.LParam);
RestoreDC(TWMPaint(Message).DC, SavedDC);
end;
finally
end;
Exit;
end;
end;
CommonWndProc(Message, FCommonData);
inherited;
if FCommonData.Skinned then begin
case Message.Msg of
WM_SIZE : begin
FCOmmonData.BGChanged := True;
Perform(WM_NCPAINT, 0, 0);
end;
end;
end
end;
end;
function TsCoolBar.GetGripSize(Band: TCoolBand) : integer;
begin
Result := 0;
if (not FixedOrder or (Band.ID and IDMask > 0)) and not Band.FixedSize then begin
Inc(Result, ControlMargin);
if GetComCtlVersion < ComCtlVersionIE4 then Inc(Result, GripSizeIE3) else Inc(Result, GripSizeIE4);
end;
end;
procedure TsCoolBar.UpdateGripIndex;
begin
if FCommonData.Skinned then begin
if Vertical then FGripsection := s_GripV else FGripsection := s_GripH;
FGripIndex := SkinData.SkinManager.GetSkinIndex(FGripsection);
if FGripIndex <> -1 then begin
FGripMask := SkinData.SkinManager.GetMaskIndex(FGripsection, s_BordersMask);
FGripTexture := SkinData.SkinManager.GetTextureIndex(FGripIndex, FGripsection, s_Pattern);
// if (SkinData.SkinManager.gd[FGripIndex].ImagePercent = 0) and SkinData.SkinManager.IsValidImgIndex(FGripTexture) and (SkinData.SkinManager.ma[FGripTexture].DrawMode in [ord(ord(fmDisTiled))])
// then SkinData.SkinManager.gd[FGripIndex].ImagePercent := -1;
end
else begin
FGripsection := s_ProgressV;//s_Button;
FGripIndex := SkinData.SkinManager.GetSkinIndex(FGripsection);
FGripMask := SkinData.SkinManager.GetMaskIndex(FGripsection, s_BordersMask);
end;
end
else begin
FGripIndex := -1;
FGripMask := -1;
FGripTexture := -1;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -