[ ERLEDIGT ] 2. Fenster gibt Fokus nicht zurück

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

[ ERLEDIGT ] 2. Fenster gibt Fokus nicht zurück

Beitrag von udg »

Ich habe ein Hauptprogramm in dem sich ein Button befindet.
Dieser Button öffnet per klick ein zweites Fenster. In diesem Fenster sollen Infos aus eine TxT Datei angezeigt werden. Soweit so gut.

Das zweite Fenster wird in einer Prozedur erstellt inklusive "while - wend" Schleife.
mein Problem ist nun, dass ich das zweite Fenster zwar offen habe aber nicht mehr in das andere klicken kann um dort weiter zu arbeiten.

das zweite Fenster stellt einen 3d Würfel und Text dar.

Final Code, Seite 2 - Mitte

meine Prozedur zum 2. Fenster:

Code: Alles auswählen

Procedure OpenWindow_Window_1()
  OpenWindow(#Window_1, 732, 301, 540, 610, "", #PB_Window_ScreenCentered | #PB_Window_BorderLess)
  ;- HANDLE 3D SCREEN
      MP_ScreenToHandle(WindowID(#Window_1)) ; legt fest, das Window 1 ein 3D Fenster sein soll
        SetWindowColor(#Window_1,$151312)
        ;-3D QUBE
          camera=MP_CreateCamera()              ; Erstelle Kamera
          x = 350 : y = 0 : xw = 190 : yw = 340 ; Größe des 3D Effekt Screens im Fenster
          MP_Viewport(x,y,xw,yw)
          light=MP_CreateLight(1)
          Mesh1=MP_CreateCube()
          MP_PositionEntity (Mesh1,-1.6,1.5,6.8)
          MP_Wireframe(1)                    
            If CreateImage(0, 5, 5)
              MP_CreateImageColored(0,0,RGB(61, 61, 62),RGB(5, 47, 82),RGB(89, 92, 111),RGB(26, 29, 32)) ; Farbiges Wireframe
              MP_EntitySetTexture (mesh1, MP_ImageToTexture(0))
              FreeImage(0)
            EndIf
  
          While Not WindowEvent() = #PB_Event_CloseWindow ; Fenster Schliessen
            MP_AmbientSetLight (RGBA(18, 19, 21, 196)) ; Hintergrundfarbe des 3D Bereiches
         ;-erstell 3D Welt
           MP_RenderBegin()
           MP_TurnEntity (Mesh1,0.5,0.5,0.5)  ; dreh den Würfel
           MP_RenderMesh()
             MP_Render2D () 
             MP_RenderSprite ()
             MP_RenderText ()
             MP_RenderEnd()
           MP_Flip ()    
         SendMessage_(WindowID(#Window_1), #WM_NCLBUTTONDOWN, #HTCAPTION, 0) ; Fenster mit Maus verschieben
      Wend
EndProcedure
aufgerufen wird das Ganze über meinen Button:

Code: Alles auswählen

Case #btn_show_config
    OpenWindow_Window_1() ; öffne das zweite Fenster
Kann mir bei diesem Problem jemand helfen? Die "While-Wend" Schleife lässt mich nicht mehr raus aus dem zweiten Fenster wenn es einmal offen ist. Es gibt den Fokus nicht mehr her.

Vielen Dank
Zuletzt geändert von udg am 16.12.2015 02:16, insgesamt 9-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Zweites Fenster gibt den Fokus nicht mehr her

Beitrag von NicTheQuick »

Alle Jahre ... äh... Wochen wieder... :roll:

Solange dein Programm in der "While Not WindowEvent() = #PB_Event_CloseWindow : Wend"-Schleife steckt, wird natürlich auf nichts anderes reagiert als auf den Schließen-Button eines deiner beiden Fenster. Wenn du mit mehreren Fenstern arbeitest und alle sollen gleichzeitig nutzbar sein, dann darfst du nur eine Eventschleife nutzen und musst mit 'EventWindow()' schauen, von welchem Fenster das Event kam.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Zweites Fenster gibt den Fokus nicht mehr her

Beitrag von udg »

danke dir aber wo finde ich etwas zu dem Befehl: EventWindow()

aus er Hilfe werde ich leider nicht schlau :( gibt es hierzu ein Beispiel?
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Zweites Fenster gibt den Fokus nicht mehr her

Beitrag von Derren »

EventWindow() gibt dir die Nummer des Fenster, in dem das Event registriert wurde.

Hier ein kleines Beispiel:

Code: Alles auswählen

OpenWindow(0, 0, 0, 300, 300, "Fenster 0", #PB_Window_SystemMenu )
Fenster_ID = OpenWindow(#PB_Any, 350, 0, 300, 300, "Fenster #PB_Any", #PB_Window_SystemMenu)

Repeat
	event = WaitWindowEvent()
	
	If event = #PB_Event_CloseWindow
		FensterNummer = EventWindow()
		MessageRequester("Fenster schließen", "Im Fenster "+Str(FensterNummer)+" wurde 'Schließen' gedrückt.")
		CloseWindow(FensterNummer)
	EndIf
	
    ;edit: Folgende Zeile korrigiert. Danke @kurzer
Until IsWindow(0)=0 And IsWindow(Fenster_ID)=0 ;Wenn beide Fenster geschlossen wurden: Programm beenden
MessageRequester("Programm wird Beendet","Beide Fenster wurden geschlossen.")
End 
Zuletzt geändert von Derren am 09.12.2015 20:38, insgesamt 2-mal geändert.
Signatur und so
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Zweites Fenster gibt den Fokus nicht mehr her

Beitrag von udg »

Besten Dank. :allright:

FensterNummer = EventWindow()

ich habe die ganze Zeit gesucht und überlegt was ich für den Befehl: FensterNummer eintippen muss.

woher weiss man, dass FensterNummer ein Befehl ist?
In der Hilfe steht es natürlich genau so: FensterNummer = EventWindow()

aber als nicht Pro, suche ich mir einen Wolf was ich da wohl hinschreiben muss.

Jetzt läuft es natürlich.

danke
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: [ ERLEDIGT ] Zweites Fenster gibt den Fokus nicht mehr h

Beitrag von Kurzer »

Das Beispiel von Derren ist nicht ganz korrekt.
Du musst die Until-Zeile gegen diese austauschen:

Code: Alles auswählen

Until IsWindow(0)=0 And IsWindow(Fenster_ID)=0 ;Wenn beide Fenster geschlossen wurden: Programm beenden
Grund: Es wurden ja zwei Fenster geöffnet. Eines unter Angabe der expliziten Fensternummer (0) und eines unter Angabe der Konstante #PB_Any. Bei Letzerem wird von PureBasic selbst eine Fensternummer generiert und zurückgegeben (sog. dynamische Nummernvergabe). Diese von PureBasic vergebene Nummer muss dann auch in der Until-Abfrage geprüft werden (also "Fenster_ID" statt der "1").

Fensternummer (und auch Fenster_ID) ist also in dem Fall kein Befehl, sondern eine Variable, die die Nummer des Fensters beinhaltet. Daher muss die variable auch bei IsWindow() angegeben werden.
Zuletzt geändert von Kurzer am 09.12.2015 19:13, insgesamt 1-mal geändert.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: [ ERLEDIGT ] Zweites Fenster gibt den Fokus nicht mehr h

Beitrag von Derren »

FensterNummer ist kein Befehl. Das ist ne Variable.
Und das ist eine ganz normale Variablen-Zuweisung.

EventWindow() gibt die WindowID zurück, die du bei Openwindow() einträgst. Oder die von Openwindow() zurückgegeben wird, wenn du #PB_Any verwendest.


edit: Danke, kurzer. Hab das nachträglich mit PB_Any eingebaut um auch den Fall abzudecken, aber hatte vergessen e sunten zu ändern -_-
Signatur und so
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: [ ERLEDIGT ] Zweites Fenster gibt den Fokus nicht mehr h

Beitrag von Kurzer »

Derren, jetzt lagen wir beide falsch. :lol:
Es muss IsWindow(Fenster_ID) heissen, nicht IsWindow(Fensternummer).

Ich habe eben auch nochmal korrigiert, weil mein Text falsch formuliert war (was Dich vermutlich zur ungeprüften Übernahme des Variablennamens "Fensternummer" verleitet hat). :wink:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: [ ERLEDIGT ] Zweites Fenster gibt den Fokus nicht mehr h

Beitrag von Derren »

Hab mich auf dich verlassen :evil: :mrgreen:
Signatur und so
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [ ERLEDIGT ] Zweites Fenster gibt den Fokus nicht mehr h

Beitrag von udg »

Im Fenster 30604272 wurde 'Schließen' gedrückt.
PB_Any reitet ganz schön hoch :mrgreen:

Danke für die ausführliche Erklärung
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Antworten