Seite 1 von 1

Problem bei Output auf Gadgets - StopDrawing() macht Ärger

Verfasst: 28.07.2005 11:54
von FGK
Hallo Leute,

inspiriert durch BoBoBo Beitrag in diesem Thread
http://forums.purebasic.com/german/viewtopic.php?t=4141
hab ich mich dran versucht in Gadgets zumalen ohne diese Userlib E2D.
Anhand des Quellcodes kriege ich das auch ganz gut hin - nur! beim freigeben des DC also mit StopDrawing kommt es zum Absturz. Kann aber nicht rausfinden wie das korrekt gemacht werden muß. Die Userlib Pushed dazu das DC und den Whnd auf den Stack. Klappt bei mir leider nicht so doll. Vielleicht hat jemand ne Lösung dazu?

Hier der Versuchs-Code

Code: Alles auswählen

Structure GDrawingInfoStruct
  GType.l   ; DD 2
  GWindow.l
  GDC.l
EndStructure

If OpenWindow(0, 100, 200, 640,480,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered , "PureBasic Window")
  
  
  If CreateGadgetList(WindowID(0))
    
    ContainerGadget(97,0,0,640,480,#PB_Container_Raised)
    ButtonGadget(1,10,10,50,25,"Bereich 3")
    CloseGadgetList()
     Repeat
      EventID.l = WaitWindowEvent()
   
      Output.GDrawingInfoStruct\GType=2
      Output.GDrawingInfoStruct\GWindow=GadgetID(97)
      Output.GDrawingInfoStruct\GDC = GetWindowDC_(GadgetID(97))
   
         StartDrawing(@Output)
           Box(0,0,100,100,RGB(0,0,255))
          ; ;a=Output\GDC
          ; ;b=Output\GWindow
          ; ;!PUSH [v_a]
          ; ;!PUSH [v_b]
         ;ReleaseDC_(Output\GWindow,Output\GDC)
         StopDrawing()
      
    If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
    
    Until Quit = 1
  EndIf  
EndIf
End

Gruß

FGK

Verfasst: 28.07.2005 12:39
von Stefan
Hi FGK
Wenn du Type auf den Wert 2 setzst, muss du noch eine Funktion angeben, die den DC wieder freigibt:
Beispiel:

Code: Alles auswählen

Structure DrawingInfoStruct 
  Type.l 
  Window.l 
  DC.l 
  ReleaseProcedure.l 
  PixelBuffer.l 
  Pitch.l 
  Width.l 
  Height.l 
  Depth.l 
EndStructure 

Global DS.DrawingInfoStruct 

Procedure ReleaseOutput() 
  ReleaseDC_(DS\Window,DS\DC) 
EndProcedure 

Procedure hWndOutput(hWnd) ; returns the outputID for the declared window handle 
  DS\Type=2 
  DS\Window=hWnd 
  DS\DC=GetWindowDC_(hWnd) 
  DS\ReleaseProcedure=@ReleaseOutput() ;<---- HIER
  ProcedureReturn DS 
EndProcedure
Gruß
Stefan

Verfasst: 28.07.2005 12:56
von FGK
Danke Stefan,

das ist echt klasse, daß du so schnell ne Lösung anbieten kannst.
Nebenbei gefragt, woher erhält man die Infos über die Internas
von PB? Oder konkreter wo gibt es die Aufstellung was welcher
Typ genau in der Structure fordert?

Danke und
Gruß

FGK

Verfasst: 28.07.2005 15:51
von Stefan
Eine paar Informationen über die internen Variablen findest du in der Library descriptor file im "Library SDK"-Ordner.
Da die descriptor-file leider völlig unvollständig und veraltet ist, hab ich sie um einiges erweitert.
Link:http://hometown.aol.de/moebiusstefan/Pu ... riptor.txt
Hab dir hier noch schnell eine Liste der Typen gemacht:

Code: Alles auswählen

;+-----+--------+----+-------------+-------------+-------+-------+--------+------+
;|Type | Window | DC | ReleaseProc | PixelBuffer | Pitch | Width | Height | Depth|
;+-----+--------+----+-------------+-------------+-------+-------+--------+------+
;|1*   |   X    |  X |             |             |       |       |        |      |
;|2**  |        |  X |      X      |             |       |       |        |      |
;|5*** |        |  X |      X      |             |       |       |        |      |
;|7****|        |  X |      X      |      X      |   X   |   X   |   X    |   X  |
;+-----+--------+----+-------------+-------------+-------+-------+--------+------+
;*    WindowDC (WindowOutput())
;**   MemoryDCs/All DCs (ImageOutput())
;***  DC of the Printer (PrinterOutput())
;**** DC of a DirectDrawSurface7 + Direct Memory access (SpriteOutput()/TextureOutput()) 
Gruß
Stefan

Verfasst: 28.07.2005 17:22
von FGK
Wow!

Danke Stefan - Klasse Service :allright:


Gruß

FGK