Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TImage soll Transparent sein und Messages weiterleiten (https://www.delphipraxis.net/167533-timage-soll-transparent-sein-und-messages-weiterleiten.html)

Jonas Shinaniganz 4. Apr 2012 09:48

TImage soll Transparent sein und Messages weiterleiten
 
Immoment arbeite Ich an einer Komponente und brauche nun ein TImage, welches die ganze Komponente überdeckt und auf dem Ich zeichnen kann ohne die eigentliche Canvas der Komponente zu verwenden.

Code:
FZoomRectImg.Aling := alClient;
FZoomRectImg.Transparent := true;
FZoomRectImg.Picture.Bitmap.TransparentColor := TransColor;
Das Problem ist für mich eigentlich nur, wie ich sämtliche Windows-Messages die an das TImage gehen an meine dahinterliegende Komponente weiterleiten kann.

Also immer wenn TImage eine MESSAGE erhält vllt. ein Event auslösen, welches die Message weiter an meine Komponente gibt. Alternativ würde Ich auch TImage ableiten können und dort ausschalten das Messages überhaupt an TImage gehen.

Falls jemand Firemonkey benutzt, dort gibt es ein Boolsches Property Names HitTest, welches genau das macht, was ich nun in der VLC von XE1 haben möchte.

Jonas Shinaniganz 4. Apr 2012 10:03

AW: TImage soll Transparent sein und Messages weiterleiten
 
Um etwas präziser zu sein, eigentlich brauche Ich nur etwas Hilfe beim Befehl: SendMessage();

Ich habe eine:
Zitat:

(var Message: TMessage);
und möchte diese nun an eine Instanz von meiner Komponenten-Klasse weiterleiten. Parameter u.ä. sollen nicht verändert werden.

Jonas Shinaniganz 4. Apr 2012 10:32

AW: TImage soll Transparent sein und Messages weiterleiten
 
Immoment bekomme Ich die Fehlermeldung 'Element hat kein übergeordnetes Fenster'


Das führe Ich aus:
Delphi-Quellcode:
procedure TOverLayImg.WndProc(var Message: TMessage);
begin
  inherited;
  if Self.Parent <> nil then
    SendMessage(Parent.Handle, Message.Msg ,Message.WParam, Message.LParam);
end;

Bummi 4. Apr 2012 11:33

AW: TImage soll Transparent sein und Messages weiterleiten
 
Ich weiß ja nicht was genau Du da tust, aber vielleicht hilft ein
Delphi-Quellcode:
if not (csloading in ComponentState) then ...

SirThornberry 4. Apr 2012 12:21

AW: TImage soll Transparent sein und Messages weiterleiten
 
Wenn die Komponente den Parent komplett überdecken soll und du sozusagen auf dem Parent zeichen willst anstelle die Features von TImage zu nutzen wäre es viellleicht die einfachste Variante von der Parentkomponente abzuleiten und das Paint zu überschreiben.

Jonas Shinaniganz 4. Apr 2012 13:03

AW: TImage soll Transparent sein und Messages weiterleiten
 
Okay Ich versuche nochmal besser zu beschreiben was Ich mache:

Ich habe eine Klasse, TImage mit einer weiteren Prozedur welche aufgerufen wird wann immer eine Message gesendet wurde.

Delphi-Quellcode:
  TOverLayImg = class(TImage)
  protected
    procedure WndProc(var Message: TMessage); override;
  end;

{ TOverLayImg }


procedure TOverLayImg.WndProc(var Message: TMessage);
begin
  inherited;
  if (Parent <> nil) and (TAdvCustomGraph(Parent).HandleAllocated) then
    SendMessage(TAdvCustomGraph(Parent).Handle, Message.Msg ,Message.WParam, Message.LParam);
end;
In der Prozedur reiche Ich jetzt die Message weiter, an den Parent des TOverLayImg, welches vollständig über der TAdvCustomGraph Instanz liegt.

Es ist ein Parent vorhanden deswegen bekomme Ich meine alte Fehlermeldung 'Element hat kein übergeordnetes Fenster' nicht mehr. Darum habe Ich mich gekümmert. Jetzt bekomme ich bei SendMessage eine Zugriffsverletzung bei Adresse blabla.

Jonas Shinaniganz 4. Apr 2012 13:10

AW: TImage soll Transparent sein und Messages weiterleiten
 
Ich möchte die ja sozusagen Features von TImage nutzen,
Einfache Dinge, wie zb ein paar Striche und Kreise sollen dann auf dem TImage gezeichnet werden und auch wieder verschwinden, ohne dabei das Draw der Hauptkomponente auszulösen welche Hunderttausende von Punkten aus Arrays läd und sehr lange braucht um sich nach invalidate; wieder zu zeichnen.

vielleicht kann man es sich ganz gut wie eine weitere Ebene (wie zb bei photoshop) vorstellen.

Jonas Shinaniganz 4. Apr 2012 13:38

AW: TImage soll Transparent sein und Messages weiterleiten
 
Wenn Ich beim Msg Parameter eine 0 übergebe bekomme ich keine Fehlermeldung mehr aber auch keine Reaktion.

Delphi-Quellcode:
SendMessage(TAdvCustomGraph(Parent).Handle, 0, Message.WParam, Message.LParam);

stahli 4. Apr 2012 14:06

AW: TImage soll Transparent sein und Messages weiterleiten
 
Ich habe exakt das Verhalten mit einer abgeleiteten Paintbox so gelöst:

Delphi-Quellcode:
  TRaster = class(TPaintBox)
  private
    FLaserControl: TControl;
    procedure SetLaserControl(const Value: TControl);
  protected
    procedure CMHitTest(var Msg: TWMMouse); message CM_HITTEST;

...

procedure TRaster.CMHitTest(var Msg: TWMMouse);
begin
  inherited;
  Msg.Result := 0;
end;
Für andere Controls muss man eine ähnliche Lösung umsetzen (da dort nicht CHHitTest ausgewertet wird). Das müsste ich dann mal zu Hause nachschauen.

Jonas Shinaniganz 4. Apr 2012 14:21

AW: TImage soll Transparent sein und Messages weiterleiten
 
:) Super! Genau das habe Ich gebraucht! :thumb::thumb::thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz