GrabDrawingImage

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

GrabDrawingImage

Beitrag von Josh »

Hallo,

ich habe mir da ein bisschen Code von Stargate gestohlen und ein wenig verändert. Warum funktioniert der folgende Code nicht mehr, wenn ich die acht Drawing Zeilen außerhalb der Eventschleife schreibe?

Code: Alles auswählen

Enumeration
  #Window
  #WindowView
  #Gadget
  #CanvasGadget
  #OutputImage
EndEnumeration


OpenWindow(#Window, 100, 100, 300, 200, "WindowTitle", #PB_Window_MinimizeGadget)
  ButtonGadget(#Gadget, 10, 10, 200, 20, "Hallo")
   
OpenWindow(#WindowView, 500, 100, 300, 200, "WindowTitle", #PB_Window_MinimizeGadget)
  CanvasGadget(#CanvasGadget, 0, 0, 400, 300)


Repeat

  If StartDrawing(WindowOutput(#Window))
    GrabDrawingImage(#OutputImage, 0, 0, WindowWidth(Window), WindowHeight(Window))
    StopDrawing()
  EndIf

  If StartDrawing(CanvasOutput(#CanvasGadget))
    DrawImage(ImageID(#OutputImage), 0, 0)
    StopDrawing()
  EndIf

Until WaitWindowEvent() = #PB_Event_CloseWindow
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: GrabDrawingImage

Beitrag von Kiffi »

du meinst, warum das ButtonGadget nicht im CanvasGadget erscheint?

Der Button ist zum Zeitpunkt des GrabDrawingImage() ja noch
gar nicht gezeichnet worden. Das geschieht erst in der Event-
Schleife.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: GrabDrawingImage

Beitrag von STARGÅTE »

Weil dann keine aktualisierung des CanvasGadgets stattfindet.
Damit das Canvas das anzeigt, was das Window hat, muss es auch bei jedem Event erneuert werden.

Und mit ButtonGadget() wird noch kein Button gezeichnet, sondern erst bei einem Event.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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

Re: GrabDrawingImage

Beitrag von ts-soft »

Da nun feststeht, das das Zeichnen nur im EventLoop funktioniert, sollte noch erwähnt werden,
das diese Zeichnen auf einem passendem Event erfolgen sollte, z.B. #PB_Event_Repaint im Fenster #Window
und nicht bei jedem Durchbrechen von WaitWindowEvent, das belastet nur die CPU :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
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: GrabDrawingImage

Beitrag von STARGÅTE »

@ts-soft:
Das stimmt schon, allerdings würde dann bei diesem Code das Canvas-Resultat nicht mehr zum echten Fenster passen,
da bei einem "ausfaden" des Hovereffekts unter Win 7 nur einmal ein Repaint-Event kommt.
Das Canvas wäre dann also immer noch "blau".
Allerdings weiß ich ja nicht wo Josh hin will ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: GrabDrawingImage

Beitrag von Josh »

Danke für eure schnellen Antworten. Das passt mir zwar überhaupt nicht ins Konzept, aber ich werde mich mal damit spielen. Ganz logisch erscheint mir das mit der Eventschleife nicht. Ich kann mich täuschen, aber mir kommt vor, dass beim Debuggen in VB6 das Control sofort nach der Anweisung auf dem Fenster erschienen ist.

Wichtig für mich ist jetzt, mit welchem Ereignis das Gadget auf dem Fenster ist. Das zweite Fenster war hier nur für das Beispiel. Ich brauche nur das Image vom ersten Fenster.

Nur so eine Idee dazwischen. Könnte ich das auch in einem Thread machen?

@Stargate: Dass die gehoverten Gadgets noch nicht ausgeblendet sind, damit kann ich leben.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: GrabDrawingImage

Beitrag von STARGÅTE »

@Josh:
Du musst dir das so vorstellen, dass ButtonGadget und all die anderen Befehle immer nur Nachrichten (Message) an das Fenster schicken. Das Fenster selbst muss dann auf diese Nachricht reagieren und das kann es nur nach einem WindowEvent, wo alle Ereignisse verarbeitet werden.

Diese Vorgehensweise ist insofern "logisch", damit bei zB 1000 aufrufen von AddGadgetItem nicht 1000 mal das Gadget oder gar das Fenster komplett neu gezeichnet werden muss, sondern erst bei einem WindowEvent, das Fenster "selbst entscheidet" welche der Items überhaupt gerade sichtbar sind usw.
Ähnliches gilt für Gadgets die auf Container gesetzt werden die garnicht sichtbar sind (Items im PanelGadget).
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: GrabDrawingImage

Beitrag von bobobo »

wieso kann man das Image eigentlich nicht speichern mit saveimage ???
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: GrabDrawingImage

Beitrag von Josh »

bobobo hat geschrieben:wieso kann man das Image eigentlich nicht speichern mit saveimage ???
Kannst du schon, aber dann ist halt nix drauf :mrgreen:

Code: Alles auswählen

SaveImage (#OutputImage, "TEST.BMP", #PB_ImagePlugin_BMP, 0, 32)
Aber ich habe da jetzt noch mal was gefunden. Ich weiß zwar noch nicht so genau, was ich da gemacht habe, aber da ich es nur für Windows brauche, werde ich das mal weiterverfolgen. Die unterschiedliche Position des Gadgets dürfte wahrscheinlich in irgendeinen Zusammenhang mit dem NonClient Bereich des Fensters stehen.

Code: Alles auswählen

Enumeration
  #Window
  #WindowView
  #Gadget
  #CanvasGadget
  #OutputImage
EndEnumeration

OpenWindow(#Window, 100, 100, 300, 200, "WindowTitle", #PB_Window_MinimizeGadget)
  ButtonGadget(#Gadget, 10, 10, 200, 20, "Hallo")
   
OpenWindow(#WindowView, 500, 100, 300, 200, "WindowTitle", #PB_Window_MinimizeGadget)
  CanvasGadget(#CanvasGadget, 0, 0, 400, 300)

hdc = StartDrawing(CanvasOutput(#CanvasGadget))
  SendMessage_(WindowID (#Window), #WM_PRINT, hdc, #PRF_CLIENT|#PRF_CHILDREN|#PRF_ERASEBKGND|#PRF_CHECKVISIBLE )
StopDrawing()

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: GrabDrawingImage

Beitrag von bobobo »

aha Farbtiefe :mrgreen:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten