Direkt auf Desktop zeichnen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Direkt auf Desktop zeichnen

Beitrag von teamO »

Hi,

Wie der Betreff schon sagt versuch ich gerade was direkt (also ohne Fenster oder so) auf dem Desktop zu zeichnen (zb. so wie mit 2d-Drawing auf Fenstern und Screens). Ich hab schon die Forensuche bemüht, und hab auch einen kleinen Beispielcode von Stargate gefunden:

Code: Alles auswählen

Global DesktopOutput_Memory = AllocateMemory(1024)
Procedure.l DesktopOutput()
PokeL(DesktopOutput_Memory, 1)
ProcedureReturn DesktopOutput_Memory
EndProcedure
StartDrawing(DesktopOutput())
Repeat
  Plot(Random(1023), Random(767), RGB(Random(255), Random(255), Random(255)))
Until GetAsyncKeyState_(27)
StopDrawing() 
Der Produziert bei mir aber nur IMAs...

hat jemand ne idee, warum? oder wie ich das anders lösen könnte?
ich benutze PB 4.5
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Direkt auf Desktop zeichnen

Beitrag von NicknameFJ »

Hallo TeamO,

Du musst

Code: Alles auswählen

StartDrwaing()
Plot(...)
Stopdrawing()
direkt hintereinander in der Schleife haben.

Also z.B. so: (an Deinen Code angelehnt):

Code: Alles auswählen

Global DesktopOutput_Memory = AllocateMemory(1024)

Procedure.l DesktopOutput()
  PokeL(DesktopOutput_Memory, 1)
  ProcedureReturn DesktopOutput_Memory
EndProcedure


  Repeat
    StartDrawing(DesktopOutput())
    Plot(Random(1023), Random(767), RGB(Random(255), Random(255), Random(255)))
    StopDrawing()
    Delay(10)
  Until GetAsyncKeyState_(27)



Grüße
NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Direkt auf Desktop zeichnen

Beitrag von teamO »

Danke, hatte ich übersehen.
Der Invalid Memory Access Error kommt aber auch im verbesserten code...
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Direkt auf Desktop zeichnen

Beitrag von NicknameFJ »

Oops,

hatte da wohl was anderes im Gedächtnis, nämlich, dass wenn man sich über API ein Handle für Drawing zu einem Fenster holt, dieses nur im gleichen MainLoop Durchlauf gültig ist.

Hatte meinen Code mit 4.10 getestet, da geht es

mit 4.4 geht´s nicht mehr.

Sry.
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Direkt auf Desktop zeichnen

Beitrag von Thorium »

Ich verstehe nicht wirklich wie das funktioniert mit dem Desktop und warum du da 1024 Byte allozierst.
Zeichnest du in DesktopOutput_Memory rein?
Dann ist klar das du IMA's bekommst, den allozierst du nur mit 1024 Byte. Laut deinem Random-Code greifst du aber auf 1024 * 767 * 3 = 2356224 Byte zu, möglicherweise noch mehr, wenn der Pitch > 1024 * 3
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Direkt auf Desktop zeichnen

Beitrag von Fluid Byte »

Dieser Trick funktioniert nicht mehr seitdem die Drawing-Lib aktualisiert wurde.

Benutze einfach API:

Code: Alles auswählen

hdcDesktop = GetDC_(GetDesktopWindow_())

Repeat
  SetPixel_(hdcDesktop,Random(1023), Random(767), RGB(Random(255), Random(255), Random(255)))
Until GetAsyncKeyState_(27)

ReleaseDC_(0,hdcDesktop)
Windows 10 Pro, 64-Bit / Outtakes | Derek
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Direkt auf Desktop zeichnen

Beitrag von teamO »

Danke für die Antworten!

@NicknameFJ:
NicknameFJ hat geschrieben:Hatte meinen Code mit 4.10 getestet, da geht es mit 4.4 geht´s nicht mehr.
Kann das das sein, was Fluid Byte gemeint hat? Mit der Aktualisierung der Drawing-Lib?

@Thorium:
Ich versteh auch nicht was da gemacht wird.
Wie gesagt: Ich hab den Code von Stargate kopiert...

@Fluid Byte:
Das funktioniert bei mir irgendwie auch nicht.
es gibt zwar keine Fehlermeldung, aber halt auch keine Ausgabe....
ich muss aber auch zugemen, dass ich nicht versteh, was du da machst.
SetPixel_(...) ist ja relativ vielsagend, aber was macht die erste Zeile?

Achso, ich nutze noch XP. Kann es daran liegen?
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Direkt auf Desktop zeichnen

Beitrag von NicknameFJ »

Kann das das sein, was Fluid Byte gemeint hat? Mit der Aktualisierung der Drawing-Lib?
Ja, glaube auch dass die LIB dazwischen geändert wurde.
ich muss aber auch zugemen, dass ich nicht versteh, was du da machst.
SetPixel_(...) ist ja relativ vielsagend, aber was macht die erste Zeile?
In der ersten Zeile holst Du dir ein Handle zum DeviceContext des Desktop(Fensters), in der zweiten findet das Drawing auf diesen DeviceContext statt und in der letzten gibst Du den Context wieder frei.

Habe XP, kann bestätigen dass das Prog von Fluid hier auch nicht klappt

Grüße NicknameFj
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Direkt auf Desktop zeichnen

Beitrag von bobobo »

nochmal mit textausgabe

Code: Alles auswählen

hdc = GetWindowDC_(GetShellWindow_())
text$ = "Kacke nee "
SetTextColor_(hdc,#Cyan)
SetBkColor_(hdc,#Red)
TextOut_(hdc,0,0,text$,Len(text$))
ReleaseDC_(GetShellWindow_(),hdc)
der fette nachteil ist hier die platformabhängigkeit
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Direkt auf Desktop zeichnen

Beitrag von teamO »

cool, funktioniert!
Danke!

Jetzt kommt mir noch ne andere Idee: Gibt es ne möglichkeit über alles, sozusagen direkt hinter dem "Glas" des Monitors, zu zeichnen?
wenn nicht, würde ich es mit einem unsichtbaren Fenster machen, das immer im Vordergrund ist, aber dann müsste ich noch den rgb wert eines beliebigen Pixels auszulesen (in der vordersten Ebene, also entweder auf einem Fenster oder dem Desktop)

hat jemand ne idee?

Grüße,
TeamO
Antworten