Seite 1 von 1

Fenster ist Aktiv...

Verfasst: 28.02.2013 21:41
von irobot
Guten Tag allerseits,

Ich hab' da mal eine Frage:

Wenn ein kleines "Nebenfenster" im Programm nicht aktiv ist (also bei XP z.B. oben die Leiste nicht blau ist), und man mit dem Mauszeiger oben auf diese Leiste geht und den Mauszeiger runterklickt und unten festhält, wird diese Leiste blau, jedoch ich finde kein event was ich mittels WaitWindowEvent() packen könnte.

Erst wenn ich den Mauszeiger über diese blau gewordene Leiste los lasse, wird ein event ausgelöst, nämlich #PB_Event_ActivateWindow

Gehe ich mit dem Mauszeiger über ein Gadget (Textfeld, Button, ...) eines nicht aktiven Fensters und klicke mit dem Mauszeiger auf ein solches Gadget und halte den Mauszeiger unten, wird ein event ausgelöst, nämlich #PB_Event_Gadget und die Leiste wird natürlich blau.

Wie krieg ich dieses event zu packen, das schon beim runterklicken auf die graue und dann blau werdende Leiste "auslöst" ?

Nein, ich hab kein XP mehr und arbeite mir PB 5.0

Danke im voraus für eure Hilfe !

Grüsse
irobot
-----------------------
http://www.der-prozess.de

[color=#FF0000][i]Verschoben von Allgemein nach Anfänger von NicTheQuick[/i][/color]

Re: Fenster ist Aktiv...

Verfasst: 28.02.2013 22:26
von edel
Unter Windows kannst du folgendes versuchen :

Code: Alles auswählen

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure Callback(hWnd, Msg, wParam, lParam)
	
	If Msg = #WM_MOUSEACTIVATE
		
		If lParam & $FFFF = #HTCAPTION
			Debug "Activate"
		EndIf		
		
	EndIf	
	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure start()
	Protected window
	Protected event
	
	window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 250, 120, "")
	
	SetWindowCallback(@Callback(), window)
	
	While #True
		
		event = WaitWindowEvent()
		
		Select event					
			Case #PB_Event_CloseWindow : Break
			Case #PB_Event_SizeWindow
			Case #PB_Event_Gadget		
			Case #PB_Event_Menu					
		EndSelect		
		
	Wend	
	
EndProcedure:End start()

Re: Fenster ist Aktiv...

Verfasst: 28.02.2013 23:17
von irobot
Hallo Edel,

danke erstmal für deine Hilfe ! (ich habe nicht viel verstanden...)

Was ist das was ich da aufrufe ?

Wie kann ich der Prozedur "Callback(hWnd, Msg, wParam, lParam)" mitteilen, dass z.B. Window Nr. 12 gerade angeklickt wurde ? Oder Window Nr. 9 ?

Was kann ich mit "#PB_ProcessPureBasicEvents" machen ?

Grüsse
irobot

Re: Fenster ist Aktiv...

Verfasst: 02.03.2013 14:21
von edel
Jedes Fenster (egal ob Gadget oder Fenster) hat eine interne Funktion, in der steht was das Fenster
ueberhaupt machen soll. Um an die Nachrichten von diesem Fenster zu kommen, muss man die eigene
Funktion vor die Fensterfunktion "schieben". Das passiert hier mit Hilfe von SetWindowCallback().
Damit das Fenster aber nicht seine eigentliche Aufgabe verliert, gibt man hier noch
PB_ProcessPureBasicEvents mit an. Das sagt der Funktion, dass die Nachricht auch an die Funktion
darueber geschickt werden soll.

Der hWnd Parameter in dem Callback ist dein Fensterhandle, also das was du bekommst wenn du
WindowID() benutzt. Um deine PBNummer wieder zurueckzukommen kannst du diese vorher speichern,
oder weitere API Befehle benutzen.

Code: Alles auswählen

Global NewMap WindowHandleMap.i()

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure Callback(hWnd, Msg, wParam, lParam)
   
   If Msg = #WM_MOUSEACTIVATE
      
      If lParam & $FFFF = #HTCAPTION
         Debug "Activate : " + Str(WindowHandleMap(Str(hWnd)))
      EndIf      
      
   EndIf   
   
   ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure start()
   Protected window
   Protected event
   
   OpenWindow(0, #PB_Ignore, #PB_Ignore, 250, 120, "0")
   OpenWindow(1, #PB_Ignore, #PB_Ignore, 250, 120, "1")
   OpenWindow(2, #PB_Ignore, #PB_Ignore, 250, 120, "2")
   
   WindowHandleMap(Str(WindowID(0))) = 0
   WindowHandleMap(Str(WindowID(1))) = 1
   WindowHandleMap(Str(WindowID(2))) = 2
   
   SetWindowCallback(@Callback(), 0)
   SetWindowCallback(@Callback(), 1)
   SetWindowCallback(@Callback(), 2)
   
   While #True
      
      event = WaitWindowEvent()
      
      Select event               
         Case #PB_Event_CloseWindow : Break
         Case #PB_Event_SizeWindow
         Case #PB_Event_Gadget      
         Case #PB_Event_Menu               
      EndSelect      
      
   Wend   
   
EndProcedure:End start()

Re: Fenster ist Aktiv...

Verfasst: 03.03.2013 01:37
von Bisonte
Wenn das Fenster mit PB erstellt wurde, bekommt man die Fensternummer auch mit

Code: Alles auswählen

Result = GetProp_(hWnd, "PB_WINDOWID") - 1
zurück. So braucht man keine Listen,Maps oder sonstige Speicherungen vornehmen.
Wenn Result = -1 ist, so ist das Window nicht mit PB OpenWindow() erstellt worden und trägt somit
dieses Property nicht mit sich rum.

Re: Fenster ist Aktiv...

Verfasst: 03.03.2013 09:48
von irobot
Danke erstmal an euch allen !

fühle mich ein wenig wie ein Fahrschüler in der zweite Fahrstunde, dem gerade erklärt wurde, wie man mit Heckantrieb und Differentialsperre ein Driftwinkel von 30° hinkriegt.

Aber trotzdem, ich weiss jetzt ungefähr, wie ich es anpacken muss...

Grüsse
irobot
--------------------
www.der-prozess.de