6

看下图:

在此处输入图像描述

如您所见,我无法将按钮发送回去。这仅适用于标签。

那么我怎样才能以它的透明度TImage发送到前面。

顺便说一句,我已经阅读了这个相关的问题,但没有帮助我。因为在运行 Andreas Rejbrand 的代码后,您甚至无法单击按钮。不仅是按钮,还有所有东西(就像这张图片中的滚动条)

编辑: 在将按钮发送回图像后,我不想让按钮可以访问。只想把TImage一切都带到面前。

谢谢。

4

3 回答 3

11

接近目标的一种方法是使用 TWincontrols 的插入器类,并在它们已经绘制之后使用 TControlCanvas 和“挂钩”WM_PAINT 绘制移动到它们上的图像。
该代码使用半透明 PNG 图像显示原始草稿,并且可能会得到增强。

在此处输入图像描述

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.
于 2013-09-21T07:34:04.740 回答
8

您不希望将 Image 放在前面(顺便说一句,这在窗口控件上是不可能的),因为您希望按钮也可以到达。

尽管您的问题自相矛盾,并且完全不清楚您到底想要实现什么,但我认为您的意思是在图像上设置一个透明按钮。

如果是这样,则使用 a TSpeedButton,并将其TransparentandFlat属性设置为 True。

这是一个具有三个按钮状态的示例:正常、悬停、按下:

在此处输入图像描述

于 2013-09-20T21:04:40.350 回答
4

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

于 2013-09-20T21:19:40.297 回答