📄 stoolbar.pas
字号:
bWidth := WidthOf(iR);
bHeight := HeightOf(iR);
BtnBmp := CreateBmp24(bWidth, bHeight);
BtnBmp.Canvas.Font.Assign(Font);
if not Button.Marked and not Button.Indeterminate and ((State = []) or (State = [cdsDisabled]))
then Mode := 0
else if (cdsSelected in State) or (cdsChecked in State) or Button.Marked or Button.Indeterminate
then Mode := 2
else Mode := 1;
SkinIndex := FCommonData.SkinManager.GetSkinIndex(s_TOOLBUTTON);
ci := MakeCacheInfo(FCommonData.FCacheBmp,
BorderWidth * 2 + integer(ebLeft in EdgeBorders) * (integer(EdgeInner <> esNone) + integer(EdgeOuter <> esNone)),
BorderWidth * 2 + integer(ebTop in EdgeBorders) * (integer(EdgeInner <> esNone) + integer(EdgeOuter <> esNone)));
R := Rect(0, 0, bWidth, Button.Height);
OffsetRect(R, ClientRect.Left, ClientRect.Top);
PaintItemBg(SkinIndex, s_ToolButton, ci, Mode, R, Point(Button.Left, Button.Top), BtnBmp, FCommonData.SkinManager);
R.Right := bWidth - AddedWidth;
ci.X := ci.X + Button.Left;
ci.Y := ci.Y + Button.Top;
BorderIndex := FCommonData.SkinManager.GetMaskIndex(SkinIndex, s_ToolButton, s_BordersMask);
if BorderIndex > -1 then DrawSkinRect(BtnBmp, R, True, ci, FCommonData.SkinManager.ma[BorderIndex], Mode, True);
DrawBtnCaption;
DrawBtnGlyph;
if Button.Style = tbsDropDown then DrawArrow;
if not Button.Enabled or Button.Indeterminate then BmpDisabledKind(BtnBmp, FDisabledKind, Parent, CI, Point(0, 0));
BitBlt(Canvas.Handle, Button.Left, Button.Top, bWidth, bHeight, BtnBmp.Canvas.Handle, 0, 0, SRCCOPY);
FreeAndNil(BtnBmp);
end
end
else begin
DefaultDraw := True;
inherited;
end;
end;
procedure TsToolBar.PrepareCache;
begin
FCommonData.InitCacheBmp;
PaintItem(FCommonData, GetParentCache(FCommonData), False, 0,
Rect(0, 0, WIdth, Height), Point(Left, Top), FCommonData.FCacheBmp, False);
FCommonData.BGChanged := False;
end;
procedure TsToolBar.RepaintButton(Index : integer);
var
Flags : TTBCustomDrawFlags;
Def : boolean;
DC, SavedDC: HDC;
RC, RW: TRect;
begin
if (Index > -1) and Buttons[Index].Visible then begin
Flags := [tbNoEtchedEffect, tbNoEdges];
Def := False;
DC := GetWindowDC(Handle);
SavedDC := SaveDC(DC);
try
Windows.GetClientRect(Handle, RC);
GetWindowRect(Handle, RW);
MapWindowPoints(0, Handle, RW, 2);
OffsetRect(RC, -RW.Left, -RW.Top);
MoveWindowOrg(DC, -RW.Left, -RW.Top);
Canvas.Handle := DC;
OurAdvancedCustomDrawButton(Self, Buttons[Index], [], cdPrePaint, Flags, Def)
finally
Canvas.Handle := 0;
RestoreDC(DC, SavedDC);
ReleaseDC(Handle, DC);
end;
end;
end;
procedure TsToolBar.SetDisabledKind(const Value: TsDisabledKind);
begin
if FDisabledKind <> Value then begin
FDisabledKind := Value;
Repaint;
end;
end;
procedure TsToolBar.UpdateDividers;
var
i : integer;
begin
for i := 0 to ButtonCount - 1 do begin
if Buttons[i].Style = tbsDivider then begin
//v4
end;
end;
end;
procedure TsToolBar.UpdateEvents;
begin
if SkinData.Skinned then begin
inherited OnAdvancedCustomDraw := OurAdvancedCustomDraw;
if not (csDesigning in ComponentState) then inherited OnAdvancedCustomDrawButton := OurAdvancedCustomDrawButton;
end
else begin
inherited OnAdvancedCustomDraw := nil;
if not (csDesigning in ComponentState) then inherited OnAdvancedCustomDrawButton := nil;
end;
end;
procedure TsToolBar.WMNCPaint(var Message: TWMNCPaint);
var
DC, SavedDC: HDC;
RC, RW: TRect;
w, h : integer;
begin
if FCommonData.Skinned then begin
FCommonData.Updating := FCommonData.Updating;
if (csDestroying in ComponentState) or FCommonData.Updating then Exit;
DC := GetWindowDC(Handle);
SavedDC := SaveDC(DC);
try
Windows.GetClientRect(Handle, RC);
GetWindowRect(Handle, RW);
MapWindowPoints(0, Handle, RW, 2);
OffsetRect(RC, -RW.Left, -RW.Top);
ExcludeClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom);
{ Draw borders in non-client area }
w := WidthOf(Rc);
h := HeightOf(Rc);
// 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);
// if Message.DC = 0 then
ReleaseDC(Handle, DC);
end;
end
else inherited;
end;
procedure TsToolBar.WndProc(var Message: TMessage);
var
i, OldIndex, w, h : integer;
rc : TRect;
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_SETNEWSKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
if not (csDesigning in ComponentState) and (@Ac_SetWindowTheme <> nil) then Ac_SetWindowTheme(Handle, ' ', ' ');
AlphaBroadCast(Self, Message);
CommonWndProc(Message, FCommonData);
exit
end;
AC_ENDPARENTUPDATE : {if FCommonData.Updating then v5.42}begin
FCommonData.Updating := False;
FCommonData.BGChanged := True;
RedrawWindow(Handle, nil, 0, RDW_UPDATENOW or RDW_ERASE or RDW_INVALIDATE or RDW_INTERNALPAINT or RDW_ERASENOW);
Exit
end;
AC_REFRESH : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
DroppedButton := nil;
CommonWndProc(Message, FCommonData);
AlphaBroadcast(Self, Message);
UpdateEvents;
Repaint;
SendMessage(Handle, WM_NCPAINT, 0, 0);
exit
end;
AC_REMOVESKIN : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) then begin
DroppedButton := nil;
CommonWndProc(Message, FCommonData);
if not (csDesigning in ComponentState) and (@Ac_SetWindowTheme <> nil) then Ac_SetWindowTheme(Handle, nil, nil);
AlphaBroadcast(Self, Message);
UpdateEvents;
Repaint;
SendMessage(Handle, WM_NCPAINT, 0, 0);
exit
end
end;
if not ControlIsReady(Self) or not FCommonData.Skinned then inherited else begin
if Message.Msg = SM_ALPHACMD then case Message.WParamHi of
AC_GETCACHE : begin
GlobalCacheInfo.Ready := False;
if not Assigned(FCommonData.FCacheBmp) then Exit;
GlobalCacheInfo.X := BorderWidth * 2 + integer(ebLeft in EdgeBorders) * (integer(EdgeInner <> esNone) + integer(EdgeOuter <> esNone));
GlobalCacheInfo.Y := BorderWidth * 2 + integer(ebTop in EdgeBorders) * (integer(EdgeInner <> esNone) + integer(EdgeOuter <> esNone));
GlobalCacheInfo.Bmp := FCommonData.FCacheBmp;
GlobalCacheInfo.Ready := True;
Exit;
end;
end
else case Message.Msg of
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);
SendMessage(Handle, WM_PAINT, Message.WParam, 0);
finally
end;
Exit;
end;
WM_ERASEBKGND : Exit;
WM_SIZE : SkinData.BGChanged := True;
CM_TEXTCHANGED : begin Repaint; Exit end;
CN_NOTIFY : with TWMNotify(Message) do case NMHdr^.code of
TBN_DROPDOWN: with PNMToolBar(NMHdr)^ do if Perform(TB_GETBUTTON, iItem, Longint(@tbButton)) <> 0 then begin
DroppedButton := TToolButton(tbButton.dwData);
DroppedButton.Repaint
end;
TBN_DELETINGBUTTON : if HotButtonIndex >= ButtonCount then HotButtonIndex := -1;
end;
end;
CommonWndProc(Message, FCommonData);
try
inherited;
except
end;
case Message.Msg of
CN_DROPDOWNCLOSED : begin
if DroppedButton <> nil then begin
HotButtonIndex := -1;
i := DroppedButton.Index;
DroppedButton := nil;
RepaintButton(i);
end;
end;
CM_MOUSELEAVE : if not Flat and not (csDesigning in ComponentState) then begin
OldIndex := HotButtonIndex;
HotButtonIndex := -1;
if (OldIndex > -1) and not Buttons[OldIndex].Down then RepaintButton(OldIndex);
HotButtonIndex := -1;
end;
WM_MOUSEMOVE : if not Flat and not (csDesigning in ComponentState) then with TWMMouse(Message) do begin
i := IndexByMouse(Point(TWMMouse(Message).XPos, TWMMouse(Message).YPos));
if (i <> HotButtonIndex) then begin
if (i > -1) and not Buttons[i].Enabled then Exit; // v4.50
OldIndex := HotButtonIndex;
HotButtonIndex := i;
if (OldIndex > -1) and not Buttons[OldIndex].Down then RepaintButton(OldIndex);
if (HotButtonIndex > -1) and not Buttons[HotButtonIndex].Down then RepaintButton(HotButtonIndex);
end;
end;
WM_SIZE, CM_VISIBLECHANGED, CM_ENABLEDCHANGED : begin
FCommonData.BGChanged := True;
InvalidateRect(Handle, nil, False);
Exit;
end;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -