Seite 1 von 1

On Mouse Over Event für Gadgets

Verfasst: 01.05.2005 08:51
von PAMKKKKK
Hi Folks!

Ich habe da mal ein onMouseOver event für Gadgets entwickelt.
Ist nebenbei auch ein scherzprogramm.

Wers verbessern will... nur ran!

Code: Alles auswählen

;******************************************************************************
; On mouse Over Demo
; Peter Kriegel http://www.network-gui.de 30.April.2005
; if the code is selfexplaining in englisch, i  use the German explanation only
;
; Demonstrate how you get easy an "on Mouse over" event from a Gadget
; only for Gadgets wich are rectangular 
; Demonstriert wie man leicht ein On Mouse Over ereignis (event) von einem Gadget bekommt
; nur für Gadgets die rechteckige werte liefern
;******************************************************************************

;Procedure delivers 1 if the Mouse is ove the Gadget and 0 if is not
;Prozedur liefert 1 wenn die Maus über dem Gadget ist und 0 wenn nicht
;******************************************************************************
Procedure.b onMouseOver(GadgedNr)
  X = GadgetX(GadgedNr) ; queries Gadget X erfragen
  Y = GadgetY(GadgedNr) ; queries Gadget Y erfragen
  Mx = WindowMouseX() ; queries Mouse X erfragen
  My =WindowMouseY() ; queries Mouse Y erfragen
  ; in the if, i do the rectangular calculation and the compare with the Mousecoordinates
  ; in der if abfrage wird das Rechteckberechnet und mit den Mausekoordinaten verglichen
  ; GadgetWidth(GadgedNr) Gadget Breite erfragen / GadgetHeight(GadgedNr) Gadget Höhe erfragen
  If Mx > X And Mx < (X + GadgetWidth(GadgedNr)) And My > Y And My < (Y + GadgetHeight(GadgedNr) )
    ProcedureReturn 1 ; Mouse is over the Gadget ; Maus ist über dem Gadget
  EndIf
  ProcedureReturn 0 ; Mouse is not over the Gadget ; Maus ist nicht über dem Gadget
EndProcedure
;******************************************************************************
; begin Create Window and Gadgets ; Beginn Fenster und Gadgets erstellen
If OpenWindow(1, 216, 0, 260, 135,  #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_Invisible , "On Mouse over Demo")
  If CreateGadgetList(WindowID())
    ButtonGadget(1, 30, 80, 50, 25, "No")
    ; Paint first Image vor the Yes Button ; Das erste Bild für den Yes Knopf malen
    If CreateImage(1, 45, 20)
      If StartDrawing(ImageOutput()) ; das malen Starten
        DrawingMode(1)
        Box(0, 0, 45, 20 ,RGB($EC,$E9,$D8))
        Locate(10, 3) 
        DrawText("Yes")
        StopDrawing(); dont forget !!  ; das malen Stoppen nicht vergessen !!
      EndIf
      ; Paint second Image vor the Yes Button ; Das zweite Bild für den Yes Knopf malen
      If CreateImage(2, 45, 20)
        If StartDrawing(ImageOutput()) ; das malen Starten
          DrawingMode(1)
          Box(0, 0, 45, 20 ,RGB($0,$80,$FF))
          Locate(5, 3) 
          DrawText("Sure?")
          StopDrawing(); dont forget !!  ; das malen Stoppen nicht vergessen !!
        EndIf
      EndIf
    ButtonImageGadget(2, 100, 80, 50, 25, UseImage(1))  ; the Yes Button ; Der Yes Knopf
    EndIf
    TextGadget(3,30,20,200,20,"Haben Sie einen kleinen Penis ?",#PB_Text_Center)
    TextGadget(4,30,50,200,20,"Do you have a tiny dick ?",#PB_Text_Center)
  EndIf
EndIf
HideWindow(1,0)
; end Window stuff + Gadget ; Ende Fenster + Gadget  
;******************************************************************************
toggle = 0 ; Position switch Variable for Jumping Button ; Position Schalt Variable für den Springenden Knopf
  Repeat 
    EventID = WaitWindowEvent() 
    If EventID <> 0 ; is true every Window event ; wird bei jedem Fensterereignis ausgeführt
      If onMouseOver(1) ; If the Mouse is over the Gadget1  then .... ; Wenn die Mause über dem Gadget1 ist dann .... 
        If toggle ; .... let the button1 jump ; .... lass den Knopf1 springen
          ResizeGadget(1,GadgetX(1) - 140 ,-1,-1,-1) ; move the Button in X - 200 ; verschiebe den Knopf in X - 200
          ;UpdateWindow_(WindowID(1)) ; winAPI perhapst needed, on winXP not ; winAPI vieleicht nötig, auf winXP nicht
          toggle = 0
        Else
          ResizeGadget(1,GadgetX(1) + 140 ,-1,-1,-1); move the Button in X + 200 ; verschiebe den Knopf in X + 200
          ;UpdateWindow_(WindowID(1)) ; winAPI perhapst needed, on winXP not ; winAPI vieleicht nötig, auf winXP nicht
          toggle = 1        
        EndIf
      EndIf
      If onMouseOver(2) ; If the Mouse is over the Gadget2  then .... ; Wenn die Mause über dem Gadget2 ist dann .... 
        SetGadgetState(2,UseImage(2)) ; .... use Image2 for the button2 .... ; .... benutze das Image2 für den Knopf2....
      Else
        SetGadgetState(2,UseImage(1))  ; .... else use Image1 for the button2 ; .... sonnst benutze das Image1 für den Knopf2
      EndIf
    EndIf
    Select EventID ; remainig Window event ; die restlichen Fensterereignisse
    Case #PB_Event_CloseWindow
      ;End ; The Window doesn´t close on this event !!; Das Fenster wird hier nicht geschlossen!!
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case 2 ; if Button Yes is Pressed ; Wenn der Yes Knopf gedrückt wurde
          MessageRequester("Poor Boy!!", "Armer Junge!!", #MB_OK|#MB_ICONWARNING)
          End ; here ends all ;Und alles zuende
      EndSelect
  EndSelect
ForEver
End
Have Phun !!

Verfasst: 01.05.2005 13:24
von Hroudtwolf
Wie wärs damit ?

Code: Alles auswählen

Procedure IsMouseOverGadget(gadget.l) 
    wnd.l=GadgetID(gadget.l)
    GetWindowRect_(wnd,re.RECT) 
    re\Left = re\left 
    re\top  = re\top 
    re\right  = re\right 
    re\bottom  = re\bottom 
    GetCursorPos_(pt.POINT) 
    Result = PtInRect_(re,pt\x,pt\y) 
    ProcedureReturn Result 
EndProcedure 

Verfasst: 01.05.2005 13:36
von DarkDragon
Kleiner Tipp: Drückt Tab bis "No" ausgewählt ist und dann drückt die Leertaste.

HAHA

Verfasst: 01.05.2005 13:54
von Green Snake
cooler tipp mit dem man das programm austricksen kann :allright:
dan braucht man sich nicht bloszustellen :mrgreen: :D :lol:

Verfasst: 01.05.2005 15:11
von Danilo
Hroudtwolf hat geschrieben:Wie wärs damit ?

Code: Alles auswählen

Procedure IsMouseOverGadget(gadget.l) 
    wnd.l=GadgetID(gadget.l)
    GetWindowRect_(wnd,re.RECT) 
    re\Left = re\left 
    re\top  = re\top 
    re\right  = re\right 
    re\bottom  = re\bottom 
    GetCursorPos_(pt.POINT) 
    Result = PtInRect_(re,pt\x,pt\y) 
    ProcedureReturn Result 
EndProcedure
Was haben diese Zeilen für einen Sinn?

Code: Alles auswählen

    re\Left = re\left 
    re\top  = re\top 
    re\right  = re\right 
    re\bottom  = re\bottom
Macht IMHO keinen Sinn.

Kürzer:

Code: Alles auswählen

Procedure IsMouseOverGadget(gadget.l) 
    wnd.l=GadgetID(gadget)
    If wnd
      GetWindowRect_(wnd,re.RECT)
      GetCursorPos_(pt.POINT) 
      ProcedureReturn PtInRect_(re,pt\x,pt\y)
    EndIf
EndProcedure

Das onMouseOver() von PAMKKKKK kommt allerdings ohne WinAPI aus.

Schöne diskusion

Verfasst: 01.05.2005 19:28
von PAMKKKKK
Das mit dem austricksen ist nicht gewollt :cry:

Aber ohne winAPI auszukommen das ist gewollt!

Wenn man in meiner Prozedur die Kommentare weglässt, ist die auch noch kürzer :wink:

Schöne diskusion hier..... :allright:

Frage

Verfasst: 09.06.2005 21:04
von Tobi
Jo, Leute

ich hab da ein Problem:

Ich nehme ein ImageGadget mit einem Icon. Bei Mouseover ändert sich auch das Bild. Nur: Wenn ich auf das Gadget klicke, führt das Programm den Code sofort aus, obwohl ich die Maustaste noch nicht losgelassen habe. Mit EventType() geht's auch nicht! Seltsamerweise aber, wenn ich mit der rechten Maustaste klicke. :(

Ich hoffe hier kann mir jemand helfen, der das Problem schon gelöst hat![/i]

Verfasst: 10.06.2005 10:48
von PAMKKKKK
@ Tobi

Ich habe ebend mal mein Programm ausprobiert (Das im Tread ganz Oben ).
Bei mir ist das nicht so! Ich kann sogar die Maus bei gedrückter Taste aus dem Gadget ziehen und so den Klick abbrechen.

Wenn dein gesammter Code zu gross ist, dann Poste mal deine Event schleife (WaitWindowEvent oder WindowEvent)

Verfasst: 10.06.2005 20:45
von Tobi
Nun, ich nehm aber ein ImageGadget, damit ich keine Ränder habe. Nicht so im deinem Code, da ist es ja ein ImageButtonGadget.

Verfasst: 12.06.2005 16:56
von PAMKKKKK
@ Tobi

Ich bin selber Pure-Anfänger deshalb nur tips.....

Dein Grundproblem ist, das du die Funktionen Left_Mouse_button_down und Left_Mouse_button_up, über deinem Bild Abfragen musst damit du einen gültigen Mausklick erhältst (nur beide zusammen ergeben einen gültigen Klick).
Deshalb musst du sie beide in deiner event-schleife abfragen.
In PB heissen die Beiden für Windows:
#WM_LBUTTONDOWN
#WM_LBUTTONUP

Dann müsstest du aber auch überwachen ob die Maus zwischen dem Down-event und UP-event dein Gadget verlassen hat (Ungültiger Klick!).

Kuck mal ob schon in einer alten Diskusion deine lösung steht (Archiv suchen):
http://forums.purebasic.com/german/arch ... get+rahmen
oder
http://forums.purebasic.com/german/arch ... get+rahmen

Es gibt unter
http://www.purearea.net/pb/german/index.htm
jede menge User- Libraries zum Thema Gadgetmanipulation oder Eventhandling.
z.B.
Userlib: EventConnection, FlatGadget, GadAnim, OwnGadget

Diese stellen dir neue PureBasic befehle zur verfügung oder manipulieren die Gadgets.

Bei purearea.net findest du auch das Code Archiv lade dir das runter wenn du dort nach "Maus" oder "ImageGadget" suchst findest du ne menge Beispiele (zum event handling).