2013-09-20 5 views
6

Guardate l'immagine qui sotto:Delphi: Portare TImage a fronte

enter image description here

Come potete vedere Non riesco a mandare i pulsanti per eseguire. Funziona solo per le etichette.

Quindi, come posso inviare TImage davanti con la trasparenza.

A proposito, ho letto This related question ma non mi ha aiutato. Perché non puoi nemmeno cliccare su un pulsante dopo aver eseguito il codice di Andreas Rejbrand. Non solo i pulsanti, tutto (come la barra di scorrimento in questa immagine)

Edit: Io non voglio fare il pulsante raggiungibile dopo che trasmetto che torna all'immagine. Voglio solo portare TImage davanti a tutto.

Grazie.

+0

Quindi la tua domanda è * "come posso portare un TImage a fronte di un TWinControl e allo stesso tempo fai clic sui clic? "(Come sai, puoi fare clic su un'immagine.) –

+5

Poiché i componenti derivati ​​da TGraphicControl (come TLabel, TImage, TSpeedbutton) sono dipinti sui loro genitori DC, non c'è modo di portare un TGraphicControl davanti a un TWincontrol con la sua stessa DC. – bummi

+3

Come dice Bummi. La tua affermazione "porta in primo piano sta lavorando per le etichette" è sbagliata. –

risposta

8

Non si desidera che l'immagine venga portata in primo piano (che tra l'altro è impossibile su un controllo a finestra), perché si desidera che il pulsante sia raggiungibile.

Anche se la tua domanda è in contraddizione con se stessa, e non è del tutto chiaro cosa esattamente vuoi ottenere, penso che tu voglia avere un pulsante trasparente su un'immagine.

In tal caso, utilizzare TSpeedButton e impostare la proprietà Transparent e Flat su True.

Ecco un esempio con i tre stati del pulsante: normali, aleggiava, premuto:

enter image description here

4

È possibile utilizzare la soluzione si è collegato nella sua interrogazione. Per i controlli che desideri vengano passati, disabilitalo. Dato che stai mettendo l'immagine su un pannello, disabilitando sia il pannello che l'immagine lascerai fare clic sul pulsante.

10

Un modo per avvicinarsi all'obiettivo sarebbe utilizzare le classi interposer per i TWincontrols e dipingere l'immagine spostata su di essi, dopo che sono stati già dipinti, utilizzando un TControlCanvas e "agganciare" WM_PAINT.
Il codice mostra una bozza non elaborata utilizzando un'immagine PNG semitrasparente e può essere migliorata.

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. 

Altro (meglio) posto a "gancio" sarebbero prioritarie in 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.