Auf Desktop zeichnen...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Nicht wirklich falsch, nur erscheint er mir zu umständlich. Ein Fenster mit 5 Zeilen Code zu erstellen, dass sich verhält wie eine aufgeklebte Grafik (das Fenster lässt Klicks durch - als ob es nicht da wäre), ist in meinen Augen einfacher als irgendwelche Desktopprozesse abzufangen und zu manipulieren. Da ist es doch viel einfacher, im selbst erstellten "Grafik-Fenster" zu malen. Das Einzige, was mich davon trennt, ist dieses Module-Handle. Das Fenster an den Desktop kleben geht schon, nur lässt es keine Klicks durch, weil es noch das falsche Module-Handle hat. Ich habe über die Suche noch das HIER gefunden. Muss mal schauen, ob es mir hilft. Gehe jetzt erst mal ins englische Forum auf Suche. Kann doch nicht sein, dass kein Mensch dieses Module-Handle nicht braucht...

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

PB 4.10 (Windows XP SP 2)
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Auf der Suche nach dem Module-Handle bin ich nun etwas weiter gekommen ... nein, ich habe es immer noch nicht :lol:
Dieser "Applikationspool", in dem alle Programme aufgelistet sind, bezieht sich lediglich auf das eigene Programm. Sprich man kann ohne weiteres das Module-Handle von irgendwelchen DLLs auslesen, die ohnehin vom Programm verwendet werden, aber nicht von Prozessen wie "explorer.exe". Ganz einfach aus dem Grund, da dieser Prozess nicht vom eigenen Programm aufgerufen wurde. Das erklärt zumindest, warum ich immer 0 als Rückgabewert habe. Allerdings erklärt es nicht, was ich stattdessen als Module-Handle übergeben könnte. Naja, werde heute abend noch etwas herumprobieren und ansonsten auf den Desktop malen müssen...

@uweb:
Habe dein Edit gesehen :allright: Werden denn die gezeichneten Sachen übermalt, sobald man ein Fenster über sie zieht und wieder weg schiebt oder bleiben sie stehen? Und wie sieht es aus mit Transparenz. Kann man transparent malen? Weil das wäre mir sehr wichtig - deswegen wäre ich auch so glücklich, wenn das mit meinem Fenster gehen würde...

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

PB 4.10 (Windows XP SP 2)
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Es freut mich, daß ich helfen konnte.

Ich denke sie bleiben nicht stehen - unabhängig davon wer
(Der Gärtner ist immer der Möder. ähem ... im Zweifel Windows der Übeltäter)
daran rumfingert.

Es bleibt Dir auf diesem Weg also nichts anderes übrig, als
"ständig" neu zu zeichnen. Wenn Du keine Animation am laufen hast wäre
meine Empfehlung nur bei entsprechenden Nachrichten neu zu zeichnen.
Ich weiß nicht ob das der optimale dafür Weg wäre.
Aber, ich denke damit müsste es gehen :
http://www.purearea.net/pb/showcase/show.php?id=181


Wenn Du mit transparent die Hintergrundfarbe meinst kannst Du das Beispiel
verwenden.

Code: Alles auswählen

MyDC = GetDC_(hDesktop) ; DeviceContext zum malen, schreiben, ....
SetBkMode_(MyDC, #TRANSPARENT)
Es wäre schön, wenn Du den Code hier veröffentlichen würdest.
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Fragt sich nur, ob bei dem ewigen neugezeichne der Prozessor nicht so viel Geschwindigkeit abdrücken muss. Werde mich über's Wochenende mit dem Kram mal beschäftigen. Vielleicht trägt es ja Früchte. Bis dann und danke für die Hilfe!

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

PB 4.10 (Windows XP SP 2)
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Hi,
Mirs gerade nen Licht aufgegangen vor nen paar Monaten hatte ich das prog hier aufm rechner:
http://zmatrix.sourceforge.net/

Das zeichnet eine Matrix Animation auf den Desktophintergrund und es ist OpenSource vill. findest da ja Code Stücke die du gebrauchen kannst!

mfg
125
Bild
BildDas ist Tux. Kopiere Tux in deine Signatur und hilf ihm so auf seinem Weg zur Weltherrschaft.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Das ist nett.

Aber :
1. ZMatrixSRC_1_5_2.zip ungezippt 4.885.565 Bytes
2. Programming Language : C++
3. Translations : English
4. GPL

Ich danke Dir trotzdem !
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

@uweb:
So habe gestern mal etwas mit GDI und deinem Beispiel gespielt und habe mir folgenden Code gebaut:

Code: Alles auswählen

hWndDesktop = 0
hDCDesktop = GetDC_(hWndDesktop)

text$ = "Das ist ein Test"

SetBkMode_(hDCDesktop,#TRANSPARENT)
TextOut_(hDCDesktop,200,200,text$,Len(text$))
ReleaseDC_(hWndDesktop,hDCDesktop)

End
Solange hWndDesktop "0" ist, pinselt GDI alles brav auf den Bildschirm. Leider auch über alle Fenster, anstatt nur auf dem Desktop zu bleiben. Also habe ich hWndDesktop das Handle von GetDesktopWindow_() verpasst. Allerdings zeichnet der Code gar nichts mehr. Warum dass denn? Deine drei Beispiele pinseln bei mir übrigens immer über alle Fenster :freak:

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

PB 4.10 (Windows XP SP 2)
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

ich vermute das liegt daran, dass der desktop dann signalisiert bekommt, dass er sich neu zeichnen muß und deine änderungen dann überzeichnet bevor sie angezeigt werden konnten.

in dem zmatrix beispiel wird zumindest das redraw vom desktop abgefangen.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Deine drei Beispiele pinseln bei mir übrigens immer über alle Fenster
Das finde ich merkwürdig. Da ich aber selbst nur durch viel Suchen, Try & Error,
sich aus böhmischen Dörfern einen Reim machen, zufällig darauf gekommen bin
kann ich nur wenig dazu sagen.
Es würde mich aber schon auch interessieren wo die Lösung läuft und wo nicht
bzw. ob es eine andere gibt die überall läuft.
Probiere doch bitte zur Sicherheit folgendes :

Code: Alles auswählen

; so wird bei mir über die Fenster gemalt
;hWndDesktop = 0
;**********
;so wird bei mir nicht über die Fenster gemalt
hWndDesktop=FindWindowEx_(hWndDesktop, 0, "Progman", "Program Manager");
hWndDesktop=FindWindowEx_(hWndDesktop, 0, "SHELLDLL_DefView", 0);
hWndDesktop=FindWindowEx_(hWndDesktop, 0, "SysListView32", 0);
;**********

hDCDesktop = GetDC_(hWndDesktop)

text$ = "Das ist ein Test"

SetBkMode_(hDCDesktop,#TRANSPARENT)
TextOut_(hDCDesktop,200,200,text$,Len(text$))
ReleaseDC_(hWndDesktop,hDCDesktop)

End 


Zu Deiner Frage :
Zaphod hat es wohl um einiges verständlicher ausgedrückt als ich.
Ich denke sie bleiben nicht stehen - unabhängig davon wer
(Der Gärtner ist immer der Möder. ähem ... im Zweifel Windows der Übeltäter)
daran rumfingert.
Benutzeravatar
Daniel P.
Beiträge: 333
Registriert: 06.12.2005 21:49
Kontaktdaten:

Beitrag von Daniel P. »

Das mit dem Überzeichnen habe ich mir auch schon gedacht, also habe ich heute morgen den Code in eine Endlos-Schleife gesetzt (mit einem Delay von 5) und es wurde trotzdem nichts angezeigt. Zumindest hätte etwas kurz aufblinken müssen oder so. Ich probiere mal uwebs Code-Schnippsel aus - vielleicht mache ich ja was falsch. Wenn das nicht funktioniert, könnte es eventuell daran liegen, das Samurize mit ähnlichen Funktionen arbeitet und meinen Kram überzeichnet bzw. erst gar nicht auf den Desktop lässt. Ich werd's mal zum Testen abschalten...

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

PB 4.10 (Windows XP SP 2)
Antworten