Desktop Fenster in Windows transparent darstellen

Anfängerfragen zum Programmieren mit PureBasic.
northstarex
Beiträge: 105
Registriert: 25.08.2013 18:04
Computerausstattung: alles mögliche^^
Wohnort: Schöppenstedt
Kontaktdaten:

Desktop Fenster in Windows transparent darstellen

Beitrag von northstarex »

hallo,

ich habe das früher öfters bei Purebasic Programmen gesehen, dass ein Fenster auf dem Desktop angezeigt wird, da wo der Hintergrund komplett transparent war. Also da wurde nur eine PNG Grafik (nehme ich mal an) dargestellt und der Hintergrund vom Fenster war 100 % Transparent. So wie hier:
http://www.felugbr.de/daten/trans-pure01.jpg

Hat da wer ne Idee, oder gibt es da mittlerweile was in dem Windowsbefehlen in PB?
Bild
SMaag
Beiträge: 186
Registriert: 08.05.2022 12:58

Re: Desktop Fenster in Windows transparent darstellen

Beitrag von SMaag »

Ich denke eher, dass da direkt auf den Desktop gezeichnet wird und das geht mit den 2D Drawing Befehlen.

https://www.purebasic.fr/english/viewto ... op#p637106
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Desktop Fenster in Windows transparent darstellen

Beitrag von NicTheQuick »

Es gab hier früher definitiv Codes, die eine Art Transparentmaske über ein Fenster gestülpt habe, sodass man man die Fensterform beliebig gestalten konnte. Ich hab das aber generell schon länger nicht mehr in der freien Wildbahn gesehen. Ich kann mir vorstellen, dass es heute mit Windows 10 und 11 schwerer geworden ist, aber leider hab ich mit der Windows-Programmierung schon lange nichts mehr am Hut.
Axolotl
Beiträge: 306
Registriert: 31.12.2008 16:34

Re: Desktop Fenster in Windows transparent darstellen

Beitrag von Axolotl »

Moin,
also mit Win-API ist das kein großes Problem....
Direkt auf den Desktop malen geht, aber a) kein guter Stil, b) erfordert permanentes selber neuzeichnen
Als Starthilfe siehe folgendes Beispiel, ohne Berücksichtigung meiner eigenen Codierungsrichtlinien....

Code: Alles auswählen

; Written by Axolotl 

Procedure SetWindowTransparency(Window, Color)
  SetWindowLong_(WindowID(Window),#GWL_EXSTYLE,GetWindowLong_(WindowID(Window),#GWL_EXSTYLE) | $00080000) ; #WS_EX_LAYERED = $00080000
  SetLayeredWindowAttributes_(WindowID(Window), Color, 0, 1)
EndProcedure 


Procedure Main() 
  Protected xQuitLoop 
  Protected ww, wh, nbDesks, countdown 
  Protected FColor = #Blue ; GetSysColor_(#COLOR_CAPTIONTEXT) 
  Protected BColor = GetSysColor_(#COLOR_DESKTOP)

;   nbDesks = ExamineDesktops() ; simple as it can be 
;   If nbDesks 
;     ww = DesktopWidth(0)    ; the primary ? 
;     wh = DesktopHeight(0)   ; 
;   EndIf 

  ww = 400    ; window size 
  wh = 200    ; 

  If OpenWindow(0, 0, 0, ww, wh, "", #PB_Window_BorderLess|#PB_Window_Invisible) 
    SetWindowColor(0, BColor) 
    TextGadget(0, 0, 0, ww, wh, "Hello World") 

    SetGadgetColor(0, #PB_Gadget_BackColor, BColor) 
    SetGadgetColor(0, #PB_Gadget_FrontColor, FColor) 

    If LoadFont(0, "Arial", 24, #PB_Font_Bold|#PB_Font_HighQuality) 
      SetGadgetFont(0, FontID(0)) 
    EndIf 

    SetWindowLong_(WindowID(0), #GWL_EXSTYLE, #WS_EX_LAYERED | #WS_EX_TRANSPARENT) 
    SetWindowTransparency(0, BColor) 
    
    ; Z-Order 
;   SetWindowPos_(WindowID(0), #HWND_BOTTOM, 0, 0, 0, 0, #SWP_NOMOVE|#SWP_NOREPOSITION|#SWP_NOSIZE)
    SetWindowPos_(WindowID(0), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE|#SWP_NOREPOSITION|#SWP_NOSIZE)

    HideWindow(0, 0, #PB_Window_ScreenCentered)    ;Fenster anzeigen
    AddWindowTimer(0, 1, 1000) 
    countdown = 5 
    Repeat  
      Select WaitWindowEvent()  
        Case #PB_Event_Timer 
          If EventTimer() = 1 
            SetGadgetText(0, FormatDate("%hh:%ii:%ss Uhr", Date())+#LF$+#LF$+"Countdown: " + countdown)
            countdown - 1
            If countdown < 0     ; <== Exit the App ater a short time. 
              xQuitLoop = 1 
            EndIf
          EndIf
  
        Case #WM_KEYDOWN
          Select EventwParam()
            Case #VK_F5                     : Debug "F5 is pressed"
            Case #VK_RETURN                 : Debug "Enter is pressed"
            Case #VK_ESCAPE 
              xQuitLoop = #True 
          EndSelect  

      EndSelect  
    Until xQuitLoop 
    RemoveWindowTimer(0, 1) ;; get rid of the timer...
  EndIf
EndProcedure

End Main()
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Axolotl
Beiträge: 306
Registriert: 31.12.2008 16:34

Re: Desktop Fenster in Windows transparent darstellen

Beitrag von Axolotl »

@NicTheQuick:
<OT>
Warum haben wir hier eigentlich nicht die Code-Tags mit Highlighting?
<\OT>
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Desktop Fenster in Windows transparent darstellen

Beitrag von NicTheQuick »

<OT>
Axolotl hat geschrieben: 24.11.2025 12:14 @NicTheQuick:
Warum haben wir hier eigentlich nicht die Code-Tags mit Highlighting?
Das sind Dinge, die nur Fred ändern kann als Superadmin und Herrscher über den Server. Ich nutze das Browser-Skript von STARGÅTE dafür, was man hier finden kann: viewtopic.php?t=21089
<\OT>
northstarex
Beiträge: 105
Registriert: 25.08.2013 18:04
Computerausstattung: alles mögliche^^
Wohnort: Schöppenstedt
Kontaktdaten:

Re: Desktop Fenster in Windows transparent darstellen

Beitrag von northstarex »

Axolotl hat geschrieben: 24.11.2025 12:12 Moin,
also mit Win-API ist das kein großes Problem....
Direkt auf den Desktop malen geht, aber a) kein guter Stil, b) erfordert permanentes selber neuzeichnen
Als Starthilfe siehe folgendes Beispiel, ohne Berücksichtigung meiner eigenen Codierungsrichtlinien....
Cool, thx. Dachte ich mir fast, dass es mit der WIN-API geht. Nur mit dieser habe ich mich quasi noch nicht so beschäftigt in PB.

Jetzt muss das nur noch mit transparenten PNGs, oder halt mit Alphachannel funzen.

Warum kein guter Stil? Ist doch legitimem was auf den Desktop zu schreiben. Icons und anderes wird ja auch immer neu gesetzt, bzw. geschrieben.

Eigene Codierungsrichtlinien? :o :)


bis denne...
North
Bild
Axolotl
Beiträge: 306
Registriert: 31.12.2008 16:34

Re: Desktop Fenster in Windows transparent darstellen

Beitrag von Axolotl »

northstarex hat geschrieben: 24.11.2025 20:47 .....
Jetzt muss das nur noch mit transparenten PNGs, oder halt mit Alphachannel funzen.
.....
Ja, viel Erfolg. Das ist nicht so meine Baustelle, gibts aber bestimmt was im (dt/en) Forum. Man muss nur die richtigen Suchbegriffe nehmen/finden.

northstarex hat geschrieben: 24.11.2025 20:47 .....
Warum kein guter Stil? Ist doch legitimem was auf den Desktop zu schreiben. Icons und anderes wird ja auch immer neu gesetzt, bzw. geschrieben.
.....
Naja, wie der Name (Windows) schon sagt, erwartet man (der Anwender) alle Informationen in diesen Fenstern. Einfach so auf den Desktop malen, ohne Rücksicht auf die Fenster kann man (aber) machen. (siehe Sinnloses Beispiel, unten).

Darüber hinaus besteht der Desktop auch (nur) aus Fenstern. Beispielsweise werden die Icons in einem Listview Control gezeichnet.
Ich hatte da mal was gepostet, um hinter die Icons zu malen.... Draw to Desktop behind the Icons

Sinnloses Beispiel: Zum Schreiben auf dem Bildschirm
Program ausführen und mit der Maus klicken, oder Linke Maustaste gedrückt halten und Maus schieben.

Code: Alles auswählen

Global mx, my, dtx, dty, hwnd  

Procedure WriteTextToDesktop(hwnd, Text$) 
  Protected hdc, rc.RECT

  hdc = GetDCEx_(hwnd, 0, $403)   ; #DCX_WINDOW | #DCX_CACHE | #DCX_LOCKWINDOWUPDATE 
  If hdc 
    SetBkColor_(hdc, GetPixel_(hdc, mx, my)) ; use the background color from the pixel behind the mouse cursor. 
    TextOut_(hDC, dtx, dty, Text$, Len(Text$)) 
    ReleaseDC_(hwnd, hdc) 
  EndIf 
EndProcedure 

hwnd = GetDesktopWindow_()      : Debug "Desktop = " + hwnd 

If OpenWindow(0, 0, 0, 320, 80, "Position of the mouse on the desktop", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StickyWindow(0, 1) 
  TextGadget(0, 10,  4, 300, 20, "")
  TextGadget(1, 10, 24, 300, 20, "Write Text direct on the Desktop at Mouse Position!")
  AddWindowTimer(0, 0, 25) 

  Repeat
    Event = WaitWindowEvent()
    If GetAsyncKeyState_(#VK_LBUTTON) & $8000 
      dtx = mx : dty = my 
    EndIf 
    If Event = #PB_Event_Timer ; Each 10 ms => Let's display the coordinates
      mx = DesktopMouseX()
      my = DesktopMouseY()
      text$ = "Coordinates: " + Str(mx) + "," + Str(my)
      SetGadgetText(0, text$)  
      WriteTextToDesktop(hwnd, text$)   ; only on mouse clicks 
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
northstarex hat geschrieben: 24.11.2025 20:47 .....
Eigene Codierungsrichtlinien? :o :)
.....
Nur weil du fragst, hier ein paar Beispiele(Auszug). (Ich sage nicht dass man das so machen muss..... -- Ich mache es halt so.)

Code: Alles auswählen

 
;/===
;| File Header .... 
;| All texts, names, etc. in code files are written in english. 
;\=== 
EnableExplicit   ; use declared variables only 

; Use constants instead of direct numbers or text. 
#ProgramName$  = "Test"
#ProgramVersion$ = "0.0" 
#ProgramCaption$ = "Test Tool " 

Enumeration EWindow 1  ; <= Main Enum (leave the 0 for error checks) 
  #WND_Main 
  ; tbc.
EndEnumeration

Enumeration EGadget 1 
  #GDT_txtInfo 
  #GDT_strFilename 
  #GDT_btnStart
  #GDT_btnCancel 
  ; tbc.
EndEnumeration

Enumeration ETimer 1 
  #TMR_DelayedInit 
EndEnumeration

; .... 
Enumeration EWindow  ; continued 
  #WND_Trace 
EndEnumeration

Enumeration EGadget ; continued 
  #GDT_Trace_btnClear 
  #GDT_Trace_btnCopyToClip 
  #GDT_Trace_lstOutput 
EndEnumeration
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Antworten