16

我正在尝试在 Delphi 应用程序中实现 Windows 7 中的 Google Chrome 样式选项卡。

这其中的要素是:

  • 选项卡可能会像在 google chrome 本身中那样延伸到非客户区。
  • 启用 glass 时在 Vista 和 Windows 7 上正确绘制
  • 标签就像谷歌浏览器一样工作,看起来像谷歌浏览器,在玻璃上。

在此处输入图像描述

我发现我必须克服的挑战是:

  • 如何让控件(VCL 控件)扩展到非客户区?(执行此操作的控件的一个很好的示例是 VCL 源中包含的 Ribbon 控件,但我还没有看到其他人这样做,并且需要一些邪恶的黑客才能使 Ribbon 起作用)
  • 如何在玻璃上正确绘制位图?(DWM API)。一个相关的问题已经回答了这个方面,在这里,我也问了这个问题。
4

4 回答 4

19

我刚刚为 Delphi 完成了一个非常完整的 Chrome Tabs 实现。

在此处输入图像描述

特点包括:

  • 完全可配置的外观和感觉,包括渐变、透明度和自定义标签形状
  • 使用 Aero 时可以在标题栏中绘制选项卡
  • 适用于 Vista 玻璃
  • 标签移动动画
  • 选项卡过渡样式效果(颜色和 alpha 级别之间的淡入淡出)
  • 在容器内和容器之间拖放
  • 拖动图像显示选项卡和任何 TWinControl
  • 用户单击关闭按钮时智能标签调整大小
  • 使用最小和最大选项卡大小调整选项卡大小
  • 添加选项卡按钮可以定位在左侧、右侧或浮动右侧
  • 全功能滚动,包括拖动时自动滚动
  • 智能标签内容显示根据标签宽度隐藏/显示项目
  • 所有者绘制任何项目
  • 从右到左的文字
  • 固定选项卡
  • 选项卡微调器 - 渲染和位图。
  • 带有动画发光的修改选项卡
  • 标签图像和叠加图像
  • 鼠标悬停在发光
  • 很多活动
  • 加载/保存外观和流/文件选项
  • 生成外观/选项 Delphi 代码

您可以在此处下载源代码和完整的演示/编辑器:http ://code.google.com/p/delphi-chrome-tabs/

于 2012-12-12T15:48:51.893 回答
7

您不想要一个完整的玻璃窗口,但您必须自己绘制选项卡,因为我知道没有一个控件可以为您提供所需的确切外观。如果您使用当前窗体的 GlassFrame 属性,请启用它并将顶部设置为您想要的选项卡的高度,在该区域放置一个油漆盒并使用 GDI+ 调用手动绘制您的选项卡。EDN ( http://cc.embarcadero.com/Download.aspx?id=26950 )上提供了一个很好的库,应该适用于此。在不使用 GDI+ 的情况下,您将能够绘制到颜料盒,但黑色会变得透明。使用 GDI+,您可以在任何颜色的玻璃上自由绘制。例如:

运行示例

资源:

unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GdiPlusHelpers, GdiPlus, StdCtrls, ExtCtrls;

type
  TForm6 = class(TForm)
    pb1: TPaintBox;
    procedure pb1Paint(Sender: TObject);
  private
    { Private declarations }
   public
    { Public declarations }
  end;

var
  Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.pb1Paint(Sender: TObject);
var
  Graphics : IGPGraphics;
  Brush: IGPSolidBrush;
  FontFamily: IGPFontFamily;
  Font: IGPFont;
  Point: TGPPointF;
  Pen: IGPPen;
begin
  Graphics := Pb1.ToGPGraphics;
  Brush := TGPSolidBrush.Create(TGPColor.Create(255, 0, 0, 0));
  FontFamily := TGPFontFamily.Create('Consolas');
  Font := TGPFont.Create(FontFamily, 12, FontStyleRegular, UnitPoint);
  Point.Initialize(1, 0);
  Graphics.TextRenderingHint := TextRenderingHintAntiAlias;
  Graphics.DrawString('GDI+ Black Text', Font, Point, Brush);
  Pen := TGPPen.Create(TGPColor.Create(255, 0, 0, 0));
  Graphics.DrawLine(Pen, 0, 0, 200, 100);
end;

end.

形式:

object Form6: TForm6
  Left = 0
  Top = 0
  Caption = 'Form6'
  ClientHeight = 282
  ClientWidth = 418
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  GlassFrame.Enabled = True
  GlassFrame.Top = 22
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object pb1: TPaintBox
    Left = 0
    Top = 0
    Width = 313
    Height = 105
    OnPaint = pb1Paint
  end
end

编辑更新为抗锯齿文本,使其看起来更好。

于 2010-10-13T17:03:22.613 回答
7

很久以后才发现,来自 Klever Components:

http://rmklever.com/?p=248

在此处输入图像描述

于 2011-06-30T01:26:26.920 回答
0

在此处解释的玻璃形式的标题中绘画:http ://delphihaven.wordpress.com/2010/04/22/setting-up-a-custom-title-bar-reprise/ 您还可以查看来源delphi 的功能区控件。

于 2012-12-13T09:52:47.353 回答