Laden...

Teil eines fremden Fensters transparent

Erstellt von one of two vor 14 Jahren Letzter Beitrag vor 14 Jahren 789 Views
O
one of two Themenstarter:in
85 Beiträge seit 2008
vor 14 Jahren
Teil eines fremden Fensters transparent

Hallo,

ich überlege schon seit einer Weile wie es gehen könnte, doch so ne richtige Idee fehlt mir bisher. Darum frag ich euch mal.

Es gibt die WinAPI Funktion SetLayeredWindowAttributes. Damit kann man die Opacity eines Fenster bestimmen und auch den Transparency Key.

Jetzt meine Frage: Diese Funktion macht die Änderungen für das gesamte Fenster, ich möchte allerdings nur in einen Bereich was ändern.

Möglichkeit 1:

Ich benutze Regions o.ä. um den Transparenzeffekt nur auf ein bestimmtes Rectangle anzuwenden. Doch bisher hatte ich hierbei keine Erfolg, da ich nicht weiß, wie ich die Transparenz in eine bestimmte Region "zwinge"...

Möglichkeit 2:

Ich zeichne manuell auf das Fenster ein farbiges Rectabgle mit einer grellen Farbe, dessen normale Nutzung unwahrscheinlich ist (nicht unmöglich, ich weiß), und setze den Transparency Key auf genau diese Farbe. DOch da weiß ich nicht, wei ich in das fremde Fenster ein farbiges Rectangle zeichne..

Ich wäre über jede Hilfe bzw. Anregung dankbar.

Danke + Gruß

one of two

"Wir sind die Borg. Sie werden assimiliert werden. Deaktivieren Sie Ihre Schutzschilde und ergeben Sie sich. Wir werden ihre biologischen und technologischen Charakteristika den unsrigen hinzufügen. Ihre Kultur wird sich anpassen und uns dienen. Widerstand ist zwecklos!"

915 Beiträge seit 2006
vor 14 Jahren

Hallo,

habe es selber leider noch nicht ausprobiert und ob die Lösung die Optimalste ist kann ich dir leider auch nicht sagen.

Aber du könntest versuchen via Windows API BitBlt einen bestimmten Bereich via Screen Copy zu beeinflussen.

Dafür wirst du folgende API Funktionen benötigen:
**
GetActiveWindow
GetDesktopWindow
GetWindowRect
GetDC
CreateCompatibleDC
SelectObject
BitBlt
ReleaseDC
DeleteDC**

Mehr dazu unter www.pinvoke.net

** 1.) Lösungsansatz:**

Man könnte dem Teilabschnitt im Fremden Fenster den man Transparent zeichnen möchte, wie ein Bild behandeln. Man holt sich quasi von der aktuellen Position des Fensters die darunterliegende Fläche als Bild. Dieses Bild gestaltet man leicht Transparent und malt es in die gewünschte Position des fremden Fensters. Es sollte dabei zu keinen Flackereffekten kommen, allerdings solltest du beim bewegen des fremden Fensters das Bild immer aktualisieren.

** 2.) Lösungsansatz (schwer):**

Hierzu ließ dir als erstes in Ruhe den Artikel über Custom Borders durch.

Der Gedanke dabei wäre es über NativeWindow oder SetWindowLong die Windows Nachrichten der Zeichenroutine für den Hintergrund des fremden Fensters abzufangen. An der Stelle an der die Transparente Fläche sein sollte lässt du den normalen Zeichenvorgang weg und benutzt eine transparente Zeichenroutine. Dabei kann es zu Flackereffekten kommen.

Hierzu wirst du evtl. folgende Windows Nachrichten abfangen müssen:

WM_NCPAINT
WM_NCCALCSIZE // evtl. für die NonClient Größe
WM_PRINTCLIENT

WM_NCPAINT wirst du evtl. brauchen da es sein kann das dieser Bereich Schwarz oder Weiß gemalt wird und diesen erstmal allgemein transparent ersetzten musst. WM_NCCALCSIZE kann sein das diese Nachricht nicht benötigst, denke dabei nur an die Ermittlung der NonClient Area Größe.
WM_PRINTCLIENT wirst du benötigen um die Zeichenroutine selbst in die Hand zu nehmen, so das an der gewünschten Position transparent gemalt wird.

Denk also dran, WM_PRINTCLIENT alleine wird nicht ausreichen da sonst dein Transparenter Bereich evtl Schwarz oder weiß gemalt wird.

Du wirst da etwas rumprobieren müssen, es sei jemand findet einen besseren Ansatz.
Viel Glück 😃

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(