Desktop Fenster in Windows transparent darstellen
-
northstarex
- Beiträge: 105
- Registriert: 25.08.2013 18:04
- Computerausstattung: alles mögliche^^
- Wohnort: Schöppenstedt
- Kontaktdaten:
Desktop Fenster in Windows transparent darstellen
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?
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?
Re: Desktop Fenster in Windows transparent darstellen
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
https://www.purebasic.fr/english/viewto ... op#p637106
- 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
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.
Re: Desktop Fenster in Windows transparent darstellen
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....
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
Re: Desktop Fenster in Windows transparent darstellen
@NicTheQuick:
<OT>
Warum haben wir hier eigentlich nicht die Code-Tags mit Highlighting?
<\OT>
<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
- 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
<OT>
<\OT>
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=21089Axolotl hat geschrieben: 24.11.2025 12:14 @NicTheQuick:
Warum haben wir hier eigentlich nicht die Code-Tags mit Highlighting?
<\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
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.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....
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?
bis denne...
North
Re: Desktop Fenster in Windows transparent darstellen
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 .....
Jetzt muss das nur noch mit transparenten PNGs, oder halt mit Alphachannel funzen.
.....
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).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.
.....
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
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
