德尔福:将TImage带到前面

时间:2013-09-20 20:33:08

标签: delphi user-interface

请看下面的图片:

enter image description here

如你所见,我无法发回按钮。这仅适用于标签。

那么如何将TImage发送到前面的及其透明度

顺便说一下,我读过This related question,但没有帮助我。因为在运行Andreas Rejbrand的代码后你甚至无法点击按钮。不仅按钮,一切(如此图像中的滚动条)

修改 我将其发送回图像后,我不想让按钮可以访问。只想将TImage带到一切的前面。

感谢。

3 个答案:

答案 0 :(得分:11)

你可以靠近目标的一种方法是使用插入器类进行TWincontrols并使用TControlCanvas绘制已经绘制的图像,然后使用TControlCanvas并“挂钩”WM_PAINT。 该代码使用半透明PNG图像显示原始草稿,可以进行增强。

enter image description here

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, dxGDIPlusClasses, ExtCtrls;

type
  TButton=Class (StdCtrls.TButton)
      Procedure WMPaint(var MSG:TMessage);Message WM_Paint;
  End;
  TEdit=Class (StdCtrls.TEdit)
      Procedure WMPaint(var MSG:TMessage);Message WM_Paint;
  End;

  TForm2 = class(TForm)
    Image1: TImage;
    SpeedButton1: TSpeedButton;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TButton }

procedure TButton.WMPaint(var MSG: TMessage);
var
  cc:TControlCanvas;
begin
   inherited;
    CC:=TControlCanvas.Create;
    CC.Control := TControl(Self);
    CC.Draw(-Left,-Top,Form2.Image1.Picture.Graphic);
    CC.Free;
end;

procedure TEdit.WMPaint(var MSG: TMessage);
var
  cc:TControlCanvas;
begin
   inherited;
    CC:=TControlCanvas.Create;
    CC.Control := TControl(Self);
    CC.Draw(-Left,-Top,Form2.Image1.Picture.Graphic);
    CC.Free;

end;

end.

另一个(更好)“挂钩”的地方将覆盖 PaintWindow

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, dxGDIPlusClasses, ExtCtrls;

type
  TButton=Class (StdCtrls.TButton)
      procedure PaintWindow(DC: HDC);override;
  End;
  TEdit=Class (StdCtrls.TEdit)
      procedure PaintWindow(DC: HDC);override;
  End;

  TForm2 = class(TForm)
    Image1: TImage;
    SpeedButton1: TSpeedButton;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TButton }

procedure TButton.PaintWindow(DC: HDC);
var
  cc:TCanvas;
begin
   inherited;
    CC:=TCanvas.Create;
    CC.Handle := DC;
    CC.Draw(-Left,-Top,Form2.Image1.Picture.Graphic);
    CC.Free;
end;

procedure TEdit.PaintWindow(DC: HDC);
var
  cc:TCanvas;
begin
   inherited;
    CC:=TCanvas.Create;
    CC.Handle := DC;
    CC.Draw(-Left,-Top,Form2.Image1.Picture.Graphic);
    CC.Free;

end;

end.

答案 1 :(得分:8)

你不希望图像被带到前面(顺便说一句,在窗口控件上是不可能的),因为你想要按钮也可以到达。

虽然你的问题本身就是矛盾的,但你究竟想要达到什么目标并不清楚,我认为你的意思是在图像上设置透明按钮。

如果是,请使用TSpeedButton,并将其TransparentFlat属性设置为True。

这里有一个带有三个按钮状态的示例:正常,悬停,按下:

enter image description here

答案 2 :(得分:4)

您可以使用您在问题中链接的解决方案。对于您希望点击进行的控件 - 禁用它们。由于您将图像放在面板上,因此禁用面板和图像将使按钮被单击。