Transparenz - Wie an die Pixel HINTER meinem Fenster kommen?
-
Hallo!
Ich habe ein Fenster welches ich an den Kanten transparent zeichnen muss (aus Kantenglättungsgründen). Für die Transparenz benötige ich allerdings die Pixeldaten des Fensters unter mir (ist immer ein großes Editfeld (da man scrollen etc. kann ist der Inhalt nicht konstant)). An das Fenster zu kommen ist kein Ding. Nur wie komme ich am Schnellsten an die Pixeldaten?
Kann ich über Umwege genau nur an die Pixeldaten unter meinen Transparenzpixeln des Fensters kommen? Ich dachte mir ich hole mir einfach den Gerätekontext des Fensters über dem mein Transparenzfenster liegt und hol mir aus diesem dann per GetPixel die einzelnen Pixel die ich benötige.
Meint ihr das klappt, auch wenn diese Pixel durch mein Fenster verdeckt sind? Oder kennt ihr gar schnellere Methoden?
Einfach GetPixel machen auf dem ScreenDC wenn mein Fenster noch nicht gezeichnet ist reicht nicht, da sich der Inhalt des Editfeldes ja ändern kann.
Vielen Dank,
AA
-
Hi,
Du kannst TransparentBlt nutzen... .
Ich würd aber noch hier drauf verweisen:
MSDN schrieb:
Windows 95/98: TransparentBlt contains a memory leak that can exhaust system resources. To draw a transparent bitmap using BitBlt, see Knowledge Base article 79212.
-
Hi!
Kann ich leider nicht verwenden für Childwindows.Angenommen du hast eine Donutform als Bitmap, welches außem rum transparent ist und innen das kleine Loch ist transparent. Dann malst du das mit TransparentBlt in dein rechteckiges Childfenster... als Ergebnis erhälst du dann zwar den Donut transparent, jedoch gemixt mit der Hintergrundfarbe des Childfensters, nicht mit der Farbe des Fensters, welches hinter dem Childfenster ist => ich brauche die Farben die hinter dem Childfenster sind

Gruß,
AA
-
Wenn du so klug bist, dann frag nich hier im Forum!
-
Anti Aliasing schrieb:
dein rechteckiges Childfenster...
lol, Regions ?! Außerdem solltest du mal zwischen vollständiger und nur teilweiser Transparenz differenzieren.
Was willst du eigentlich machen ?
-
Natürlich Regions....ich wollte dir nur zeigen, dass als Transparentfarbe bei TransparentBlt die Hintergrundfarbe des Childfensters verwendet wird.
Ich möchte nun die Ränder des Fensters, welches mit Regionen begrenzt ist schön weich malen, wozu ich nunmal die Farbe der dahinter liegenden Pixel brauche...weiter nichts.
-
Anti Aliasing schrieb:
Natürlich Regions....ich wollte dir nur zeigen, dass als Transparentfarbe bei TransparentBlt die Hintergrundfarbe des Childfensters verwendet wird.
Ich möchte nun die Ränder des Fensters, welches mit Regionen begrenzt ist schön weich malen, wozu ich nunmal die Farbe der dahinter liegenden Pixel brauche...weiter nichts.
Ja...schon klar...aber du kannst dir nicht einfach den DC eines 'verdeckten' Fensters holen...siehe <Hier>
Außerdem wird das ne ganz schöne Rechnerei...würde mich stark wundern, wenn das flüssig läuft
.
-
Daher hab ich ja gefragt, was ihr machen würdet um die Transparenz zu berechnen...irgendwie muss es ja gehen...
Windows kanns ja auch. Es gibt ja die Möglichkeit Fenster zu einem bestimmten Prozentsatz transparent zu machen..also muss ich doch auch die Möglichkeit haben meine Childwindows an bestimmten Stellen nur teilweise transparent zu machen... Es ist leicht zu programmieren, dazu benötige ich leider aber die Farben, die hinter dem Fenster sind....

Keine Ideen?
-
Anti Aliasing schrieb:
Windows kanns ja auch. Es gibt ja die Möglichkeit Fenster zu einem bestimmten Prozentsatz transparent zu machen
Jo mit SetLayeredWindowAttributes(...) ...
>= Windows 2000Anti Aliasing schrieb:
..also muss ich doch auch die Möglichkeit haben meine Childwindows an bestimmten Stellen nur teilweise transparent zu machen... Es ist leicht zu programmieren, dazu benötige ich leider aber die Farben, die hinter dem Fenster sind....

Nein nicht unbedingt...: Siehe <Hier>
-
Problem bei SetLayeredWindowAttributes() ist: Man kann den Alpha-Wert nicht für jeden Pixel einzeln bestimmen sondern nur für das komplette Fenster.
Und Regions haben doch auch immer scharfe Kanten (sprich: Einfache Transparenz, keine Alpha-Transparenz um den Rand der Regions herum) oder irre ich mich da ?
Beides bringt imho gar nichts, denn er braucht ja mit Sicherheit Alpha-Transparenz quasi nur an den Kanten und will die Berechnung dafür ja momentan scheinbar selbst machen wofür er ja die Pixel unter seinem "Kantenbereich" braucht.
In meinen Augen lässt sich das nicht wirklich gescheit lösen.
Sagen wir mal die Pixeldaten hättest du und du hättest dir jetzt nen schönen geglätteten Rahmen gezeichnet - Was machst du wenn das Fenster unter dir eine Animation abspielt oder sich einfach schonmal ändert ? Du müsstest ständig die Pixel neu holen damit der Rahmen nich komisch aussieht. Vor allem wenn der Rahmen nicht rechteckig ist wird man das vermutl. sofort sehen wenn der Rahmen nicht mehr passt...
-
Das mit dem Layeredwindow bringt mir nichts, denn:
Es funktioniert nicht mit Childwindows.Eine Möglichkeit wäre WM_PRINT...dazu müsste man allerdings BeginPaint des darunterliegenden Fensters hooken etc... hach wie schön kompliziert... naja sonst wärs ja keine Arbeit

-
Hmm, ich bin mir nich mehr sicher ob ich weiss was du vorhast

Kannste evtl. nen Beispiel-Screenshot basteln oder so ?
-
Hi nochaml,
Hm wie wärs denn <damit> ?