Seite 2 von 8

Verfasst: 23.02.2006 16:39
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.

Verfasst: 23.02.2006 16:57
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.

Verfasst: 23.02.2006 20:23
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ß

Verfasst: 23.02.2006 20:59
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

Verfasst: 25.02.2006 18:13
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

Verfasst: 25.02.2006 18:20
von ts-soft
>> hwndDesktop.l = GetDesktopHandle_()
Gibts das?
Kannste aber ersetzen durch:
hwndDesktop.l = 0 :wink:

Verfasst: 25.02.2006 18:28
von Daniel P.
Pardon, meinte natürlich "GetDesktopWindow_()". Wie gesagt, habe den Code schnell zusammengeschrieben und bräuchte Hilfe bei diesem Module-Dingens...

Gruß

Verfasst: 25.02.2006 18:33
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.

Verfasst: 25.02.2006 19:38
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)

Verfasst: 25.02.2006 20:01
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.