📄 jvqoutlookbar.pas
字号:
InflateRect(Result, -2, -2);
end;
function TJvCustomOutlookBar.GetPageRect(Index: Integer): TRect;
begin
if (Index < 0) or (Index >= Pages.Count) then
Result := Rect(0, 0, 0, 0)
else
Result := Rect(0, PageButtonHeight * Index + PageButtonHeight, ClientWidth, ClientHeight - (Pages.Count - Index) *
PageButtonHeight + PageButtonHeight);
end;
function TJvCustomOutlookBar.GetButtonAtPos(P: TPoint): TJvOutlookBarButton;
var
I, H: Integer;
R, B: TRect;
begin
// this always returns the button in the visible part of the active page (if any)
Result := nil;
if (ActivePageIndex < 0) or (ActivePageIndex >= Pages.Count) then
Exit;
B := GetButtonRect(ActivePageIndex, 0);
H := GetButtonHeight(ActivePageIndex);
R := GetPageRect(ActivePageIndex);
for I := 0 to Pages[ActivePageIndex].Buttons.Count - 1 do
begin
if PtInRect(B, P) then
begin
Result := Pages[ActivePageIndex].Buttons[I];
Exit;
end;
OffsetRect(B, 0, H);
if B.Top >= R.Bottom then
Break;
end;
end;
function TJvCustomOutlookBar.GetButtonRect(PageIndex, ButtonIndex: Integer): TRect;
var
H: Integer;
begin
Result := Rect(0, 0, 0, 0);
if (PageIndex < 0) or (PageIndex >= Pages.Count) or
(ButtonIndex < 0) or (ButtonIndex >= Pages[PageIndex].Buttons.Count) then
Exit;
H := GetButtonHeight(PageIndex);
case Pages[PageIndex].ButtonSize of
olbsLarge:
if LargeImages <> nil then
begin
Result := Rect(0, 0, Max(LargeImages.Width, Canvas.TextWidth(Pages[PageIndex].Buttons[ButtonIndex].Caption)) +
4, H);
OffsetRect(Result, (ClientWidth - (Result.Right - Result.Left)) div 2, cButtonTopOffset);
end
else
Result := Rect(0, 0, ClientWidth, cButtonTopOffset + H);
olbsSmall:
if SmallImages <> nil then
begin
Result := Rect(0, 0, SmallImages.Width + Canvas.TextWidth(Pages[PageIndex].Buttons[ButtonIndex].Caption) + 8,
H);
OffsetRect(Result, cButtonLeftOffset, cButtonTopOffset);
end
else
Result := Rect(0, 0, ClientWidth, cButtonTopOffset + H);
end;
OffsetRect(Result, 0, (ButtonIndex - Pages[PageIndex].TopButtonIndex) * H + GetPageRect(PageIndex).Top);
end;
function TJvCustomOutlookBar.GetButtonFrameRect(PageIndex, ButtonIndex: Integer): TRect;
var
H: Integer;
begin
Result := Rect(0, 0, 0, 0);
if (PageIndex < 0) or (PageIndex >= Pages.Count) or
(ButtonIndex < 0) or (ButtonIndex >= Pages[PageIndex].Buttons.Count) then
Exit;
H := GetButtonHeight(PageIndex);
case Pages[PageIndex].ButtonSize of
olbsLarge:
if LargeImages <> nil then
begin
Result := Rect(0, 0, LargeImages.Width + 6, LargeImages.Height + 6);
OffsetRect(Result, (ClientWidth - (Result.Right - Result.Left)) div 2,
cButtonTopOffset + (ButtonIndex - Pages[PageIndex].TopButtonIndex) * H + GetPageRect(PageIndex).Top + 1);
end
else
begin
Result := Rect(0, 0, ClientWidth, H);
OffsetRect(Result, 0,
cButtonTopOffset + (ButtonIndex - Pages[PageIndex].TopButtonIndex) * H + GetPageRect(PageIndex).Top + 1);
end;
olbsSmall:
if SmallImages <> nil then
begin
Result := Rect(0, 0, SmallImages.Width + 4, SmallImages.Height + 4);
OffsetRect(Result, cButtonLeftOffset, cButtonTopOffset + (ButtonIndex - Pages[PageIndex].TopButtonIndex) * H +
GetPageRect(PageIndex).Top);
end
else
begin
Result := Rect(0, 0, ClientWidth, H);
OffsetRect(Result, 0, cButtonTopOffset + (ButtonIndex - Pages[PageIndex].TopButtonIndex) * H +
GetPageRect(PageIndex).Top);
end;
end;
end;
function TJvCustomOutlookBar.GetButtonTextRect(PageIndex,
ButtonIndex: Integer): TRect;
var
H: Integer;
begin
Result := Rect(0, 0, 0, 0);
if Pages[PageIndex].Buttons.Count <= ButtonIndex then
Exit;
Result := GetButtonRect(PageIndex, ButtonIndex);
H := GetButtonHeight(PageIndex);
case Pages[PageIndex].ButtonSize of
olbsLarge:
if LargeImages <> nil then
begin
Result.Top := Result.Bottom - Abs(Pages[PageIndex].Font.Height) - 2;
OffsetRect(Result, 0, -4);
end;
olbsSmall:
if SmallImages <> nil then
begin
Result.Left := SmallImages.Width + 10;
Result.Top := Result.Top + (GetButtonHeight(PageIndex) - Abs(Pages[PageIndex].Font.Height)) div 2;
Result.Bottom := Result.Top + Abs(Pages[PageIndex].Font.Height) + 2;
Result.Right := Result.Left + Canvas.TextWidth(Pages[PageIndex].Buttons[ButtonIndex].Caption) + 4;
OffsetRect(Result, 0, -(H - (Result.Bottom - Result.Top)) div 4);
end;
end;
end;
procedure TJvCustomOutlookBar.Paint;
var
I: Integer;
R2: TRect;
begin
if csDestroying in ComponentState then
Exit;
Canvas.Font := Self.Font;
Canvas.Brush.Color := Self.Color;
if Pages.Count = 0 then // we only need to draw the background when there are no pages
begin
begin
if DoDrawBackGround then
Canvas.FillRect(ClientRect);
end;
end;
SetBkMode(Canvas.Handle, TRANSPARENT);
Canvas.Brush.Style := bsSolid;
I := DrawTopPages;
DrawBottomPages(I + 1);
if I >= 0 then
begin
R2 := GetPageRect(I);
Canvas.SetClipRect(R2);
DrawCurrentPage(I);
Canvas.ResetClipRegion;
end;
end;
function TJvCustomOutlookBar.DoPageChanging(Index: Integer): Boolean;
begin
Result := True;
if (Index > -1) and Assigned(FOnPageChanging) then
FOnPageChanging(Self, Index, Result);
end;
procedure TJvCustomOutlookBar.DoPageChange(Index: Integer);
begin
if (Index > -1) and Assigned(FOnPageChange) then
FOnPageChange(Self, Index);
end;
procedure TJvCustomOutlookBar.DoButtonClick(Index: Integer);
begin
if (Index > -1) then
begin
with ActivePage.Buttons[Index] do
begin
if AutoToggle then
Down := not Down;
Click;
end;
if Assigned(FOnButtonClick) then
FOnButtonClick(Self, Index);
end;
end;
procedure TJvCustomOutlookBar.SetActivePageIndex(const Value: Integer);
begin
if (Value >= 0) and (Value < FPages.Count) then
begin
FPressedPageBtn := -1; // reset cache
// remove old button info
FLastButtonIndex := -1;
FPressedButtonIndex := -1;
FButtonRect := Rect(0, 0, 0, 0);
if FActivePageIndex <> Value then
begin
if not DoPageChanging(Value) then
Exit;
FActivePageIndex := Value;
DoPageChange(Value);
end;
Invalidate;
end;
end;
procedure TJvCustomOutlookBar.SetBorderStyle(const Value: TBorderStyle);
begin
if FBorderStyle <> Value then
begin
FBorderStyle := Value;
Invalidate;
end;
end;
procedure TJvCustomOutlookBar.SetButtonSize(const Value: TJvBarButtonSize);
var
I: Integer;
begin
FButtonSize := Value;
Pages.BeginUpdate;
try
for I := 0 to Pages.Count - 1 do
if Pages[I].ParentButtonSize then
begin
Pages[I].ParentButtonSize := False;
Pages[I].ParentButtonSize := True; // reset flag
end;
finally
Pages.EndUpdate; // calls invalidate
end;
end;
procedure TJvCustomOutlookBar.SetLargeImages(const Value: TCustomImageList);
begin
if FLargeImages <> Value then
begin
if Assigned(FLargeImages) then
FLargeImages.UnRegisterChanges(FLargeChangeLink);
FLargeImages := Value;
if Assigned(FLargeImages) then
FLargeImages.RegisterChanges(FLargeChangeLink);
Invalidate;
end;
end;
procedure TJvCustomOutlookBar.SetPageButtonHeight(const Value: Integer);
begin
if FPageButtonHeight <> Value then
begin
FPageButtonHeight := Value;
Invalidate;
end;
end;
procedure TJvCustomOutlookBar.SetPages(const Value: TJvOutlookBarPages);
begin
FPages.Assign(Value); // Assign calls Invalidate
end;
procedure TJvCustomOutlookBar.SetSmallImages(const Value: TCustomImageList);
begin
if FSmallImages <> Value then
begin
if Assigned(FSmallImages) then
FSmallImages.UnRegisterChanges(FSmallChangeLink);
FSmallImages := Value;
if Assigned(FSmallImages) then
FSmallImages.RegisterChanges(FSmallChangeLink);
Invalidate;
end;
end;
procedure TJvCustomOutlookBar.DrawButtonFrame(PageIndex, ButtonIndex, PressedIndex: Integer);
var
R: TRect;
begin
if csDestroying in ComponentState then
Exit;
if (ButtonIndex < 0) or (PageIndex < 0) or (PageIndex >= Pages.Count) or
(ButtonIndex < Pages[PageIndex].TopButtonIndex) then
Exit;
R := GetButtonFrameRect(PageIndex, ButtonIndex);
if DoDrawButtonFrame(R, ButtonIndex, (PressedIndex = ButtonIndex) or Pages[PageIndex].Buttons[ButtonIndex].Down, True) then
begin
begin
if (PressedIndex = ButtonIndex) or (Pages[PageIndex].Buttons[ButtonIndex].Down) then
Frame3D(Canvas, R, clBlack, clWhite, 1)
else
Frame3D(Canvas, R, clWhite, clBlack, 1);
end;
end;
end;
procedure TJvCustomOutlookBar.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
P: TJvOutlookBarPage;
B: TJvOutlookBarButton;
begin
inherited MouseDown(Button, Shift, X, Y);
if Button = mbRight then
Exit;
P := GetPageButtonAtPos(Point(X, Y));
if (P <> nil) and (P.Enabled) and (P.Index <> FNextActivePage) then
begin
FNextActivePage := P.Index;
if FNextActivePage <> ActivePageIndex then
begin // draw button pressed
FPressedPageBtn := FNextActivePage;
RedrawRect(GetPageButtonRect(FNextActivePage));
end;
Exit;
end
else
begin
if (FNextActivePage > -1) and Pages[FNextActivePage].Enabled then
RedrawRect(GetPageButtonRect(FNextActivePage));
FNextActivePage := -1;
FPressedPageBtn := -1;
end;
B := GetButtonAtPos(Point(X, Y));
if (B <> nil) and B.Enabled and (Pages[ActivePageIndex].Enabled) then
begin
FLastButtonIndex := B.Index;
FPressedButtonIndex := B.Index;
FButtonRect := GetButtonFrameRect(ActivePageIndex, B.Index);
RedrawRect(FButtonRect);
end;
end;
procedure TJvCustomOutlookBar.MouseMove(Shift: TShiftState; X, Y: Integer);
var
P: TJvOutlookBarPage;
B: TJvOutlookBarButton;
R: TRect;
begin
inherited MouseMove(Shift, X, Y);
{ TODO -oJv :
1. check whether the mouse is down on a page button and whether the mouse has moved from
the currently pressed page button }
P := GetPageButtonAtPos(Point(X, Y));
if FPressedPageBtn > -1 then
begin
if (P = nil) or (P.Index <> FPressedPageBtn) then
begin
R := GetPageButtonRect(FPressedPageBtn);
RedrawRect(R);
FPressedPageBtn := -1;
end;
end
else
if (P <> nil) and (P.Index <> ActivePageIndex) and P.Enabled then
begin
if P.Index = FNextActivePage then
begin
FPressedPageBtn := FNextActivePage;
RedrawRect(GetPageButtonRect(FPressedPageBtn));
Exit;
end;
end;
// TODO: check for button highlight
B := GetButtonAtPos(Point(X, Y));
if (B <> nil) and B.Enabled and (Pages[ActivePageIndex].Enabled) then
begin
if B.Index <> FLastButtonIndex then
begin
RedrawRect(FButtonRect, True);
FButtonRect := GetButtonFrameRect(ActivePageIndex, B.Index);
RedrawRect(FButtonRect);
FLastButtonIndex := B.Index;
end;
end
else
begin
if FLastButtonIndex > -1 then
RedrawRect(FButtonRect);
FLastButtonIndex := -1;
FButtonRect := Rect(0, 0, 0, 0);
end;
end;
procedure TJvCustomOutlookBar.MouseUp(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
P: TJvOutlookBarPage;
B: TJvOutlookBarButton;
begin
inherited MouseUp(Button, Shift, X, Y);
if Button = mbRight then
Exit;
if (FNextActivePage > -1) and (FNextActivePage <> ActivePageIndex) then
begin
P := GetPageButtonAtPos(Point(X, Y));
if (P <> nil) and (P.Index = FNextActivePage) then
ActivePageIndex := FNextActivePage;
end;
FNextActivePage := -1;
B := GetButtonAtPos(Point(X, Y));
if B <> nil then
begin
if B.Index = FPressedButtonIndex then
DoButtonClick(FPressedButtonIndex);
FLastButtonIndex := B.Index;
FPressedButtonIndex := -1;
FButtonRect := GetButtonFrameRect(ActivePageIndex, FLastButtonIndex);
RedrawRect(FButtonRect);
end
else
begin
FButtonRect := GetButtonFrameRect(ActiveP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -