Auf Desktop schreiben und löschen?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Auf Desktop schreiben und löschen?

Beitrag von Agent »

Hallo PBler.

Ich habe folgenden interessanten Code aufgeschnappt:

Code: Alles auswählen

#wMem=0
Global Mem.l
; hier werden 1024 byte speicher reserviert
Mem = AllocateMemory(1024)

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

Repeat
  ; hier kommen die Texte
  StartDrawing(DesktopOutput())
  Locate(780,10)
  FrontColor(0,0,0)
  DrawingMode(2)
  DrawText("CPU: "+Str(CpuUsage())+"% ")
  StopDrawing()
  ; delay für cpu entlastung
  Delay(250)
  ; hier wird die escape taste geprüft
Until GetAsyncKeyState_(#VK_ESCAPE)
InvalidateRect_(0, 0, 0)
End
An sich, eine sehr interessante Geschichte. Aber wie lösche ich den Desktop zum neu beschriften??? Das InvalidateRect resettet der Bildschirm als wenn man F5 (neuaufbau) drückt. Ich möchte aber z.B. die CPU-Auslastung alle 1 Sekunden anzeigen lassen, das würde flackern wie blöd.

Hat jemand da eine Lösung? Oder steh ich auf der Leitung...
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Den Desktop zu erneuern würde wohl allgemein ein flackern der Symbole bewirken, da diese neu gezeichnet werden müssten. Also solltest vielleicht einfach den Text alle eine Sekunde erneut über den alten drüber malen, ohne etwas anderes als invalide zu erklären. Dann müsste es doch klappen, solange der Desktop nicht neu gezeichnet wird und der Text immer über den alten drüber gemalt wird.
(Btw. kann man leichter auf den Desktop malen wenn man GetDC(0) verwendet. Also, der Device Context des Fensters 0 ist der Device Context des Desktops. Dies spart die Speicherreservierung und eine Prozedur). ;)

EDIT: Ich erinnere mich aber auch an ein Beispiel irgendwo, wo es mal möglich war, eine Fahne über den Desktop zu bewegen, ohne dass es flimmerte. Es ist also sicherlich irgendwie möglich. Wie genau und was da für Aufwand für betrieben werden muss, weiß ich aber nicht. Wenn dein Text immer an der selben Stelle sein soll, sollte es ausreichen, ihn immer wieder zu übermalen.

EDIT2: Also hiermit kann man erstmal den Text alle 0,1 Sekunde ändern, bei mir ohne Flimmern:

Code: Alles auswählen

Repeat
    hdc = GetDC_(0);
    text$ = "Zufallswert: " + Str(Random(10));
    TextOut_(hdc, 200, 5, text$, Len(text$));
    Delay(100);
    ReleaseDC_(0, hdc);            
Until GetAsyncKeyState_(#VK_ESCAPE)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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

Beitrag von NicTheQuick »

Die elegantere Lösung wäre wohl ein rahmenloses Fenster ([c]#PB_Window_Borderless[/c]) mit einem rahmenlosen ImageGadget zu erstellen und dort das gewünschte reinplotten.
Ich weiß jetzt allerdings nicht, ob ein Text angezeigt werden soll, der im Hintergrund transparent ist, denn dafür würde sich das ImageGadget eher nicht eignen. Außer man benutzt die Skinfunktionen von Danilo oder die Regions in Fenstern (-> siehe PureArea).
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Ich würd's per Overlay machen.

Das legt sich praktisch über den Desktop und flackert nicht.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

Hast du dafür ein Bsp @real?
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Sorry für die Verspätung! Ich schau mal zuhause... Kann mich dunkel erinnern, mal was mit einem Overlay gemacht zu haben.
Antworten