Seite 1 von 1

Windowed Screen-im zweit. Fenster wird Liste nicht angezeigt

Verfasst: 08.10.2011 12:48
von Makke
Hallo zusammen,

ich habe folgendes Problem:

ich erstelle ein Fenster mit einem Listicongadget, danach erstelle ich ein fenster auf dem ich einen Screen öffne. Das ListIconGadget wird aber auf dem ersten Fenster nicht angezeigt. Siehe:
Bild

Der Befehl zum Neuzeichnen des Fensters

Code: Alles auswählen

InvalidateRect_(WindowID(#helpWnd), #Null, #True)
bringt leider auch nichts. Weiterhin habe ich schon versucht das Fenster mit der Liste als Child des Screenwindows zu erzeugen, aber nichts funktioniert.

Noch merkwürdiger wird es, wenn ich das Fenster mit dem Gadget in einem Thread öffne, es öffnet sich kurz und ist anschließend weg, ohne das ich irgendwo CloseWIndow() bennutze.

Hat hier noch jemand einen Rat was ich tun kann ? Vielen Dank schonmal.

Re: Windowed Screen-im zweit. Fenster wird Liste nicht angez

Verfasst: 08.10.2011 13:42
von PMV
WindowEvent()?

Ansonsten:
Wie wärs mit lauffähigem Code, um das nach vollziehen zu können? :wink:

MFG PMV

Re: Windowed Screen-im zweit. Fenster wird Liste nicht angez

Verfasst: 08.10.2011 20:37
von Makke
Ok, hier mal das Grundgerüst:

Code: Alles auswählen

InitSprite() : InitMouse() : InitKeyboard()

If OpenWindow(0, 0, 0, 400, 300, "Fenster mit Gadgets", #PB_Window_SystemMenu|#PB_Window_Tool)
  ListIconGadget(0, 5, 5, 390, 290, "Column 1", 100, #PB_ListIcon_GridLines)
EndIf

If OpenWindow(1, 450, 0, 800, 600, "Fenster mit Screen", #PB_Window_TitleBar)
  If OpenWindowedScreen(WindowID(1), 0, 0, 800, 600, 0, 0, 0, #PB_Screen_WaitSynchronization)
    SetFrameRate(60)
    MouseLocate(800 / 2, 600 / 2)
  EndIf
EndIf

Repeat
  
  StartDrawing(ScreenOutput())
  DrawText(350, 290, "Windowed Screen", $FFFFFF, $0)
  StopDrawing()
  
  ExamineMouse() : ExamineKeyboard()
  
  If WindowEvent() = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    QUIT = #True
  EndIf
  
  FlipBuffers()
  Delay(1)
  
Until QUIT = #True
In meinem Progrämmchen sind noch einige Prozeduraufrufe zwischen dem erstellen der Fenster und der Schleife, aber selbst in dem entschlackten Code ist das Problem das gleiche. Ich hoffe das hilft weiter.

Re: Windowed Screen-im zweit. Fenster wird Liste nicht angez

Verfasst: 08.10.2011 20:44
von STARGÅTE
Das Problem ist hier, das du immer nur einmal das WindowEvent ausführst pro Frame.
Überlicherweise gibt es aber viel mehr Ereignisse die du alle nicht abarbeitest.

Wie auch im PB-Beispiel zu OpenWindowedScreen zu sehen ist, muss man WindowEvent selbst in einer Schleife haben:

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenWindow(1, 450, 0, 800, 600, "Fenster mit Screen", #PB_Window_TitleBar)
OpenWindowedScreen(WindowID(1), 0, 0, 800, 600, 0, 0, 0, #PB_Screen_WaitSynchronization)
SetFrameRate(60)

OpenWindow(2, 0, 0, 400, 300, "Fenster mit Gadgets", #PB_Window_SystemMenu|#PB_Window_Tool, WindowID(1))
ListIconGadget(0, 5, 5, 390, 290, "Column 1", 100, #PB_ListIcon_GridLines)

Repeat
	
	Repeat
		Select WindowEvent()
			Case #PB_Event_CloseWindow
				Break 2
			Case #Null
				Delay(1)
				Break
		EndSelect
	ForEver
	
	ClearScreen(0)
	
	If StartDrawing(ScreenOutput())
		DrawText(350, 290, "Windowed Screen", $FFFFFF, $0)
		StopDrawing()
	EndIf
	
	ExamineKeyboard()
	If KeyboardPushed(#PB_Key_Escape)
		Break
	EndIf
	
	FlipBuffers()
	
ForEver
Habe mal die Maus wieder freigegeben und das ToolWindow auch dem Hauptfenster untergeordnet.

Re: Windowed Screen-im zweit. Fenster wird Liste nicht angez

Verfasst: 08.10.2011 20:46
von PMV
Keine Ahnung, in wie weit man das als Bug bezeichnen kann ... aber
ExamineMouse() fängt die Maus komplett ein, weshalb der Benutzer
nicht mehr in der Lage ist, den Screen zu verlassen. Das in verbindung
mit weiteren Fenstern macht also wenig Sinn. Um dem Benutzer
weiter die Möglichkeit zu geben, die Maus frei zu bewegen, solltest
du WindowMouseX() usw. verwenden. Ich denke mal, dass hierdurch
das Eventhandling von Windows/ PureBasic durcheinander kommt
bzw. hängen bleibt. Vermeidung der DX-Eingabe-Funktionen sollte
das also beheben. (Aussage ohne es getest zu haben :) )

So bald ich den WindowedScreen verlasse, wird das ListGadget
nämlich dargestellt.

MFG PMV

Re: Windowed Screen-im zweit. Fenster wird Liste nicht angez

Verfasst: 08.10.2011 21:45
von NicTheQuick
STARGÅTE hat geschrieben:...

Code: Alles auswählen

...
			Case #Null
				Delay(1)
				Break
...
Das 'Delay(1)' ist in dem Fall übrigens unnötig. Dazu gibt's 'FlipBuffers()'. :wink: Natürlich wird es nicht viel ausmachen.

Re: Windowed Screen-im zweit. Fenster wird Liste nicht angez

Verfasst: 08.10.2011 22:18
von Nero
Makke hat geschrieben:Noch merkwürdiger wird es, wenn ich das Fenster mit dem Gadget in einem Thread öffne, es öffnet sich kurz und ist anschließend weg, ohne das ich irgendwo CloseWIndow() bennutze.
Bei mir gehts mit nem Thread.

Code: Alles auswählen

InitSprite() : InitMouse() : InitKeyboard()

If OpenWindow(0, 0, 0, 400, 300, "Fenster mit Gadgets", #PB_Window_SystemMenu|#PB_Window_Tool)
  ListIconGadget(0, 5, 5, 390, 290, "Column 1", 100, #PB_ListIcon_GridLines)
EndIf

If OpenWindow(1, 450, 0, 800, 600, "Fenster mit Screen", #PB_Window_TitleBar)
  If OpenWindowedScreen(WindowID(1), 0, 0, 800, 600, 0, 0, 0, #PB_Screen_WaitSynchronization)
    SetFrameRate(60)
    MouseLocate(800 / 2, 600 / 2)
  EndIf
EndIf

Global QUIT

Procedure ScreenWindow(*dummy)  
  Repeat    
    ExamineKeyboard()
    StartDrawing(ScreenOutput())
    DrawText(350, 290, "Windowed Screen", $FFFFFF, $0)
    StopDrawing()        
    
    If KeyboardPushed(#PB_Key_Escape)
      QUIT = #True
    EndIf 
    FlipBuffers() 
  Until QUIT = #True
EndProcedure

th1.l = CreateThread(@ScreenWindow(), 0)

Repeat   
  If WindowEvent() = #PB_Event_CloseWindow
    QUIT = #True    
  EndIf   
  Delay(1) 
Until QUIT = #True

WaitThread(th1)
Mfg Nero

Re: Windowed Screen-im zweit. Fenster wird Liste nicht angez

Verfasst: 09.10.2011 09:57
von Makke
Vielen Dank an Alle für Eure Hilfe.

@Stargate: ich hatte nicht bedacht das bei Erstellung eines Fensters bereits Windows-Ereignisse stattfinden. Ich benutze dieses Toolwindow nur zum Anzeigen diverser Informationen, es sollen dort keine Benutzereingaben erfolgen.

@Nero: den Thread habeich ohne Event-Schleife erstellt, ich dachte mir einfach nur das Fenster zu zeichnen.