Seite 1 von 1

Wann wird die linke Maustaste losgelassen?

Verfasst: 26.04.2013 19:30
von uweb
Hallo,

gibt es eine Möglichkeit festzustellen, wann die linke Maustaste über einem anderen Gadget losgelassen wird nachdem sie über dem Button gedrückt wurde?

Um eventuelle Fragen schon vorab zu beantworten :
Ja, es macht Sinn. MC soll ein senkrechtes Bedienfeld (ähnlich einer Toolbar) mit integriertem Splitter der nur auf TV und MCT wirkt werden.
TL und MC sollen ihre feste Breite behalten.
Nein, ich habe nicht Informatik studiert und habe auch kein Interesse an irgendwelchen Paradigmen.

Für echte Hilfe wäre ich aber sehr dankbar!

Mit dem Splittergadget habe ich es schon probiert. Da kann ich die Größe von TL und MC zwar wieder zurücksetzen, aber währender der Größenänderung sieht es hässlich aus.
Eine Crossplatform-Lösung wäre toll. Win-API würde mir aber auch schon weiterhelfen.

Danke im voraus!

Code: Alles auswählen

Procedure WinCallback (hWnd, uMsg, wParam, lParam)   
  Select uMsg
    Case #WM_LBUTTONDOWN   : SetWindowTitle(0,"WinCallback - Left Button Down")
    Case #WM_LBUTTONUP     : SetWindowTitle(0,"WinCallback - Left Button Up")
  EndSelect     
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

OpenWindow(0, 75, 14, 664, 400, "Test",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
TL = StringGadget  (#PB_Any,   0,  0,  32, 200, "TL")
TV = StringGadget  (#PB_Any,  32,  0, 300, 200, "TV")

MC = StringGadget  (#PB_Any, 332, 32, 32, 136, "MC")
BO = ButtonGadget  (#PB_Any, 332,  0, 32,  32, "--")
MCT = StringGadget  (#PB_Any, 364,  0,300, 200, "MCT")
;BU = ButtonGadget  (#PB_Any, 332,168, 32,  32, "|")

U = StringGadget(#PB_Any, 0,200, 664, 200, "unten")


SetWindowCallback(@WinCallback())

Repeat
  Event = WaitWindowEvent()
  
  Select Event
      
    Case #WM_LBUTTONDOWN           : SetWindowTitle(0,"WaitWindowEvent - Left Button Down")
    Case #PB_Event_LeftClick       : SetWindowTitle(0,"WaitWindowEvent - Left Button Up")
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case BO : SetWindowTitle(0,"BO")
      EndSelect
      
  EndSelect
Until Event = #PB_Event_CloseWindow

Re: Wann wird die linke Maustaste losgelassen?

Verfasst: 26.04.2013 19:50
von NicTheQuick
Ich verstehe nicht, was du jetzt haben willst. Du willst einen Event, das dir sagt, auf welchem Gadget die linke Maustaste gedrückt wurde und auf welchem sie wieder losgelassen wurde? Das interpretiere ich zumindest aus deiner ersten Frage.

Bei dem Rest mit dem Splittergadget und den Größen, usw. verstehe ich aber nicht, was du mir sagen willst.

Re: Wann wird die linke Maustaste losgelassen?

Verfasst: 26.04.2013 20:16
von uweb
Zunächst einmal : Danke für deine schnelle Reaktion.

Ich will bei dem Beispiel oben einen Event, der mir sagt, wann oder wo genau (wo genau kann ich bei 'wann' anhand der Mausposition auch selbst bestimmen - hoffe ich).
Die genau Position brauche ich um die Größe von TV und MC entsprechend zu ändern - nur wenn die linke Maustaste auf dem Button gedrückt wurde.
Alle anderen Gadget werden voraussichtlich Standard sein.

Perfekt wäre es natürlich wenn ich die genaue Position von LBUTTONDOWN und LBUTTONUP hätte.

Ich habe zwar zunächst mit dem SplitterGadget experimentiert, aber nun gefällt mir mein Plan-B (die Lösung mit dem Button) nicht nur optisch besser. Den Button trifft man einfach leichter mit der Maus.

Was ich mit dem SplitterGadget gemeint habe :
Ich kann nicht verhindern, dass der Anwender den Splitter zwischen BL und BR benutzt. Ich kann nur die Größe von BL zurücksetzen. Während er den Splitter zieht sieht es aber nicht so toll aus.

Code: Alles auswählen

OpenWindow(#PB_Any, 75, 14, 600, 400, "Splitter Gadget basiert auf Beispiel von va!n", #PB_Window_SystemMenu)


BL = StringGadget  (#PB_Any,   0,  0, 300, 200, "BL")
BR = StringGadget  (#PB_Any, 300,  0, 300, 200, "BR")
Splitter1   = SplitterGadget(#PB_Any,  10, 10, 280, 280, BL, BR, #PB_Splitter_Vertical|#PB_Splitter_FirstFixed)


CL = StringGadget  (#PB_Any,   0,  0, 300, 200, "CL")
CR = StringGadget  (#PB_Any, 300,  0, 300, 200, "CR")
Splitter2   = SplitterGadget(#PB_Any, 310, 10, 280, 280, CL, CR, #PB_Splitter_Separator|#PB_Splitter_Vertical|#PB_Splitter_Separator )


Splitter3   = SplitterGadget(#PB_Any, 10, 10, 600-20, 200-20, Splitter1, Splitter2, #PB_Splitter_Separator|#PB_Splitter_Vertical)


U = StringGadget(#PB_Any,   0, 0, 300, 200, "unten")
Splitter4   = SplitterGadget(#PB_Any, 10, 10, 600-20, 400-20, Splitter3, U, #PB_Splitter_Separator)     




SetGadgetAttribute(Splitter1, #PB_Splitter_FirstMinimumSize, 32)
SetGadgetState(Splitter1, 32)
SetGadgetAttribute(Splitter2, #PB_Splitter_FirstMinimumSize, 32)
SetGadgetState(Splitter2, 32)




Repeat
  Event = WaitWindowEvent()
  
  Select Event
      
    Case #PB_Event_SizeWindow
      ResizeGadget(BL, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case Splitter1 : SetGadgetState(Splitter1, 32)
        Case Splitter2 : SetGadgetState(Splitter2, 32)
        Case Splitter3 : SetGadgetState(Splitter1, 32) : SetGadgetState(Splitter2, 32)
      EndSelect
      
      
  EndSelect
Until Event = #PB_Event_CloseWindow


End


edit:

Wahrscheinlich schreibe ich zuviel. Einfach und allgemein:

Ich brauche die Position von LBUTTONDOWN und LBUTTONUP wenn ein Anwender über einem Button die Maustaste drückt und sie über einem anderen Gadget loslässt.

PS
Meine Freundin ist gerade gekommen. Es ist also kein Desinteresse wenn ich heute nicht mehr online bin.

Re: Wann wird die linke Maustaste losgelassen?

Verfasst: 26.04.2013 22:31
von jojo1541
im Prinzip musst du dafür nur die Mausposition abfragen, wenn das Event ausgelöst wird. Über welchem Gadget das ist, lässt sich dann leicht herausfinden.

Code: Alles auswählen

Case #WM_LBUTTONDOWN           : SetWindowTitle(0,"WaitWindowEvent - Left Button Down" + " X: " + Str(WindowMouseX(0)) + " Y: " + Str(WindowMouseY(0)))
Case #WM_LBUTTONUP       : SetWindowTitle(0,"WaitWindowEvent - Left Button Up" + " X: " + Str(WindowMouseX(0)) + " Y: " + Str(WindowMouseY(0))) 

Re: Wann wird die linke Maustaste losgelassen?

Verfasst: 26.04.2013 22:47
von Josh
jojo1541 hat geschrieben:im Prinzip musst du dafür nur die Mausposition abfragen, wenn das Event ausgelöst wird. Über welchem Gadget das ist, lässt sich dann leicht herausfinden.

Code: Alles auswählen

Case #WM_LBUTTONDOWN           : SetWindowTitle(0,"WaitWindowEvent - Left Button Down" + " X: " + Str(WindowMouseX(0)) + " Y: " + Str(WindowMouseY(0)))
Case #WM_LBUTTONUP       : SetWindowTitle(0,"WaitWindowEvent - Left Button Up" + " X: " + Str(WindowMouseX(0)) + " Y: " + Str(WindowMouseY(0))) 
So leicht ist das nicht. Mit SetWindowCallback bekommst du nur einen Callback auf das Fenster und nicht auf die darauf plazierten Gadgets. Folgende zwei Möglichkeiten fallen mir ein:
  • Mit #WM_COMMAND kannst du über das HiWord von wParam eine #BN_CLICKED Nachricht abfragen. Ob das für uweb reicht, weiß ich momentan nicht.
  • Einen eigenen Hook auf das Buttongadget setzen

Re: Wann wird die linke Maustaste losgelassen?

Verfasst: 27.04.2013 04:07
von uweb
Du meinst etwa so?

Code: Alles auswählen

Procedure WindowCallback(hWnd, uMsg, wParam, lParam)
  
  Select uMsg
    Case #WM_COMMAND
     
      Select wParam>>16 & $ffff
        Case #BN_CLICKED
          Debug "Clicked item "+Str(wParam&$ffff)
      EndSelect 
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Auf die Art bekomme ich auch nur ein Ergebnis wenn LBUTTONDOWN und LBUTTONUP auf dem gleichen Gadget statt finden. So wie von 'Case BO'.

Mit Hook meinst Du vermutlich SetWindowsHookEx?
Mit anderen Hooks habe ich mich kürzlich erst wieder beschäftigt. Ich habe sogar einen zum Laufen gebracht. Aber bisher habe ich noch keinen bei dem der Virenscanner nicht Alarm schlägt.

Durch deinen Tipp bin ich aber voran gekommen. Danke!

Code: Alles auswählen

Procedure HookMouse(nCode, wParam, lParam)
  Static Start.l
  If nCode < 0
    ProcedureReturn CallNextHookEx_(HookMouse, nCode, wParam, lParam)
  EndIf
   *MOUSESTRUCT.MOUSEHOOKSTRUCT = lParam
   *position.POINT=*MOUSESTRUCT\pt
   Select wParam
        Case #WM_MOUSEMOVE
            If Start
              ; Splitter aktiv => die Größe der Nachbargadgets ändern
            EndIf
         Case #WM_LBUTTONDOWN
            Start=1
            Debug *position\x ; leider nur Bildschirmkoordinaten - keine Fensterkoordinaten
            Debug *position\y
           
         Case #WM_LBUTTONUP
            Start=0
            Debug *position\x
            Debug *position\y
   EndSelect
   ProcedureReturn CallNextHookEx_(HookMouse, nCode, wParam, lParam)
EndProcedure 



OpenWindow(0, 75, 14, 664, 400, "Test",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
lpdwProcessId = GetWindowThreadProcessId_(WindowID(0), @processus)          
HookMouse=SetWindowsHookEx_(#WH_MOUSE   , @HookMouse(), 0, lpdwProcessId)   
TL = StringGadget  (#PB_Any,   0,  0,  32, 200, "TL")
TV = StringGadget  (#PB_Any,  32,  0, 300, 200, "TV")

MC = StringGadget  (#PB_Any, 332, 32, 32, 136, "MC")
BO = ButtonGadget  (#PB_Any, 332,  0, 32,  32, "--")
MCT = StringGadget  (#PB_Any, 364,  0,300, 200, "MCT")
;BU = ButtonGadget  (#PB_Any, 332,168, 32,  32, "|")

U = StringGadget(#PB_Any, 0,200, 664, 200, "unten")


Repeat
  Event = WaitWindowEvent()
  
  Select Event
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case BO : Debug "BO"
        Case U  : Debug "unten"
          
      EndSelect
  EndSelect      

Until Event = #PB_Event_CloseWindow

UnhookWindowsHookEx_(HookMouse) 

Re: Wann wird die linke Maustaste losgelassen?

Verfasst: 27.04.2013 09:40
von uweb
Die perfekte Lösung hat idle im englischen Forum gepostet : http://www.purebasic.fr/english/viewtop ... =5&t=54493