D7WS HOMEPAGE WORKSHOP NEUE XTRAS GALERIE WORKSHOP Automatic Translation LESERSERVICE BUCH NEWS

HowTo: 3-State-Buttons

 

 

 

Home
Workshop-Seite

Ein Button, dessen Grafik sich bei Rollover und Mousedown ändern soll – das ist scheinbar eine einfache Übung. Allerdings sind doch einige Eventualitäten zu bedenken: Was soll geschehen, wenn der Anwender zwar auf den Button klickt, dann die Maus aber wegbewegt – und vielleicht doch wieder zurück auf den Button bewegt? Und andersherum: wenn er woanders klickt, aber über dem Button losläßt? Oder wenn sich die Maus über dem Button befindet, wenn der Frame erreicht wird?

Das folgende Behavior enthält das notwendigste Rüstzeug, um ein "typisches" Buttonverhalten mit drei Zuständen (Normal, Gehilitet, Gedrückt) zu erreichen. Folgende Überlegungen sind umgesetzt:

• Wenn der Anwender außerhalb des Buttons das Mousedown erzeugt, interessiert das unseren Button nicht (the stilldown-Abfrage).

• Wenn er auf den Button klickt, dann darf er den Button verlassen und zurückkommen, und auf mouseup wird dann trotzdem die Buttonaktion (domyStuff) ausgelöst.

• Wenn er den Button verläßt und außerhalb ein mouseUp produziert, wird keine Aktion ausgelöst.

• Jedes Verlassen des Buttons setzt seine Grafik in den Nullzustand zurück.




 

 

 

 

property spriteNum, pMousedDown
property m_nl, m_hi, m_dn

on beginSprite me
  pMousedDown = 0
  m_nl = member("nl")
  m_hi = member("hi")
  m_dn = member("dn")
end

on mouseDown me
  pMousedDown = 1
  sprite(spritenum).member = m_dn
end

on mouseUp me
  -- exit falls kein mouseDown:
  if NOT(pMousedDown) then exit
  pMousedDown = 0
  sprite(spritenum).member = m_hi
  updatestage
  domyStuff me
end

on mouseUpOutside me
  pMousedDown = 0
  sprite(spritenum).member = m_nl
end

on mousewithin me
  if not(the stilldown) then
    sprite(spritenum).member = m_hi
  end if
end

on mouseEnter me
  if pMousedDown then
    sprite(spritenum).member = m_dn
  else if not(the stillDown) then
    sprite(spritenum).member = m_hi
  end if
end

on mouseLeave me
  if not(the stillDown) OR pMousedDown then
    sprite(spritenum).member = m_nl
  end if
end

on domyStuff me
  beep
end




 

 

 

 

Anstelle von beep können Sie natürlich auch eine sinnvollere Button-Aktion einsetzen.
Die Button-Darsteller der Werkzeugpalette (Typ #button) verhalten sich übrigens standardmäßig etwas anders. Erst wenn Sie die Systemproperty the buttonstyle = TRUE setzen, sind auch bei diesem Darstellertyp die obigen Anforderungen erfüllt. Ein solches Skript erzeugt einen Button-Darsteller mit Standard-OS-Verhalten:

on beginsprite me
  the buttonstyle = 1
end

on mouseup me
  beep
end

Joachim Gola




 


Directorworkshop.de ist © Joachim Gola & Gerd Gillmaier 1998-2002. Alle Rechte vorbehalten.