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

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

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

Beitrag 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
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag 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
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag 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
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag 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
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag von FGK »

Wow!

Danke Stefan - Klasse Service :allright:


Gruß

FGK
Antworten