Fensterfocus bei Mouseover

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Fensterfocus bei Mouseover

Beitrag von Lukaso »

Hallo,

ich bräuchte Hilfe, ich möchte, dass wenn ich auf ein Fenster mit der Maus fahr, dass nicht Aktiviert ist, dieses dann fokusiert wird. Wenn die Maus wieder aus dem Fenster herausfährt (OnMouseOut), dass alte Fenster wieder seinen Fokus zurückbekommt!

Danke für Hilfe, Tips, Codeschnippsel :allright:

MFG Lukaso
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
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

Beitrag von NicTheQuick »

Den ersten Teil deiner Frage kann ich direkt beantworten mit folgendem Code.

Code: Alles auswählen

Procedure IsMouseOverGadget(Gadget) ; Gibt #True zurück, wenn die Maus über dem Gadget ist
  Protected Mouse.POINT, GadgetRect.RECT
  GetWindowRect_(GadgetID(Gadget), GadgetRect)
  GetCursorPos_(Mouse.POINT)
  If Mouse\x >= GadgetRect\left And Mouse\x <= GadgetRect\right And Mouse\y >= GadgetRect\top And Mouse\y <= GadgetRect\bottom
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure
Mit dieser Funktion kannst ja dann den Rest alleine machen. :wink:
pLuSmaN
Beiträge: 10
Registriert: 11.09.2004 12:32

Beitrag von pLuSmaN »

Code: Alles auswählen

hWnd = OpenWindow (0, 0, 0, 100, 100, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Test")

Repeat
  EventID = WaitWindowEvent ()

  Select EventID
    Case #WM_MOUSEMOVE ; Die Maus hat sich bewegt, Fenster MUSS keinen Focus haben
      Debug "Maus bewegt sich über das Fenster"
      ; If fCapture <> #True
      ;   AltesFenster = GetFocus_ ()
      ;   SetCapture_ (hWnd)
      ;   fCapture = #True
      ; Else
      ;   If IsMouseOverGadget (hWnd) <> #True
      ;     SetFocus_ (AltesFenster)
      ;     fCapture = #False
      ;     ReleaseCapture_ ()
      ;   EndIf
      ; EndIf
  EndSelect
Until EventID = #PB_Event_CloseWindow

End
Sobald die Maus über das Fenster fährt wird eine Nachricht des Typs #WM_MOUSEMOVE gesendet. Auch wenn das Fenster keinen Focus hat.
In dem Abschnitt kannst du also den Focus auf dein Fenster setzen.
Habe leider schon lange kein PB mehr gemacht, kann man daher auch vllt. anders effizienter lösen, aber es sollte auf jeden Fall funktionieren.

Der auskommentierte Teil wurde grade hier zusammen geklatscht und kann daher Fehler aufweisen. Ich regel dort nur, dass wenn die Maus nicht mehr im Fenster ist, das Alte wieder den Focus bekommt.

Ist evtl. etwas schlampig programmiert, aber man sollte doch grob erkennen, wie es läuft.

MfG pLuSmaN
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Hallo,

Danke für eure Hilfe! :allright:
Habe es jetzt hinbekommen, aber ich habe jetzt nen neues Problem:

Wenn ich beim Aktivierten Window, jetzt einen FileRequester auf mache, wird diese Minimiert ...

Hier nen Sourceschnippsel:

Code: Alles auswählen

      If fCapture = #False And MouseOverWindow(#Player_Window) = #True
        oldWindow = GetForegroundWindow_()
        ForceFore(WindowID(#Player_Window))
        fCapture = #True
      ElseIf fCapture = #True And MouseOverWindow(#Player_Window) = #False
        ForceFore(oldWindow)
        fCapture = #False
      EndIf
MFG Lukaso
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Antworten