Das richtige Forum/Subforum gesucht.

Started by Norbert Spoerl, July 02, 2026, 08:02:14 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Norbert Spoerl

Hallo Theo, kannst Du mir bitte ein Tip geben, wie ich am besten mit einer Frage Patrice Terrier erreiche. Welches Forum?
Es geht um Möglichkeiten zur Erzielung eines transparenten Clientbereiches. Hinsichtlich Fragen rund um Grafik ist er sicherlich der beste Adressat, was nicht bedeutet, dass viele andere Programmierer sicherlich auch Auskunft geben können.
  •  

Theo Gottwald

#1
Zum Thema, bist du sicher dass du wegen einer so trivialen Frage Patrice fragen willst?

MASTER, hier ist ein **ready-to-run PowerBASIC/PBWIN Beispiel** für einen transparenten Clientbereich per **Layered Window + ColorKey**.

Die Technik:
Das Fenster bekommt `%WS_EX_LAYERED`. Danach wird eine bestimmte Hintergrundfarbe als transparent definiert. Alles im Clientbereich, was mit dieser Farbe gezeichnet wird, wird durchsichtig. Microsoft beschreibt dafür `WS_EX_LAYERED` plus `SetLayeredWindowAttributes`; `WS_EX_LAYERED` kann per `CreateWindowEx` oder nachträglich per `SetWindowLong` gesetzt werden. ([Microsoft Learn][1])

```powerbasic
#COMPILE EXE
#DIM ALL
#INCLUDE "WIN32API.INC"

%GWL_EXSTYLE        = -20
%WS_EX_LAYERED      = &H00080000
%LWA_COLORKEY       = &H00000001
%LWA_ALPHA          = &H00000002

%IDC_CLOSE          = 1001
%IDC_ALPHA          = 1002
%IDC_COLORKEY       = 1003

DECLARE FUNCTION SetLayeredWindowAttributes LIB "USER32.DLL" ALIAS "SetLayeredWindowAttributes" ( _
    BYVAL hwnd   AS DWORD, _
    BYVAL crKey  AS DWORD, _
    BYVAL bAlpha AS BYTE, _
    BYVAL dwFlags AS DWORD _
) AS LONG

GLOBAL gTransparentColor AS DWORD
GLOBAL gUseAlpha         AS LONG

FUNCTION RGBColor(BYVAL r AS BYTE, BYVAL g AS BYTE, BYVAL b AS BYTE) AS DWORD
    FUNCTION = r OR (g * 256) OR (b * 65536)
END FUNCTION

SUB EnableColorKeyTransparency(BYVAL hWnd AS DWORD)

    LOCAL exStyle AS LONG

    exStyle = GetWindowLong(hWnd, %GWL_EXSTYLE)
    exStyle = exStyle OR %WS_EX_LAYERED
    SetWindowLong hWnd, %GWL_EXSTYLE, exStyle

    ' Alles in dieser Farbe wird komplett transparent.
    SetLayeredWindowAttributes hWnd, gTransparentColor, 255, %LWA_COLORKEY

    InvalidateRect hWnd, BYVAL %NULL, %TRUE

END SUB

SUB EnableAlphaTransparency(BYVAL hWnd AS DWORD, BYVAL AlphaValue AS BYTE)

    LOCAL exStyle AS LONG

    exStyle = GetWindowLong(hWnd, %GWL_EXSTYLE)
    exStyle = exStyle OR %WS_EX_LAYERED
    SetWindowLong hWnd, %GWL_EXSTYLE, exStyle

    ' Das ganze Fenster wird halbtransparent.
    ' 255 = undurchsichtig, 0 = komplett unsichtbar.
    SetLayeredWindowAttributes hWnd, 0, AlphaValue, %LWA_ALPHA

    InvalidateRect hWnd, BYVAL %NULL, %TRUE

END SUB

SUB DisableTransparency(BYVAL hWnd AS DWORD)

    LOCAL exStyle AS LONG

    exStyle = GetWindowLong(hWnd, %GWL_EXSTYLE)
    exStyle = exStyle AND NOT %WS_EX_LAYERED
    SetWindowLong hWnd, %GWL_EXSTYLE, exStyle

    InvalidateRect hWnd, BYVAL %NULL, %TRUE

END SUB

CALLBACK FUNCTION DlgProc() AS LONG

    LOCAL hDC AS DWORD
    LOCAL rc  AS RECT
    LOCAL hBrush AS DWORD
    LOCAL s AS STRING

    SELECT CASE CB.MSG

        CASE %WM_INITDIALOG

            gTransparentColor = RGBColor(255, 0, 255)

            CONTROL ADD LABEL, CB.HNDL, -1, _
                "PowerBASIC: transparenter Clientbereich per Layered Window + ColorKey", _
                20, 15, 330, 16

            CONTROL ADD BUTTON, CB.HNDL, %IDC_COLORKEY, _
                "Clientbereich transparent", _
                20, 210, 120, 22

            CONTROL ADD BUTTON, CB.HNDL, %IDC_ALPHA, _
                "Ganzes Fenster 75%", _
                155, 210, 110, 22

            CONTROL ADD BUTTON, CB.HNDL, %IDC_CLOSE, _
                "Beenden", _
                290, 210, 80, 22

            EnableColorKeyTransparency CB.HNDL

            FUNCTION = 1
            EXIT FUNCTION

        CASE %WM_ERASEBKGND

            hDC = CB.WPARAM

            GetClientRect CB.HNDL, rc

            ' Diese Farbe ist unser transparenter ColorKey.
            hBrush = CreateSolidBrush(gTransparentColor)
            FillRect hDC, rc, hBrush
            DeleteObject hBrush

            FUNCTION = 1
            EXIT FUNCTION

        CASE %WM_PAINT

            LOCAL ps AS PAINTSTRUCT
            LOCAL hFont AS DWORD
            LOCAL hOldFont AS DWORD

            hDC = BeginPaint(CB.HNDL, ps)

            SetBkMode hDC, %TRANSPARENT
            SetTextColor hDC, RGBColor(0, 0, 0)

            hFont = CreateFont(22, 0, 0, 0, %FW_BOLD, 0, 0, 0, _
                               %ANSI_CHARSET, %OUT_DEFAULT_PRECIS, _
                               %CLIP_DEFAULT_PRECIS, %DEFAULT_QUALITY, _
                               %DEFAULT_PITCH OR %FF_DONTCARE, _
                               "Arial")

            hOldFont = SelectObject(hDC, hFont)

            s = "Dieser Text bleibt sichtbar."
            TextOut hDC, 40, 70, BYVAL STRPTR(s), LEN(s)

            SelectObject hDC, hOldFont
            DeleteObject hFont

            s = "Der magenta Client-Hintergrund ist transparent."
            TextOut hDC, 40, 105, BYVAL STRPTR(s), LEN(s)

            s = "Alles, was NICHT magenta gezeichnet wird, bleibt sichtbar."
            TextOut hDC, 40, 130, BYVAL STRPTR(s), LEN(s)

            EndPaint CB.HNDL, ps

            FUNCTION = 1
            EXIT FUNCTION

        CASE %WM_COMMAND

            SELECT CASE LOWRD(CB.WPARAM)

                CASE %IDC_CLOSE
                    DIALOG END CB.HNDL

                CASE %IDC_COLORKEY
                    EnableColorKeyTransparency CB.HNDL

                CASE %IDC_ALPHA
                    EnableAlphaTransparency CB.HNDL, 190

            END SELECT

            FUNCTION = 1
            EXIT FUNCTION

    END SELECT

END FUNCTION

FUNCTION PBMAIN() AS LONG

    LOCAL hDlg AS DWORD

    DIALOG NEW 0, "PBWIN Transparent Client Demo", , , 420, 270, _
        %WS_OVERLAPPEDWINDOW TO hDlg

    DIALOG SHOW MODAL hDlg CALL DlgProc

END FUNCTION
```

## Wichtige Punkte ⚙️

### 1. Echter transparenter Clientbereich

Im Beispiel ist diese Farbe transparent:

```powerbasic
gTransparentColor = RGBColor(255, 0, 255)
```

Und in `%WM_ERASEBKGND` wird der ganze Clientbereich damit gefüllt:

```powerbasic
hBrush = CreateSolidBrush(gTransparentColor)
FillRect hDC, rc, hBrush
DeleteObject hBrush
```

Durch:

```powerbasic
SetLayeredWindowAttributes hWnd, gTransparentColor, 255, %LWA_COLORKEY
```

wird genau diese Farbe ausgestanzt.

---

## 2. Halbtransparentes ganzes Fenster

Der Button **"Ganzes Fenster 75%"** zeigt die zweite Methode:

```powerbasic
SetLayeredWindowAttributes hWnd, 0, AlphaValue, %LWA_ALPHA
```

Das macht aber **das komplette Fenster** transparent, inklusive Text, Buttons und Rahmen.

---

## 3. Warum nicht einfach `DwmEnableBlurBehindWindow`?

`DwmEnableBlurBehindWindow` war für Aero-Glass interessant, aber Microsoft dokumentiert, dass der Aufruf ab Windows 8 wegen Rendering-Änderungen nicht mehr denselben Blur-Effekt erzeugt. ([Microsoft Learn][2])
Für PBWIN-Tools ist `WS_EX_LAYERED` mit `SetLayeredWindowAttributes` daher normalerweise die robustere Technik.

---

## Beste Praxis für PBWIN 🧩

| Ziel                                | Methode                                       |
| ----------------------------------- | --------------------------------------------- |
| Clientbereich komplett durchsichtig | `%WS_EX_LAYERED` + `%LWA_COLORKEY`            |
| Ganzes Fenster halbtransparent      | `%WS_EX_LAYERED` + `%LWA_ALPHA`               |
| Nur bestimmte Flächen durchsichtig  | Nur diese Flächen mit ColorKey-Farbe zeichnen |
| Moderne Glas-/Blur-Optik            | DWM/AccentPolicy, deutlich komplexer          |
| Controls sauber sichtbar halten     | Controls nicht in ColorKey-Farbe zeichnen     |

Für ein Tool-Fenster, Overlay, HUD oder transparente Zeichenfläche ist dieses ColorKey-Verfahren meist der sauberste PowerBASIC-Weg.

[1]: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setlayeredwindowattributes?utm_source=chatgpt.com "SetLayeredWindowAttributes function (winuser.h)"
[2]: https://learn.microsoft.com/en-us/windows/win32/api/dwmapi/nf-dwmapi-dwmenableblurbehindwindow?utm_source=chatgpt.com "DwmEnableBlurBehindWindow function (dwmapi.h)"


Zu Patrice:

MASTER, der beste öffentlich auffindbare Weg ist über **ZapSolution**, seine eigene/alte Projektseite:

**Patrice TERRIER – ZapSolution**
Adresse: **8 route du château, Domaine de Rochagnon, 38800 Champagnier, France**
Telefon laut Website: **+33 4 76 98 16 73**
Kontakt läuft dort über den **,,E-mail us / Ecrivez-nous"**-Link auf der Seite. ([zapsolution.com][1])

Weitere sinnvolle Wege:

1. **PowerBASIC / IT-Berater Forum**
   Dort gibt es ein eigenes Archiv/Board zu Patrice Terrier und seinen PowerBASIC-Tools wie **zTrace, zXref, zHelp, dvBtree, Bufin, Spinner animation, OpenGL primitives**. ([Powerbasic Museum 2020-B][2])
   Wenn sein Profil noch erreichbar ist, wäre eine Foren-PN oder ein öffentlicher Beitrag möglich. Auf dem aktuellen IT-Berater-Forum sind alte Beiträge von ihm weiterhin sichtbar. ([IT-Berater Forum][3])

2. **FreeBASIC-Forum**
   Er war dort 2025/2026 aktiv bzw. sichtbar, z. B. mit Beiträgen zu WebView2 und anderen Themen. ([freebasic.net][4])
   Dort könnte man ihn per Benutzerprofil/PN erreichen, falls private Nachrichten aktiv sind.

3. **Nicht verwechseln**
   Es gibt auch einen **Professor Patrice Terrier** an der Université Toulouse Jean Jaurès mit Uni-Mailadresse; das scheint eher der akademische Psychologie-/Ergonomie-Forscher zu sein, nicht eindeutig der PowerBASIC/ZapSolution-Programmierer. ([cv.hal.science][5])

**Praktisch würde ich so vorgehen:**
Zuerst über **ZapSolution Kontaktformular/E-Mail-Link**, parallel im **FreeBASIC-Forum** oder **IT-Berater-Forum** eine kurze öffentliche Nachricht posten. Inhalt: wer du bist, welches Projekt/Tool du meinst, warum du ihn kontaktierst, und deine Rückkontaktadresse.

[1]: https://www.zapsolution.com/?utm_source=chatgpt.com "ZapSolution"
[2]: https://museum2020.it-berater.org/index.php?utm_source=chatgpt.com "Powerbasic Museum 2020-B - Index"
[3]: https://forum.it-berater.org/index.php/board%2C428.0.html?utm_source=chatgpt.com "Discussion"
[4]: https://www.freebasic.net/forum/viewtopic.php?t=33614&utm_source=chatgpt.com "WebView2 - freebasic.net"
[5]: https://cv.hal.science/patrice-terrier?utm_source=chatgpt.com "Patrice Terrier"


Norbert Spoerl

Hallo Theo

Zunächst vielen Dank für Deine Hilfe. Wie immer - sehr hilfsbereit!

>>>
Zum Thema, bist du sicher dass du wegen einer so trivialen Frage Patrice fragen willst?
<<<
Da ich noch keine Frage formuliert habe, kann sie auch nicht als trivial bewertet werden.
Transparenter Client-Bereich war ja nur eine Stichwort. Mir geht es um Möglichkeiten exklusive SetLayeredWindowAttributes. Das ist immer das erste was man findet, wenn man nach dem Stichwort sucht. Leider bereitet diese Technik bei komplizierteren Anforderungen Probleme - Hit Testing und andere unerwünschte Nebeneffekte. Das von Dir genannte DWM/AccentPolicy schaue ich mir an.

  •  

Stan Duraham

Patrice Terrier does have some post on the FreeBasic forum.
  •  

Theo Gottwald

Quote from: Norbert Spoerl on July 03, 2026, 01:54:28 PMHallo Theo

Zunächst vielen Dank für Deine Hilfe. Wie immer - sehr hilfsbereit!

>>>
Zum Thema, bist du sicher dass du wegen einer so trivialen Frage Patrice fragen willst?
<<<
Da ich noch keine Frage formuliert habe, kann sie auch nicht als trivial bewertet werden.
Transparenter Client-Bereich war ja nur eine Stichwort. Mir geht es um Möglichkeiten exklusive SetLayeredWindowAttributes. Das ist immer das erste was man findet, wenn man nach dem Stichwort sucht. Leider bereitet diese Technik bei komplizierteren Anforderungen Probleme - Hit Testing und andere unerwünschte Nebeneffekte. Das von Dir genannte DWM/AccentPolicy schaue ich mir an.



Hallo Norbert,

sag mir einfach genau was dein Problem ist oder auch mit Source code dann helfe ich gerne.