tvplanit: Fix painting of non-themed standard NavBar buttons

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4992 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-07-18 11:46:13 +00:00
parent 6ccfd77f7c
commit 5e355bbc9a
5 changed files with 93 additions and 12 deletions

View File

@ -8,7 +8,6 @@
<MainUnit Value="0"/>
<Title Value="project1"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<Icon Value="0"/>
</General>
<VersionInfo>

View File

@ -17,7 +17,7 @@ object Form1: TForm1
AllowRearrange = True
BackgroundColor = clInactiveCaption
BackgroundMethod = bmTile
BorderStyle = bsNone
BorderStyle = bsSingle
ButtonHeight = 20
DrawingStyle = dsEtchedButton
FolderCollection = <
@ -256,7 +256,7 @@ object Form1: TForm1
TabOrder = 6
object BkColor: TColorBox
Left = 88
Height = 24
Height = 22
Top = 3
Width = 272
Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbCustomColors]
@ -348,6 +348,30 @@ object Form1: TForm1
TabOrder = 5
end
end
object RgBorderStyle: TRadioGroup
Left = 141
Height = 66
Top = 288
Width = 139
AutoFill = True
Caption = 'Border style'
ChildSizing.LeftRightSpacing = 6
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 1
ClientHeight = 46
ClientWidth = 135
ItemIndex = 1
Items.Strings = (
'bsNone'
'bsSingle'
)
OnClick = RgBorderStyleClick
TabOrder = 7
end
object Images: TImageList
Height = 32
Width = 32

View File

@ -23,6 +23,7 @@ type
IconsLbl: TLabel;
IconsLink: TLabel;
Panel2: TPanel;
RgBorderStyle: TRadioGroup;
RbBkColor: TRadioButton;
RbBkImage: TRadioButton;
RbBkImageTile: TRadioButton;
@ -42,6 +43,7 @@ type
procedure IconsLinkClick(Sender: TObject);
procedure IconsLinkMouseEnter(Sender: TObject);
procedure IconsLinkMouseLeave(Sender: TObject);
procedure RgBorderStyleClick(Sender: TObject);
procedure RgDrawingStyleClick(Sender: TObject);
procedure RgIconSizeClick(Sender: TObject);
procedure RbBkColorChange(Sender: TObject);
@ -153,6 +155,7 @@ begin
RandSeed := 1;
IconsLink.Left := IconsLbl.Left + IconsLbl.Width;
RgDrawingStyle.ItemIndex := ord(VpNavBar1.DrawingStyle);
RgBorderStyle.ItemIndex := ord(VpNavBar1.BorderStyle);
BkColor.Selected := VpNavBar1.BackgroundColor;
case VpNavBar1.BackgroundMethod of
bmNone:
@ -225,6 +228,11 @@ begin
VpNavBar1.Invalidate;
end;
procedure TForm1.RgBorderStyleClick(Sender: TObject);
begin
VpNavBar1.BorderStyle := TBorderStyle(RgBorderStyle.ItemIndex);
end;
procedure TForm1.VpNavBar1FolderChanged(Sender: TObject; Index: Integer);
var
folder: TVpNavFolder;

View File

@ -2805,11 +2805,12 @@ procedure TVpCustomNavBar.SetDrawingStyle(Value: TVpFolderDrawingStyle);
begin
if Value <> FDrawingStyle then begin
FDrawingStyle := Value;
{
if FDrawingStyle = dsEtchedButton then
BorderStyle := bsNone
else
BorderStyle := bsSingle;
}
{Minimum ButtonHeight for CoolTabs is 17}
if (FDrawingStyle = dsCoolTab) and (FButtonHeight < 17) then
FButtonHeight := 17;

View File

@ -143,13 +143,14 @@ begin
if folder.ItemCount = 0 then
exit;
// Distance of top-most icon to the last upper button
Inc(CurPos, 8);
with nabItemsRect^ do begin
Top := CurPos;
Left := 0;
Right := FNavBar.ClientWidth;
Bottom := FNavBar.ClientHeight - (FNavBar.FolderCount - FActiveFolder - 1) * FButtonHeight + 1;
Bottom := FNavBar.ClientHeight - (FNavBar.FolderCount - FActiveFolder - 1) * FButtonHeight;
end;
for J := 0 to folder.ItemCount-1 do begin
@ -213,9 +214,8 @@ var
begin
if FBackgroundImage.Empty or (FBackgroundMethod = bmNone) then
begin
Canvas.Pen.Color := FBackgroundColor;
Canvas.Brush.Color := FBackgroundColor;
Canvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom);
Canvas.FillRect(R.Left, R.Top, R.Right, R.Bottom);
end else
begin
case FBackgroundMethod of
@ -224,7 +224,7 @@ begin
if (FBackgroundImage.Width < WidthOf(R)) or (FBackgroundImage.Height < HeightOf(R))
then begin
Canvas.Brush.Color := FBackgroundColor;
Canvas.FillRect(R.Left, R.Top, R.Right, R.Bottom);
Canvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom);
end;
Canvas.Draw(R.Left, R.Top, FBackgroundImage);
end;
@ -285,6 +285,7 @@ var
Points: array[1..5] of TPoint;
begin
Result := R;
with Canvas do begin
{Fill the tab area}
Brush.Style := bsSolid;
@ -294,6 +295,9 @@ begin
Brush.Color := ATabColor;
FillRect(R);
if IsMouseOverFolder(ATabIndex) then
; // do what?
{Draw the bottom, left line}
Pen.Color := clBlack;
MoveTo(R.Left, R.Bottom - 1);
@ -392,6 +396,7 @@ begin
Result := R;
if ThemeServices.ThemesEnabled then begin
// themed button
if IsMouseOverFolder(ATabIndex) and nabMouseDown then
tb := tbPushButtonPressed
else
@ -402,9 +407,47 @@ begin
details := ThemeServices.GetElementDetails(tb);
InflateRect(R, 1, 1);
ThemeServices.DrawElement(Canvas.Handle, details, R);
end else
begin
// non-themed button
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(R);
if nabMouseDown and IsMouseOverFolder(ATabIndex) then
begin
if R.Top = 0 then R.Top := 1;
Canvas.Pen.Color := clBtnHighlight; // bright at bottom/right
Canvas.MoveTo(R.Left, R.Bottom-1);
Canvas.LineTo(R.Right-1, R.Bottom-1);
Canvas.LineTo(R.Right-1, R.Top-1);
Canvas.Pen.Color := clGray; // dark at top/left
Canvas.MoveTo(R.Left, R.Bottom-2);
Canvas.LineTo(R.Left, R.Top);
Canvas.LineTo(R.Right-1, R.Top);
Canvas.Pen.Color := clBtnShadow; // shadow at top/left
Canvas.MoveTo(R.Left+1, R.Bottom-2);
Canvas.LineTo(R.Left+1, R.Top);
Canvas.LineTo(R.Right-2, R.Top);
end else
begin
Canvas.Pen.Color := clGray; // bottom/right
Canvas.MoveTo(R.Left, R.Bottom-1);
Canvas.LineTo(R.Right-1, R.Bottom-1);
Canvas.LineTo(R.Right-1, R.Top-1);
Canvas.Pen.Color := clBtnHighlight; // top/left
Canvas.MoveTo(R.Left, R.Bottom-2);
Canvas.LineTo(R.Left, R.Top);
Canvas.LineTo(R.Right-1, R.Top);
Canvas.Pen.Color := clBtnShadow; // bottom/right shadow
Canvas.MoveTo(R.Left+1, R.Bottom-2);
Canvas.LineTo(R.Right-2, R.Bottom-2);
Canvas.LineTo(R.Right-2, R.Top);
end;
end;
//TODO: TR := DrawButtonFace(DrawBmp.Canvas, MyRect, 1, bsNew, False,
// (I = FHotFolder) and nabMouseDown, False);
end;
{ Draw regular etched (Win98 style) buttons
@ -415,10 +458,16 @@ begin
with Canvas do begin
Brush.Color := clBtnFace;
FillRect(R);
Frame3D(R, 1, bvLowered);
if not IsMouseOverFolder(aTabIndex) then
Frame3D(R, 1, bvRaised);
{
// InflateRect(R, -1, -1);
if IsMouseOverFolder(ATabIndex) then
Frame3D(R, 1, bvLowered) else
Frame3D(r, 1, bvRaised);
}
end;
Result := R;
end;
@ -842,11 +891,11 @@ begin
{ Draw the folder buttons at the bottom }
DrawBottomFolderButtons(DrawBmp.Canvas, MyRect, CurPos);
finally
{ Copy the buffer bitmap to the control }
FNavBar.Canvas.CopyMode := cmSrcCopy;
FNavBar.Canvas.CopyRect(MyRect, DrawBmp.Canvas, MyRect);
FNavBar.Canvas.CopyRect(MyRect, DrawBmp.Canvas, Rect(0, 0, DrawBmp.Width,DrawBmp.Height));
finally
DrawBmp.Free;
end;
end;