![]() |
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:
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.
FZoomRectImg.Aling := alClient;
FZoomRectImg.Transparent := true; FZoomRectImg.Picture.Bitmap.TransparentColor := TransColor; 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. |
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:
|
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; |
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 ...
|
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.
|
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:
In der Prozedur reiche Ich jetzt die Message weiter, an den Parent des TOverLayImg, welches vollständig über der TAdvCustomGraph Instanz liegt.
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; 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. |
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. |
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);
|
AW: TImage soll Transparent sein und Messages weiterleiten
Ich habe exakt das Verhalten mit einer abgeleiteten Paintbox so gelöst:
Delphi-Quellcode:
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.
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; |
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 10:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz