Seite 1 von 1

ExamineMouse() killt Mauszeiger!

Verfasst: 29.10.2006 20:53
von PB42
Hallo,

in folgendem (blöden) Testbeispiel soll die weiße Box immer dann erscheinen, wenn die linke Maustaste gedrückt wird und sich zugleich der Mauszeiger über der schwarzen Fläche befindet. Mit der Funktion Mousebutton(1) klappt das nicht und wenn ich ExamineMouse() einfüge, verschwindet nach dem Starten des Testbeispiels der Mauszeiger komplett vom Bildschirm!!! Der Code:

Code: Alles auswählen

InitSprite()
InitMouse()
OpenWindow(0,0,0,500,550,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
OpenWindowedScreen(WindowID(0), 0, 50, 450, 450, 0, 0, 0)
CreateGadgetList(WindowID(0))

Repeat
Event = WaitWindowEvent(20) 
EventGadget     = EventGadget() 
  
  If Mousebutton(1) And WindowMouseX(0) > 0 And WindowMouseY(0) > 0
  StartDrawing(ScreenOutput())
  Box(50,200,50,200,RGB(220,220,220))
  StopDrawing()
  FlipBuffers()
  Else 
  StartDrawing(ScreenOutput())
  Box(50,200,50,200,RGB(0,0,0))
  StopDrawing()
  FlipBuffers()
  EndIf   

Until event = #PB_Event_CloseWindow
Als Alternative habe ich versucht:

Code: Alles auswählen

InitSprite()
InitMouse()
OpenWindow(0,0,0,500,550,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
OpenWindowedScreen(WindowID(0), 0, 50, 450, 450, 0, 0, 0)
CreateGadgetList(WindowID(0))

Repeat
Event = WaitWindowEvent(20) 
EventGadget     = EventGadget() 
ExamineMouse()   
  
  If event = #WM_lbuttondown And WindowMouseX(0) > 0 And WindowMouseY(0) > 0
  StartDrawing(ScreenOutput())
  Box(50,200,50,200,RGB(220,220,220))
  StopDrawing()
  FlipBuffers()
  Else 
  StartDrawing(ScreenOutput())
  Box(50,200,50,200,RGB(0,0,0))
  StopDrawing()
  FlipBuffers()
  EndIf
   

Until event = #PB_Event_CloseWindow
Geht aber auch nicht, weil dann die weiße Box nur kurz aufblitzt. Wie muß der Code lauten, damit die linke Maustaste erfolgreich eingebunden werden kann? Danke.

Edit: #WM_lbuttondown funktioniert, wenn man bei Event = WaitWindowEvent(20) die 20 aus den Klammern rausläßt, aber mit Mousebutton(1) muß das doch auch irgendwie gehen.

Edit: Ich habe die Fassung PureBasic 4.0
PB42

Verfasst: 29.10.2006 21:12
von Kaeru Gaman
ExamineMouse() ist für den Screenmode.

das zweite ist schon auf dem richtigen weg

> Geht aber auch nicht, weil dann die weiße Box nur kurz aufblitzt.

das ist auch richtig so, weil das Event #WM_lbuttondown
nur im allerersten frame stattfindet, wenn du drückst,
nicht wenn du gedrückt hältst.

du kannst das mit nem Flag lösen:

Code: Alles auswählen

If WindowMouseX(0) > 0       ; genügt, weil -1 wenn zeiger außerhalb
  If event = #WM_lbuttondown 
    Da = 1
  EndIf
  If event = #WM_lbuttonup 
    Da = 0
  EndIf
EndIf

  StartDrawing(ScreenOutput())
    If Da
      Frontcolor($DCDCDC)
    Else
      Frontcolor(0)
    EndIf 
    Box(50,200,50,200) 
  StopDrawing() 
FlipBuffers() 

Verfasst: 29.10.2006 21:21
von PB42
Das klappt. Danke!