Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
procedure TDBCtrlPanel.WMNCHitTest(var Message: TWMNCHitTest);
begin
if csDesigning in ComponentState then
Message.Result := HTCLIENT else
Message.Result := HTTRANSPARENT;
end
Du könntest Dir mal die Paint-Routine vom TWinControl anschauen. Ich persönlich halte es aber für ziemlich aussichtslos. Ein TWinControl ist nicht umsonst rechteckig und nicht transparent. Dies ermöglicht effezienten Aufbau der Oberfläche.<br>Evtl. ist es effektiver, einfach eine externe Komponente zu suchen, die das gewünschte macht. Obwohl mir so eine auch noch nicht untergekommen ist und es dann sicher ein Haufen von Problemen und Einschränkungen gibt. Schliesslich gibt es für die drunterliegende Komponente keine Veranlassung, sich vollständig zu aktualisiern, wenn Sie von einem TWinControl verdeckt wird. Evtl. bietet sich an, im Web mal nach TWinControls mit Bitmaphintergründen zu suche...<p>
Grüße, Mario Noac
Mario hat vollkommen recht. Man kann zwar jeden Windowsfensterhandle hWnd, demnach auch TWinControl, mit SetWindowLong(gwl_ExStyle, ... ws_Ex_Transparent); mitteilen das es ein transparentes fenster ist, ABER so richtig funktoniert hat das wohl noch nie. Das Problem ist nicht dieses transparente Fenster, sondern die nicht-transparenten Fentser unter diesem Fenster. Anscheinend weiß Windows nicht das es auch unser trans. Control neu darzustellen hat wenn in einem der darunterliegenden Fenster sich was neu darstellt.<br>
Man kann auch ein nicht-transparentes TWinControl als transparent erscheinen lassen. D.h. bevor es sichtbar gemacht wird kopiert es den Inhalt der darunterliegenden Fenster in eine Bitmap. Diese wird dann jeweils in der wm_Paint und wm_EraseBkGnd Message dargestellt. Dies funktioniert und ich habe es schon selber gecodet. ABER, auch hier entsteht das Problem wenn sich unter diesem Fenster was geändert hat, es
<li>1. zu registrieren
<li>2. den neuen Originalzustand in die Bitmap zu lesen
Das liegt ganz einfach an der dritten Feststellung von Mario. Falls ein Fenster durch ein nicht-transparentes fenster (ws_Ex_Transparent) überdeckt wird, so ist dieser überlappende Bereich für dieses Fenster irrelevant. Das GDI schneided sozusagen diesen Bereich aus dem sichtbaren Bereich des darunterliegenden Fensters aus. Zeichnet sich dieses neu, werden NUR die verbleibenden, somit sichtbaren Regionen gezeichnet.<br>
Angenommen du hast zwei A4-Blätter, eines Rot eine Grün. Rot überlappt Grün und beide liegen auf dem Schreibtisch. Der Schreibtisch ist unser "Desktop" und schneidet aus grün den bereich der durch Rot überlappt wird raus. D.h. wenn Grün sich zeichnen soll dann zeichnet es keinen A4 Bereich sondern nur einen unvollständigen Bereich.<br>
Dieses Konzept wiederspricht vollständig dem waqs du möchtest.<br>
Aber einen Hoffnungsschimmer gibt es. Ab Win2k/XP gibt es die Möglichkeit sein Fenster per Alphablending darzustellen. Dazu müssen ja auch echte transparente Fenster möglich sein. Suche also mal nach diesen neuen Features im Windows-API.<br>
Comment