我想使用一个图像作为一个按钮,没有标题,没有背景,没有边界与制表位。我已经尝试了速度按钮与单位属性设置,这是完美的,除了它没有制表符。我试过bitbtn,它也接受一个图像,有一个tabstop,但没有办法删除按钮边框。我在StyleElements中取消了seBorder,它什么也不做,也没有平面选项,所以不能删除边框。
rta7y2nd1#
我们都有自己的风格和偏好,但在UI设计方面,坚持平台标准是很重要的。而且要注意,你的UI可能会在未来成为一个无法使用的头痛问题。像Aero界面的引入和高密度显示器的使用这样的事情很容易把你的个性化UI搞得一团糟。话虽如此,TSpeedButton和TBitBtn是实现你想要的两个选项。通过设计, Delphi 有两种类型的TControl。一种是TGraphicControl,像TSpeedButton,它不能接收焦点。另一种是TWinControl,像TBitBtn,它可以聚焦。所以,一种方法是将TSpeedButton放置在可聚焦容器上,通过覆盖CreateParam使容器透明,并处理其按键/按键事件。不过这并不容易。或者,您可以子类TBitBtn并覆盖其绘图,通过处理CN_DRAWITEM消息。下面是一个最小的工作示例,在 Delphi 2009和10.4上进行了测试。因为你只需要图像,所以我跳过了主题,也没有处理按钮按下,启用和悬停。阅读源代码(Buttons.pas)了解如何处理它们。将一个TButton和一个TbitBtn添加到一个新表单,并尝试以下代码
TSpeedButton
TBitBtn
TControl
TGraphicControl
TWinControl
CreateParam
CN_DRAWITEM
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.
1条答案
按热度按时间rta7y2nd1#
我们都有自己的风格和偏好,但在UI设计方面,坚持平台标准是很重要的。而且要注意,你的UI可能会在未来成为一个无法使用的头痛问题。像Aero界面的引入和高密度显示器的使用这样的事情很容易把你的个性化UI搞得一团糟。
话虽如此,
TSpeedButton
和TBitBtn
是实现你想要的两个选项。通过设计, Delphi 有两种类型的TControl
。一种是TGraphicControl
,像TSpeedButton
,它不能接收焦点。另一种是TWinControl
,像TBitBtn
,它可以聚焦。所以,一种方法是将TSpeedButton
放置在可聚焦容器上,通过覆盖CreateParam
使容器透明,并处理其按键/按键事件。不过这并不容易。或者,您可以子类TBitBtn
并覆盖其绘图,通过处理CN_DRAWITEM
消息。下面是一个最小的工作示例,在 Delphi 2009和10.4上进行了测试。因为你只需要图像,所以我跳过了主题,也没有处理按钮按下,启用和悬停。阅读源代码(
Buttons.pas
)了解如何处理它们。将一个
TButton
和一个TbitBtn
添加到一个新表单,并尝试以下代码