Maustaste gedrückt halten - gelöst (auf viele Arten ;)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Maustaste gedrückt halten - gelöst (auf viele Arten ;)

Beitrag von benpicco »

Wie kann ich abfragen, ob die Maustaste gedrückt ist (Also wie Mousebutton(x) unter DirectX, aber eben im Fenster, über einem Gadget)
Zuletzt geändert von benpicco am 21.04.2006 01:33, insgesamt 1-mal geändert.
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

für windows

Code: Alles auswählen

GetAsyncKeyState_(#VK_LBUTTON)
liefert für gedrückt halten nen anderen wert als für gerade gedrückt.

(ich glaub, -32767 bei der ersten abfrage und 32768 bei weiteren abfragen)


[edit]
yup...

Code: Alles auswählen

Repeat

a = GetAsyncKeyState_(#VK_LBUTTON)

If a <> b
    Debug a
    b=a
EndIf

ForEver
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Ah, danke! :)
edit:
MSDN hat geschrieben:[...]If the most significant bit is set, the key is down[...]
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nimm lieber #WM_LBUTTONDOWN.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Nein, das hat doch den selben effekt wie #PB_EventType_LeftClick
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

benpicco hat geschrieben:
MSDN hat geschrieben:[...]If the most significant bit is set, the key is down[...]
das ist dann die -32767
(= #WM_LBUTTONDOWN = #PB_EventType_LeftClick)

gedrückt halten ist das "second significant"

...is wohl die frage, was man unter 'key is down' versteht...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

  global old
  procedure wndproc(hwnd,msg,wp,lp)
    
    IF msg = #WM_LBUTTONDOWN
      DEBUG "DOWN"
    Endif 
    
    ProcedureReturn CallWindowProc_(old,hwnd,msg,wp,lp)
  EndProcedure

  *hWindow.long = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,400,400,"")
  
  CreateGadgetList(*hWindow\l)
  *con.long = ContainerGadget(#pb_any,10,10,200,200,#PB_Container_Single)
  
  old = SetWindowLong_(*con\l,#GWL_WNDPROC,@wndproc())
 
  Repeat
  Until  WaitWindowEvent() = #WM_CLOSE
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

kann ich nicht testen, da 4.0


[edit]

gibts keine einfachere einbindung für #WM_LBUTTONDOWN?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Also der code von hallodri tut bei mir auch nichts anderes, als "DOWN" in dem Moment auszugeben, wen ich die Taste drücke, was ich will ist sowas:

Code: Alles auswählen

Repeat
  wert=GetAsyncKeyState_(#VK_LBUTTON)
  If PeekB(@wert+1)
    Debug "DOWN"
  EndIf
  Delay(20)
Until 0
dagegen hallodri´s code in 3.94:

Code: Alles auswählen

  Global old 
  Procedure wndproc(hwnd,msg,wp,lp) 
    
    If msg = #WM_LBUTTONDOWN 
      Debug "DOWN" 
    EndIf 
    
    ProcedureReturn CallWindowProc_(old,hwnd,msg,wp,lp) 
  EndProcedure 
  
  *hWindow.LONG = OpenWindow(#PB_Any,100,100,400,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"") 
  
  CreateGadgetList(*hWindow\l) 
  *con.LONG = ContainerGadget(#PB_Any,10,10,200,200,#PB_Container_Single) 
  
  old = SetWindowLong_(*con\l,#GWL_WNDPROC,@wndproc()) 
  
  Repeat 
  Until  WaitWindowEvent() = #WM_CLOSE 
(Setzt scheinbar eine WndProc für das Containergadget und fängt die #WM_LBUTTONDOWNNachrichten für dieses ab. Aber das habe ich doch gar nicht gewollt ;) )
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Sorry , habe mal wieder voellig verpeilt das es sich hier um das
Anfaenger Forum handelt.

Code: Alles auswählen

  global old.l
  global lb.l
  
  procedure wndproc(hwnd,msg,wp,lp)
    
    
    IF msg = #WM_LBUTTONDOWN
      lb = 1
    Endif
    
    IF msg = #WM_LBUTTONUP
      lb = 0
    Endif
    
    ProcedureReturn CallWindowProc_(old,hwnd,msg,wp,lp)
  EndProcedure
  
  *hWindow.long = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,400,400,"")
  
  CreateGadgetList(*hWindow\l)
  *con.long = ContainerGadget(#pb_any,10,10,200,200,#PB_Container_Single)
  
  old = SetWindowLong_(*con\l,#GWL_WNDPROC,@wndproc())
  
  Repeat
    debug lb
  Until  WaitWindowEvent(10) = #WM_CLOSE 
Antworten