Seite 1 von 1

GrabDrawingImage

Verfasst: 25.09.2012 15:40
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

Re: GrabDrawingImage

Verfasst: 25.09.2012 15:49
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

Re: GrabDrawingImage

Verfasst: 25.09.2012 15:50
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.

Re: GrabDrawingImage

Verfasst: 25.09.2012 16:28
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:

Re: GrabDrawingImage

Verfasst: 25.09.2012 16:48
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 ^^

Re: GrabDrawingImage

Verfasst: 25.09.2012 19:08
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.

Re: GrabDrawingImage

Verfasst: 25.09.2012 19:25
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).

Re: GrabDrawingImage

Verfasst: 25.09.2012 19:41
von bobobo
wieso kann man das Image eigentlich nicht speichern mit saveimage ???

Re: GrabDrawingImage

Verfasst: 25.09.2012 19:44
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

Re: GrabDrawingImage

Verfasst: 25.09.2012 21:06
von bobobo
aha Farbtiefe :mrgreen: