Windowed Screen-im zweit. Fenster wird Liste nicht angezeigt

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Windowed Screen-im zweit. Fenster wird Liste nicht angezeigt

Beitrag 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.
---
Windows 11 (64 bit)
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

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

Beitrag von PMV »

WindowEvent()?

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

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

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

Beitrag 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.
---
Windows 11 (64 bit)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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.
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
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

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

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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.
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

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

Beitrag 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
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

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

Beitrag 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.
---
Windows 11 (64 bit)
Antworten