Seite 1 von 1

Mousefunktionen im Fenster abfragen...

Verfasst: 01.09.2005 10:14
von Ghosty1967
Hallo wieder mal...

Folgendes Problem...

Ich bastel an einem Proggi , bei dem ich mittels der PBOL den
Skin-Effekt nutze. Dabei werden selbsterstellte Grafiken für die Buttons
verwendet. Nun möchte ich gerne einige Effekte auf die Buttons
anwenden, die da wären...

1. Wenn ich die Maus über eine Grafik (ImageGadget) bewege, soll sich
die Grafik ändern (Hoover-Effekt)
2. Wird die linke Maustaste über der Grafik gedrückt, soll sich die Grafik
ebenfalls ändern.. Allerdings soll noch keine Aktion ausgeführt werden.
3. Beim loslassen der Maustaste, soll ´wiederum die Grafik geändert
werden und eine Aktion soll ausgeführt werden.

Ich vermisse in PB die Möglichkeit der detailierten Mausabfrage wie z.B
in VB. Wie kann man denn in PB abfragen, welche Maustaste gerade
welchen Status hat usw...
Ich habe hier mal einen kleinen Ausschnitt aus dem Proggi abgelegt,
damit man sich eventuell besser in mein Prob reindenken kann.

Code: Alles auswählen

Declare ViewSystemTime()
Declare IsMouseOver(wnd) 

Enumeration
  #WIN_0
  ;Variablen für den Zeichensatzen der 6x11 Pixel Zahlen
  #F6X11_0
  #F6X11_1
  #F6X11_2
  #F6X11_3
  #F6X11_4
  #F6X11_5
  #F6X11_6
  #F6X11_7
  #F6X11_8
  #F6X11_9
  ;Variablen für den Zeichensatzen der 4x7 Pixel Zahlen
  #F4X7_0
  #F4X7_1
  #F4X7_2
  #F4X7_3
  #F4X7_4
  #F4X7_5
  #F4X7_6
  #F4X7_7
  #F4X7_8
  #F4X7_9
   ;Variablen für den "Close" Button (Default, Over, Press)
  #BTN_CLOSE_0
  #BTN_CLOSE_1
  #BTN_CLOSE_2
   ;Variablen für die Image-Gadgets der Zeitanzeige
  #IMG_1
  #IMG_2
  #IMG_3
  #IMG_4
  #IMG_5
  #IMG_6
  #IMG_7
EndEnumeration

;Ab mit den Grafiken in den Speicher...
CatchImage(#F6X11_0, ?FNT6X11_0)
CatchImage(#F6X11_1, ?FNT6X11_1)
CatchImage(#F6X11_2, ?FNT6X11_2)
CatchImage(#F6X11_3, ?FNT6X11_3)
CatchImage(#F6X11_4, ?FNT6X11_4)
CatchImage(#F6X11_5, ?FNT6X11_5)
CatchImage(#F6X11_6, ?FNT6X11_6)
CatchImage(#F6X11_7, ?FNT6X11_7)
CatchImage(#F6X11_8, ?FNT6X11_8)
CatchImage(#F6X11_9, ?FNT6X11_9)
CatchImage(#F4X7_0, ?FNT4X7_0)
CatchImage(#F4X7_1, ?FNT4X7_1)
CatchImage(#F4X7_2, ?FNT4X7_2)
CatchImage(#F4X7_3, ?FNT4X7_3)
CatchImage(#F4X7_4, ?FNT4X7_4)
CatchImage(#F4X7_5, ?FNT4X7_5)
CatchImage(#F4X7_6, ?FNT4X7_6)
CatchImage(#F4X7_7, ?FNT4X7_7)
CatchImage(#F4X7_8, ?FNT4X7_8)
CatchImage(#F4X7_9, ?FNT4X7_9)
CatchImage(#BTN_CLOSE_0, ?BTNCLOSE_0)
CatchImage(#BTN_CLOSE_1, ?BTNCLOSE_1)
CatchImage(#BTN_CLOSE_2, ?BTNCLOSE_2)

If OpenWindow(#WIN_0,1, 1, 300, 24,#PB_Window_BorderLess|#WS_POPUP,"BarClock")
  ;Fensterskin im Hintergrund laden und anzeigen
  SkinWin(WindowID(),CatchImage(0,?BGROUND))
  If CreateGadgetList(WindowID(#WIN_0))
    ;Images der Stundenanzeigen setzen
    ImageGadget(#IMG_0,229,6,6,11,UseImage(#F6X11_0))
    ImageGadget(#IMG_1,236,6,6,11,UseImage(#F6X11_0))
    ;Images der Minutenanzeige setzen
    ImageGadget(#IMG_2,247,6,6,11,UseImage(#F6X11_0))
    ImageGadget(#IMG_3,254,6,6,11,UseImage(#F6X11_0))
    ;Images der Sekundenanzeige setzen
    ImageGadget(#IMG_4,265,10,6,11,UseImage(#F4X7_0))
    ImageGadget(#IMG_5,270,10,6,11,UseImage(#F4X7_0))
    ;Images des Close-Buttons setzen
    ImageGadget(#IMG_6,281,4,14,14,UseImage(#BTN_CLOSE_0))
  EndIf  
EndIf
HideWindow(0,0)
ViewSystemTime()
StartTimer(0,1000,@ViewSystemTime())

Repeat 
  Select WaitWindowEvent()
    Case #WM_LBUTTONDOWN
      ;Bewegen des Fensters auch ohne Titelleiste...
      SendMessage_(WindowID(),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
    Case #PB_Event_Gadget
      Select EventGadgetID()
      Case #IMG_6                 ;Close-Button (ImageGadget) abfragen
        ;Wenn links gedrückt - Grafik ändern in
        ; ==> SetGadgetState(#IMG_6,UseImage(#BTN_CLOSE_2))
        ;Wenn links wieder losgelassen wird - Grafik ändern in
        ; ==> SetGadgetState(#IMG_6,UseImage(#BTN_CLOSE_0))
        ;und das Programm beenden.
        End    
      EndSelect
  Default
    If IsMouseOver(GadgetID(#IMG_6))
      SetGadgetState(#IMG_6,UseImage(#BTN_CLOSE_1))
    Else
      SetGadgetState(#IMG_6,UseImage(#BTN_CLOSE_0))
    EndIf
  EndSelect       
Until EventID = #PB_EventCloseWindow
End
  
Procedure ViewSystemTime()
  sTime.s=FormatDate("%hh:%ii:%ss", Date())
  SetGadgetState(#IMG_0,UseImage(Val(Left(sTime.s,1))+1))
  SetGadgetState(#IMG_1,UseImage(Val(Mid(sTime.s,2,1))+1))
  SetGadgetState(#IMG_2,UseImage(Val(Mid(sTime.s,4,1))+1))
  SetGadgetState(#IMG_3,UseImage(Val(Mid(sTime.s,5,1))+1))
  SetGadgetState(#IMG_4,UseImage(Val(Mid(sTime.s,7,1))+11))
  SetGadgetState(#IMG_5,UseImage(Val(Right(sTime.s,1))+11))
EndProcedure

;Prozedur zur Bestimmung, ob die Maus über einem Object ist
Procedure IsMouseOver(wnd) 
  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

DataSection
;Hintergrundgrafik für den Skin-Effekt
BGROUND:   IncludeBinary "back0.bmp"
;3 Grafiken für den "Close" Button
BTNCLOSE_0: IncludeBinary "btn_close0.bmp"  ;Default)
BTNCLOSE_1: IncludeBinary "btn_close1.bmp"  ;Over
BTNCLOSE_2: IncludeBinary "btn_close2.bmp"  ;Pressed
;Zeichensatz der Zahlen für Stunden und Minuten
FNT6X11_0: IncludeBinary "font6x11_0.bmp"
FNT6X11_1: IncludeBinary "font6x11_1.bmp"
FNT6X11_2: IncludeBinary "font6x11_2.bmp"
FNT6X11_3: IncludeBinary "font6x11_3.bmp"
FNT6X11_4: IncludeBinary "font6x11_4.bmp"
FNT6X11_5: IncludeBinary "font6x11_5.bmp"
FNT6X11_6: IncludeBinary "font6x11_6.bmp"
FNT6X11_7: IncludeBinary "font6x11_7.bmp"
FNT6X11_8: IncludeBinary "font6x11_8.bmp"
FNT6X11_9: IncludeBinary "font6x11_9.bmp"
;Zeichensatz der Zahlen für die Sekunden
FNT4X7_0:  IncludeBinary "font4x7_0.bmp"
FNT4X7_1:  IncludeBinary "font4x7_1.bmp"
FNT4X7_2:  IncludeBinary "font4x7_2.bmp"
FNT4X7_3:  IncludeBinary "font4x7_3.bmp"
FNT4X7_4:  IncludeBinary "font4x7_4.bmp"
FNT4X7_5:  IncludeBinary "font4x7_5.bmp"
FNT4X7_6:  IncludeBinary "font4x7_6.bmp"
FNT4X7_7:  IncludeBinary "font4x7_7.bmp"
FNT4X7_8:  IncludeBinary "font4x7_8.bmp"
FNT4X7_9:  IncludeBinary "font4x7_9.bmp"
EndDataSection
Das ganze ist eigentlich nur eine kleine Übung, um die Möglichkeiten
von PB kennen zu lernen, aber man beißt sich ja gerne fest ;)
Danke Euch...

p.s. Wen es interessiert, dem schicke ich auch gerne mal das gezippte
Projekt inkl. Grafiken usw...

Verfasst: 01.09.2005 15:26
von Pelagio
:yin-yang:
@Ghosty1967

Ich glaube du solltest mal unter der Hilfe
  • 2D Spiele Libraries:
    Mouse

    ExamineMouse
    InitMouse
    MouseButton
    MouseDeltaX
    MouseDeltaY
    MouseLocate
    MouseWheel
    MouseX
    MouseY
    ReleaseMouse
nach schauen und auch bei bei PureArea.net im Code Archive unter:
  • Gadget_Events&Settings (Gadget - Ereignisse & Einstellungen)
    DetectMouseOverGadget.pb (Erkennen, wenn sich die Maus über einem Gadget befindet)
    Gadgets_Check_RightMouseClick.pb (Rechten Mausklick bei Gadgets erkennen)
    Gadgets_OnMouseOver.pb (Mouseover bei selbstgezeichneten Gadgets erkennen)
    IsMouseOverGadget.pb (Mouseover bei Gadgets erkennen)
kannst du, wenn ich deine Frage richtig verstanden habe, was finden.
=)

Verfasst: 01.09.2005 19:57
von Lukas-P
2D Spiele Libraries:
Mouse
ExamineMouse
InitMouse
MouseButton
MouseDeltaX
MouseDeltaY
MouseLocate
MouseWheel
MouseX
MouseY
ReleaseMouse
Das geht nur im DX Screen /:->

Verfasst: 01.09.2005 19:58
von Tafkadasom2k5
Mach folgendes:
Schreibe ein Programm wmas die "WindowEvents" überwacht (n Fenster machen und einfach alle Indow events Debuggen...)

Dann siehst du welches Window Event ist wenn die Maus über dem Button ist usw.....vll wär dasn Ansatz...?

Is nur ne flinke Idee vonnem PureBasic Anfänger...aber vll hilft sie dir ja....^^

:allright: :allright: DerMarc

EDIT:
An den Bolzen der vorhin mit den 2D_Spiele Libs ankam...das geht nur mit nem "3D Screen" oder so...das geht ned im normalen Windoof-Modus... :roll:

EDITEDIT:
Oh da kam mir jemand zuvor... :oops:

Verfasst: 02.09.2005 07:50
von Pelagio
:allright:
Hallo Ghosty1967

da mein erster Tipp in die binsen gegangen ist, möchte ich diesen Codesnipsel dir geben der, wie ich hoffe, dein Problem lösen wird können.

Code: Alles auswählen

#Move = 2
Procedure.b WindowMouseMove(GadedID.l)
   Result = #False
   mX.l = WindowMouseX(): mY.l = WindowMouseY()
   If (mX>GadgetX(GadedID)) And (mX <(GadgetX(GadedID)+GadgetWidth (GadedID))): Result+1: EndIf
   If (my>GadgetY(GadedID)) And (mY <(GadgetY(GadedID)+GadgetHeight(GadedID))): Result+1: EndIf
   ProcedureReturn Result
EndProcedure

If OpenWindow(0,0,0,270,120,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ImageGadget") And CreateGadgetList(WindowID(0))
    If LoadImage(0, "U:\test.bmp")    ; ändern Sie den 2. Parameter in den Pfad/Dateiname Ihres Bildes
      ImageGadget(0, 50, 30, 20, 20,UseImage(0))                      ; Imagegadget Standard
       ImageGadget(1,150, 30, 20, 20,UseImage(0),#PB_Image_Border)     ; Imagegadget mit Rand
    EndIf
   Repeat 
      Event = WaitWindowEvent()
      Select #Move
         Case WindowMouseMove(0): MessageRequester("InfoBox", "Bild ohne Rand")
         Case WindowMouseMove(1): MessageRequester("InfoBox", "Bild mit Rand")
      EndSelect
   Until Event=#PB_Event_CloseWindow
EndIf
Viel Glück beim weiterentwickeln.
:bounce:

Verfasst: 26.05.2007 15:07
von Xaby
Und wie ermittelt man jetzt noch, welche Maustaste gedrückt wurde?

Also, auch wenn man die Maus auf dem Gadget verschiebt, würde ich gern wissen, ob und welche Maustaste gedrückt wird bzw. ob sie losgelassen wurde.

:roll:

Okay, schätze mal so wird es gehen:

Code: Alles auswählen

#Move = 2 
Procedure.b WindowMouseMove(GadedID.l) 
  result = #False 
  mX.l = WindowMouseX(0): mY.l = WindowMouseY(0) 
  If (mX>GadgetX(GadedID)) And (mX <(GadgetX(GadedID)+GadgetWidth (GadedID))): result+1: EndIf 
  If (mY>GadgetY(GadedID)) And (mY <(GadgetY(GadedID)+GadgetHeight(GadedID))): result+1: EndIf 
  ProcedureReturn result 
EndProcedure 

If OpenWindow(0,0,0,270,120,"ImageGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  If LoadImage(0, "C:\F\PureBasic\Icons\Zusammenstellung\1 - I180.ico")    ; ändern Sie den 2. Parameter in den Pfad/Dateiname Ihres Bildes 
    ImageGadget(0, 50, 30, 20, 20,ImageID(0))                      ; Imagegadget Standard 
    ImageGadget(1,150, 30, 20, 20,ImageID(0),#PB_Image_Border)     ; Imagegadget mit Rand 
  EndIf 
  Repeat 
    Event = WaitWindowEvent() 
    Select #Move 
      Case WindowMouseMove(0): Debug "Über Bild 1"
      Case WindowMouseMove(1): Debug "Über Bild 2"
    EndSelect 
    
    If GetAsyncKeyState_(#VK_LBUTTON)
      Debug "Maustaste"
    EndIf
    
  Until Event=#PB_Event_CloseWindow 
EndIf

Verfasst: 26.05.2007 23:31
von edel
bin im Moment zu faul daher nur ein paar Schlagwoerter nach denen man suchen kann :
  • SetWindowLong
    PtInRect
    ReleaseCapture
    SetCapture
    GetCapture
    GetClientRect

    #WM_MOUSEMOVE
    #WM_LBUTTONDOWN
    #WM_LBUTTONUP

Verfasst: 27.05.2007 01:36
von hardfalcon
@Ghosty1967: Schau die mal in der PB-Hilfe unter SetWindowCallback().
Das, was du machen willst, erledigt man über die Eventschleife: Op der Mauszeiger über nem bestimmten Gadget/Skinteil "hovert", brauchst du ja nur zu überprüfen, wenn der Mauszeiger auch bewegt wurde (und wenn er bewegt wird, erhält deine Callback-Procedure eine entsprechende Event-Meldung). Genauso verhält es sich mit den Mausklicks.

Das hier ist ein beispielcode zum Thema Callbacks aus dem CodeArchiv:
http://purearea.net/pb/CodeArchiv/Windo ... ck_2Win.pb

Hier gibts nen Überblick über einige Messages, die deine Callback-Procedure so erhalten könnte (du musst die natürlich nicht zwangsläufig alle behandeln/abarbeiten, du kümmerst dich nur um die, die du wirklich brauchen kannst):
http://msdn2.microsoft.com/en-us/library/ms674887.aspx

Hier noch einige Messages für Keyboard- und Maus-Events:
http://msdn2.microsoft.com/en-us/library/ms674716.aspx
http://msdn2.microsoft.com/en-us/library/ms674824.aspx

Hier ein genereller Überblick über so ziemlich alle Window-Messages (in der MSDN scheints die nich alle auf einer Seite zu geben, deshalb hier ein Link aus dem Wiki zum Windows-Emulator Wine):
http://wiki.winehq.org/List_Of_Windows_Messages

Verfasst: 27.05.2007 02:21
von ts-soft
hardfalcon hat geschrieben:@Ghosty1967: Schau die mal in der PB-Hilfe unter SetWindowCallback().
Ob der Ghosty1667 nach fast 2 Jahren das Problem noch hat :mrgreen: