Auf Desktop zeichnen...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

den hinetergrund zu tauschen ist für die alles, was irgendwie dynamisch verändert werden soll viel zu langsam.

edit:
habe grade noch was gefunden, man kann wohl den device context vom hintergrund mit GetDC_(GetDesktopWindow_()) bekommen. dass sollte eigentlich reichen um drauf pinseln zu können, hab aber grade keine zeit es aus zu probieren. vieleicht hilft dir das ja als ansatz.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

hattest Du hier mal geguckt?
http://forums.purebasic.com/german/view ... intergrund

Da gings um's selbe Thema .. ist dort auch schon gescheitert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Dieses Thema hab ich bereits über die Suche gefunden, nur wirklich weiter gebracht hat es mich nicht. Mir würde es schon genügen (das mit "auf dem Desktop herumpinseln" ist wohl zu komplex), wenn ich ein Fenster hätte, das auf der gleichen Höhe liegt wie der Desktop und das man nicht in den Vordergrund oder vor andere Fenster platzieren kann. Das würde mir für den Anfang schon reichen. In diesem Fenster könnte man ja dann machen, was man möchte...

Gruß
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

in der Art eventuell

Code: Alles auswählen



OpenWindow(0,0,0,300,300,#PB_Window_SystemMenu,"immer hinten")


Repeat
event=WaitWindowEvent()
SetWindowPos_(WindowID(0),#HWND_BOTTOM,0,0,0,0,#SWP_NOMOVE|#SWP_NOREPOSITION|#SWP_NOSIZE)

Until event=#PB_Event_CloseWindow
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Vielleicht habe ich die Lösung, wie ich das Fenster durchklickbar machen kann. Im Code-Archiv von PureArea.net habe ich in der Fenster-Sektion folgendes Beispiel gefunden:

Code: Alles auswählen

hWnd1.l = OpenWindow(1, 10, 10, 300, 300, #PB_Window_SystemMenu | #WS_OVERLAPPEDWINDOW, "Hallo") 
hWnd2.l = CreateWindowEx_(0, "Static", "owned Window", #WS_VISIBLE | #WS_OVERLAPPEDWINDOW, 20, 20, 100, 100, hWnd1, 0, GetModuleHandle_(0), 0) 

Repeat 
  event = WaitWindowEvent() 
Until event = #PB_Event_CloseWindow 
Dieser Code erzeugt ein Owned-Window. Das Parent-Fenster (hwnd1) liegt hinter dem Child-Fenster (hwnd2), das Child ist praktisch "topmost". Wenn man nun das Parent-Fenster hinter das Child-Fenster schiebt und nun auf dem Child-Fenster herumklickt (Beispielsweise versucht, das "X" vom Parent-Fenster anzuklicken, das durch das Child-Fenster verdeckt wird), werden die Klicks einfach durch das Child-Fenster an das Parent-Fenster hindurchgereicht - als ob das Child gar nicht existieren würde.
Nun habe ich das ganze weiter gesponnen und habe mir gedacht, dass man ja das Handle vom Desktop dem "CreateWindowEx_()" übergeben könnte, sodass der Desktop ein Owned-Child-Window bekommt. Theoretisch müssten dann die Klicks einfach wirkungslos bleiben und direkt an den Desktop weitergereicht werden. Und zusammen mit dem Code von bobobo wäre das Fenster immer auf der Höhe des Desktops. Folgender Code also:

Code: Alles auswählen

; hWnd1 bleibt erst mal als Dummy-Fenster da, sonst gibt es einen Runtime-Error mit der Schleife unten...
hWnd1.l = OpenWindow(1, 10, 10, 300, 300, #PB_Window_SystemMenu | #WS_OVERLAPPEDWINDOW, "Hallo") 

hwndDesktop.l = GetDesktopHandle_()
hWnd2.l = CreateWindowEx_(0, "Static", "owned Window", #WS_VISIBLE | #WS_OVERLAPPEDWINDOW, 20, 20, 100, 100, hWndDesktop, 0, GetModuleHandle_(0), 0) 

Repeat 
  event = WaitWindowEvent()
  SetWindowPos_(WindowID(hWnd2),#HWND_BOTTOM,0,0,0,0,#SWP_NOMOVE|#SWP_NOREPOSITION|#SWP_NOSIZE)
Until event = #PB_Event_CloseWindow 
Dieser Code müsste theoretisch funtionieren (habe ich mir nur schnell zusammengeschrieben). Allerdings müsste ich bei hWnd2 das ModuleHandle (<- was ist das eigentlich?) vom Desktop ermitteln, ansonsten funktioniert das nicht. Könnte mir da jemand eventuell weiterhelfen, denn mit der Windows API kenn ich mich nicht wirklich gut aus :freak:

THX
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> hwndDesktop.l = GetDesktopHandle_()
Gibts das?
Kannste aber ersetzen durch:
hwndDesktop.l = 0 :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Pardon, meinte natürlich "GetDesktopWindow_()". Wie gesagt, habe den Code schnell zusammengeschrieben und bräuchte Hilfe bei diesem Module-Dingens...

Gruß
Gruß, Daniel :? | In der Realität ist die Wirklichkeit ganz anders...

PB 4.10 (Windows XP SP 2)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Was ist den der Unterschied zwischen DesktopWindow und Desktop.
Desktop hat immer 0 als Handle. DesktopWindow hat ein extra Handle?

Zu Deinem Problem:

Code: Alles auswählen

GetModuleHandle_(GetDesktopWindow_())
wäre die logische Konsequenz

//Nachtrag:
Um Dein Fenster als Unterfenster des Desktops zu erklären, kannste es normal erstellen und mit:

Code: Alles auswählen

SetParent_(DeinFensterhWnd, 0)
zum Desktopfenster machen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Aus aktuellem Anlass
http://forums.purebasic.com/german/viewtopic.php?t=7106
weiß ich wie verwirrend das sein kann.

Hie mal eine Zusammenstellung dessen was ich in den letzten 24 Stunden gelernt habe :

Code: Alles auswählen

; Der Desktop sollte rechts nicht verdeckt sein !!!

; so wie ts-soft es sagt :
text$ = "Hello World !"
hWin=0 ; Der Bildschirm - wer hier malt, malt eventuell auf andere Fenster
MyDC = GetDC_(hWin) ; DeviceContext zum malen,  schreiben, ....
SetBkMode_(MyDC, #TRANSPARENT)
TextOut_(MyDC, 200, 5, text$, Len(text$));
ReleaseDC_(hWin, MyDC);           
Repeat : Until GetAsyncKeyState_(#VK_ESCAPE)
InvalidateRect_(hWin,0,1)


; weitere Möglichkeiten 
; - haben aber nichts mit "Auf Desktop zeichnen" zu tun - glaube ich
hDesktop=GetDesktopWindow_();
Debug hDesktop
hDesktop=FindWindowEx_(hDesktop, 0, "Progman", "Program Manager");
Debug hDesktop
ShowScrollBar_(hDesktop,#SB_VERT,#True)
Delay(300);
InvalidateRect_(hWin,0,1) 
Repeat : Until GetAsyncKeyState_(#VK_ESCAPE)
ShowScrollBar_(hDesktop,#SB_VERT,#False)
InvalidateRect_(hWin,0,1)

hDesktop=FindWindowEx_(hDesktop, 0, "SHELLDLL_DefView", 0);
Debug hDesktop
hDesktop=FindWindowEx_(hDesktop, 0, "SysListView32", 0);
Debug hDesktop
#LVM_GETTITEMCOUNT = $1000 + 4
Debug SendMessage_(hDesktop, #LVM_GETTITEMCOUNT, 0, 0) ;anzahl der desktop icons
SendMessage_(hDesktop,#LVM_SETTEXTCOLOR,0,RGB(255,0,0))
SendMessage_(hDesktop,#LVM_SETTEXTBKCOLOR,0,#CLR_NONE)
InvalidateRect_(hWin,0,1)
UpdateWindow_(hWin)
Repeat : Until GetAsyncKeyState_(#VK_ESCAPE)
SendMessage_(hDesktop,#LVM_SETTEXTCOLOR,0,RGB(255,255,255)) 
SendMessage_(hDesktop,#LVM_SETTEXTBKCOLOR,0,#CLR_NONE)
InvalidateRect_(hWin,0,1)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Schöne Zusammenstellung :allright:

Hab garnicht dran gedacht, das der Desktop ja auch nur ein ListView ist und
man diesen dann auch so behandeln kann.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten