Delphi 图像按钮,无标题,无边框,带制表位

ttcibm8c  于 2023-03-22  发布在  其他
关注(0)|答案(1)|浏览(183)

我想使用一个图像作为一个按钮,没有标题,没有背景,没有边界与制表位。
我已经尝试了速度按钮与单位属性设置,这是完美的,除了它没有制表符。
我试过bitbtn,它也接受一个图像,有一个tabstop,但没有办法删除按钮边框。我在StyleElements中取消了seBorder,它什么也不做,也没有平面选项,所以不能删除边框。

rta7y2nd

rta7y2nd1#

我们都有自己的风格和偏好,但在UI设计方面,坚持平台标准是很重要的。而且要注意,你的UI可能会在未来成为一个无法使用的头痛问题。像Aero界面的引入和高密度显示器的使用这样的事情很容易把你的个性化UI搞得一团糟。
话虽如此,TSpeedButtonTBitBtn是实现你想要的两个选项。通过设计, Delphi 有两种类型的TControl。一种是TGraphicControl,像TSpeedButton,它不能接收焦点。另一种是TWinControl,像TBitBtn,它可以聚焦。所以,一种方法是将TSpeedButton放置在可聚焦容器上,通过覆盖CreateParam使容器透明,并处理其按键/按键事件。不过这并不容易。或者,您可以子类TBitBtn并覆盖其绘图,通过处理CN_DRAWITEM消息。
下面是一个最小的工作示例,在 Delphi 2009和10.4上进行了测试。因为你只需要图像,所以我跳过了主题,也没有处理按钮按下,启用和悬停。阅读源代码(Buttons.pas)了解如何处理它们。
将一个TButton和一个TbitBtn添加到一个新表单,并尝试以下代码

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Buttons, StdCtrls;

type
  // This changes all TBitBtn controls in this form, including the one from the plaette
  TBitBtn = class(Buttons.TBitBtn)
  private
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
    procedure DrawItem(const DrawItemStruct: TDrawItemStruct);
  end;

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TBitBtn }

procedure TBitBtn.CNDrawItem(var Message: TWMDrawItem);
begin
  DrawItem(Message.DrawItemStruct^);
end;

procedure TBitBtn.DrawItem(const DrawItemStruct: TDrawItemStruct);
var
  R: TRect;
  FCanvas: TCanvas;
begin
  FCanvas := TCanvas.Create;
  try
    FCanvas.Handle := DrawItemStruct.hDC;
    R := ClientRect;
    if Focused then
      FCanvas.DrawFocusRect(R);
    FCanvas.Draw((R.Left + R.Right - GlyPh.Width) div 2,
                 (R.Top + R.Bottom - GlyPh.Height) div 2,
                 GlyPh);
  finally
    FCanvas.Free;
  end;
end;

end.

相关问题