Wann wird die linke Maustaste losgelassen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Wann wird die linke Maustaste losgelassen?

Beitrag 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
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: Wann wird die linke Maustaste losgelassen?

Beitrag 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.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Wann wird die linke Maustaste losgelassen?

Beitrag 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.
Zuletzt geändert von uweb am 27.04.2013 09:43, insgesamt 1-mal geändert.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: Wann wird die linke Maustaste losgelassen?

Beitrag 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))) 
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Wann wird die linke Maustaste losgelassen?

Beitrag 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
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Wann wird die linke Maustaste losgelassen?

Beitrag 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) 
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Wann wird die linke Maustaste losgelassen?

Beitrag von uweb »

Die perfekte Lösung hat idle im englischen Forum gepostet : http://www.purebasic.fr/english/viewtop ... =5&t=54493
Antworten