2013-09-20 12 views
6

Spójrz na obrazek poniżej:Delphi: Przynieś TImage do przodu

enter image description here

Jak widać nie mogę wysłać Przyciski do tyłu. Działa to tylko dla etykiet.

Więc jak mogę wysłać TImage z przodu z jego przezroczystością.

Przy okazji przeczytałem This related question, ale mi nie pomogło. Ponieważ nie możesz nawet kliknąć przycisku po uruchomieniu kodu Andreasa Rejbranda. Nie tylko przyciski, wszystko (jak pasek przewijania w tym obrazie)

Edit: Nie chcę, aby przycisk osiągalny po wyślę, że z powrotem do obrazu. Po prostu chcesz zabrać ze sobą TImage.

Dzięki.

+0

Więc pytanie brzmi: * "Jak mogę przynieść TImage do przodu TWinControl i jednocześnie robić kliknięcia przez nią? "* (Jak wiesz, możesz kliknąć obraz.) –

+5

Ponieważ komponenty pochodzące z TGraphicControl (np. TLabel, TImage, TSpeedbutton) są malowane na ich DC rodziców nie ma możliwości a TGraphicControl przed TWincontrol z własnym DC. – bummi

+3

Jak mówi Bummi. Twoje "doprowadzenie do przodu działa na rzecz etykiet" twierdzenie jest błędne. –

Odpowiedz

8

Nie chcesz, aby obraz został przeniesiony na wierzch (co jest niemożliwe w przypadku kontrolki w oknie), ponieważ chcesz, aby przycisk był również osiągalny.

Chociaż twoje pytanie jest sprzeczne z samym sobą i nie jest jasne, co dokładnie chcesz osiągnąć, myślę, że masz na myśli przezroczysty przycisk nad obrazem.

Jeśli tak, to użyj TSpeedButton i ustaw jego właściwość Transparent i Flat na wartość True.

Oto przykład z przyciskiem trzech stanach: normalny, unosił tłoczony:

enter image description here

4

Można użyć rozwiązanie zostało połączone w swoim pytaniu. W przypadku elementów sterujących, przez które przechodzą kliknięcia, wyłącz je. Ponieważ umieszczasz obraz na panelu, wyłączenie zarówno panelu, jak i obrazu umożliwia kliknięcie przycisku.

10

Jednym ze sposobów, który może być blisko celu, byłoby użycie klas interpersonów dla TWincontrols i pomalowanie obrazu przeniesionego na nich, po ich pomalowaniu, za pomocą TControlCanvas i "zahaczenia" WM_PAINT.
Kod przedstawia nieprzetworzoną wersję roboczą przy użyciu półprzezroczystego obrazu PNG i można go ulepszyć.

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. 

Kolejny (lepszy) miejsce na "haczyk" będzie nadrzędne 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. 
Powiązane problemy