Seite 1 von 2

Combobox: Event für Anklicken des Scrollbalkens ausfiltern?

Verfasst: 04.02.2005 03:56
von Andre
Bin gerade dabei, die letzten Bugs im CAV-Sourcecode zu fixen. :wink:

Hoffe mir kann jemand bei dem nachfolgenden Problem helfen.
Beim folgenden Testcode nicht über die Konstanten usw. wundern, ich habe einfach entsprechenden Code aus dem CAV-Source kopiert und einzeln lauffähig gemacht.

Der Code demonstriert eine kleine Auswahlbox, die nach dem Anklicken des Buttons "..." erscheint. Die Einträge in dieser Auswahlbox können sowohl mit der Maus angeklickt werden als auch mit den Cursortasten und anschließendem Return. Soweit funktioniert alles wunderbar.

Was ich gerne vermeiden will, ist folgendes: wenn mit der Maus über einen Eintrag gefahren wird, ist dieser erstmal markiert. Wenn nun auf den Scrollbalken geklickt wird, wird die Auswahl mit dem zuletzt markierten Eintrag als Ergebnis abgeschlossen.

Genau dies möchte ich aber vermeiden. Beim Anklicken des Scrollbalkens soll gar nichts weiter passieren, außer dass gescrollt wird.

Leider habe ich es nicht geschafft, das Anklicken des Scrollbalkens auszufiltern, weil dieser Vorgang kein anderes Ereignis (Event) als das direkte Anklicken eines Eintrags liefert... :(

Hoffe, jemand bringt mir die Erleuchtung... :)

Und nun nach der langen Vorrede der Code:

Code: Alles auswählen

Enumeration
#MainWindow
#AuthorWin
#AuthorWinFrame
#AuthorWinText
#AuthorWinCombo
#AuthorWinQuit
#AuthorWinExit
#SearchAuthorSelect
EndEnumeration


;- Authors-Window
Procedure OpenAuthors()
  ; Opens a new window for choosing authors
  ; nearby the mouse cursor
  If OpenWindow(#AuthorWin,0,0,190,104,#PB_Window_BorderLess|#PB_Window_Invisible,"",WindowID(#MainWindow))
    If CreateGadgetList(WindowID())
      x = 8 : y = 28 : w = 174
      Frame3DGadget (#AuthorWinFrame, 3,3,184,98,"Choose author")                        ; Title: Choose author to search:
      TextGadget    (#AuthorWinText, x,y,w,20,"Authors",#PB_Text_Center) : y + 16   ; Authors
      ComboBoxGadget(#AuthorWinCombo,x,y,w,400)                              : y + 26
      For a=1 To 100
        AddGadgetItem(#AuthorWinCombo,-1,"Test "+Str(a))
      Next
      ButtonGadget  (#AuthorWinQuit,  x,y,w,24,"Cancel")              ; Cancel  (after choosing a keyword the window will be automatically closed)
    EndIf
    AddKeyboardShortcut(#AuthorWin,#PB_Shortcut_Escape,#AuthorWinExit)
  EndIf
EndProcedure

Procedure ShowAuthors()
  SetGadgetState(#AuthorWinCombo,-1)
  UseWindow(#AuthorWin)
  MoveWindow(DesktopMouseX(),DesktopMouseY())
  HideWindow(#AuthorWin,0)
  SetWindowPos_(WindowID(#AuthorWin),#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE) 
  EnableWindow_(WindowID(#MainWindow), #False) 
EndProcedure

Procedure HideAuthors()
  EnableWindow_(WindowID(#MainWindow), #True)
  HideWindow(#AuthorWin,1)
EndProcedure



Flags.l = #PB_Window_SystemMenu|#PB_Window_TitleBar
MainWin = OpenWindow(#MainWindow, 100, 100, 200, 100, Flags, "Test")
If MainWin
  If CreateGadgetList(WindowID())
    ButtonGadget(#SearchAuthorSelect, 50, 50, 20, 20, "...")
  EndIf
EndIf

OpenAuthors()


run = #True
Repeat
  
  Event = WaitWindowEvent()

  WindowID = EventWindowID()
  GadgetID = EventGadgetID()
  MenuID   = EventMenuID()
  EvTypeID = EventType()
  event2.l=EventwParam()            ; this we need for checking keycode + mouseclick (Return=13, LeftMB=1)

  ;- Events MainWin
  If WindowID = #MainWindow
    ;- MainWin ExitEvent
    If Event = #PB_EventCloseWindow
      run = #False

    ElseIf Event = #PB_EventGadget
      If GadgetID = #SearchAuthorSelect
        ShowAuthors()
      EndIf
    EndIf
    
  ;- Events Authors
  ElseIf WindowID = #AuthorWin

    If GadgetID = #AuthorWinQuit
      HideAuthors()
    
    ElseIf GadgetID = #AuthorWinCombo      ; Author choosen

      ;Debug "GadgetID = " + Str(GadgetID)
      ;Debug "event2 = " + Str(event2)
      ;Debug "evType = " + Str(EvTypeID)

; ********** Abfrage der Auswahlliste **********
      If event2 = 1  Or event2 = 13         ; LeftMouseButton or RETURN pressed 
        a = GetGadgetState(#AuthorWinCombo)
        If a > 0
          Debug "Selected item: " + GetGadgetText(#AuthorWinCombo)
          HideAuthors()
        EndIf
      EndIf
; **********************************************      
      
    EndIf
    
    If MenuID = #AuthorWinExit
      HideAuthors()
    EndIf
    
  EndIf

Until run = #False

Antwort

Verfasst: 04.02.2005 04:02
von Hroudtwolf
Probiers doch mal so..

Code: Alles auswählen

scrollbalken=20
if gadgetid(gadgetnr) and gadgetwidth(gadgetnr)-Scrollbalken>WindowMouseX()
;dein Code
endif 
So wird geprüft ob sich die Maus beim klicken auch ja auf dem Gadget selbst befindet.

Re: Antwort

Verfasst: 04.02.2005 04:20
von Andre
Hroudtwolf hat geschrieben:

Code: Alles auswählen

scrollbalken=20
if gadgetid(gadgetnr) and gadgetwidth(gadgetnr)-Scrollbalken>WindowMouseX()
;dein Code
endif 
So wird geprüft ob sich die Maus beim klicken auch ja auf dem Gadget selbst befindet.
Danke für die Anregung, im meinem Code umgesetzt müsste dies dann so aussehen (die -20 stimmt nicht ganz):

Code: Alles auswählen

; ********** Abfrage der Auswahlliste **********
  Debug "Mouse="+Str(WindowMouseX())
  Debug "GadgetWidth="+Str(GadgetWidth(#AuthorWinCombo)-20)
  
      If (event2 = 1 And (WindowMouseX()<GadgetWidth(#AuthorWinCombo)-20))  Or event2 = 13         ; LeftMouseButton or RETURN pressed 
        a = GetGadgetState(#AuthorWinCombo)
        If a > 0
          Debug "Selected item: " + GetGadgetText(#AuthorWinCombo)
          HideAuthors()
        EndIf
      EndIf
; **********************************************      
Wie man der Debug-Ausgabe entnehmen kann, funktioniert dies jedoch auch nicht richtig, da WindowMouseX() ja nur innerhalb des eigentlichen (kleinen) Fensters anwendbar ist. Der Scrollbalken geht jedoch wesentlich darüber hinaus... /:->

Verfasst: 04.02.2005 20:25
von Andre
Keiner eine Idee ? /:->

Oder ist dies gar Windows-Standard ?

Verfasst: 04.02.2005 20:36
von ts-soft
Versuchs mal so:
Enumeration

Code: Alles auswählen

#MainWindow
#AuthorWin
#AuthorWinFrame
#AuthorWinText
#AuthorWinCombo
#AuthorWinQuit
#AuthorWinExit
#SearchAuthorSelect
EndEnumeration


;- Authors-Window
Procedure OpenAuthors()
  ; Opens a new window for choosing authors
  ; nearby the mouse cursor
  If OpenWindow(#AuthorWin,0,0,190,104,#PB_Window_BorderLess|#PB_Window_Invisible,"",WindowID(#MainWindow))
    If CreateGadgetList(WindowID())
      x = 8 : y = 28 : w = 174
      Frame3DGadget (#AuthorWinFrame, 3,3,184,98,"Choose author")                        ; Title: Choose author to search:
      TextGadget    (#AuthorWinText, x,y,w,20,"Authors",#PB_Text_Center) : y + 16   ; Authors
      ComboBoxGadget(#AuthorWinCombo,x,y,w,400)                              : y + 26
      For a=1 To 100
        AddGadgetItem(#AuthorWinCombo,-1,"Test "+Str(a))
      Next
      ButtonGadget  (#AuthorWinQuit,  x,y,w,24,"Cancel")              ; Cancel  (after choosing a keyword the window will be automatically closed)
    EndIf
    AddKeyboardShortcut(#AuthorWin,#PB_Shortcut_Escape,#AuthorWinExit)
  EndIf
EndProcedure

Procedure ShowAuthors()
  SetGadgetState(#AuthorWinCombo,-1)
  UseWindow(#AuthorWin)
  MoveWindow(DesktopMouseX(),DesktopMouseY())
  HideWindow(#AuthorWin,0)
  SetWindowPos_(WindowID(#AuthorWin),#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
  EnableWindow_(WindowID(#MainWindow), #False)
EndProcedure

Procedure HideAuthors()
  EnableWindow_(WindowID(#MainWindow), #True)
  HideWindow(#AuthorWin,1)
EndProcedure



Flags.l = #PB_Window_SystemMenu|#PB_Window_TitleBar
MainWin = OpenWindow(#MainWindow, 100, 100, 200, 100, Flags, "Test")
If MainWin
  If CreateGadgetList(WindowID())
    ButtonGadget(#SearchAuthorSelect, 50, 50, 20, 20, "...")
  EndIf
EndIf

OpenAuthors()


run = #True
Repeat
 
  Event = WaitWindowEvent()

  WindowID = EventWindowID()
  GadgetID = EventGadgetID()
  MenuID   = EventMenuID()
  EvTypeID = EventType()
  event2.l=EventwParam()            ; this we need for checking keycode + mouseclick (Return=13, LeftMB=1)

  ;- Events MainWin
  If WindowID = #MainWindow
    ;- MainWin ExitEvent
    If Event = #PB_EventCloseWindow
      run = #False

    ElseIf Event = #PB_EventGadget
      If GadgetID = #SearchAuthorSelect
        ShowAuthors()
      EndIf
    EndIf
   
  ;- Events Authors
  ElseIf WindowID = #AuthorWin

    If GadgetID = #AuthorWinQuit
      HideAuthors()
   
    ElseIf GadgetID = #AuthorWinCombo      ; Author choosen

      ;Debug "GadgetID = " + Str(GadgetID)
      ;Debug "event2 = " + Str(event2)
      ;Debug "evType = " + Str(EvTypeID)

; ********** Abfrage der Auswahlliste **********
      If event2 = 3
      ElseIf event2 = 1  Or event2 = 13         ; LeftMouseButton or RETURN pressed
        a = GetGadgetState(#AuthorWinCombo)
        If a > 0
          Debug "Selected item: " + GetGadgetText(#AuthorWinCombo)
          HideAuthors()
        EndIf
      EndIf
; **********************************************     
     
    EndIf
   
    If MenuID = #AuthorWinExit
      HideAuthors()
    EndIf
   
  EndIf

Until run = #False
3 ist für rechtsdoppelklick

Verfasst: 04.02.2005 20:51
von Andre
@ts-soft: danke für Deine Mühe, bringt mich jedoch nicht weiter zur Lösung.

Um es mal besser zu verdeutlichen folgender Screenshot:
Bild

1. das Auswahlfenster wird geöffnet
2. der Mauspfeil wird über die Einträge bewegt, weshalb hier der "Test 13" Eintrag blau markiert wird
3. der Mauspfeil wird jetzt jedoch auf den Scrollbalken bewegt, befindet sich also NICHT mehr über einem Eintrag
4. wenn jetzt der Scrollbalken an der Stelle, wo der Mauspfeil steht (siehe Screenshot), angeklickt wird, dann wird zwar nach unten gescrollt aber gleichzeitig auch die Auswahl abgeschlossen und "Test 13" als ausgewählter Eintrag zurückgegeben

Wie gesagt, dies soll nicht passieren. Beim Anklicken des Scrollbalken soll eben nur gescrollt werden und nicht ein Eintrag ausgewählt werden.

Entweder in meinem Code ist was falsch oder .... ?

Danke im voraus für Eure Hilfe ! :)

Verfasst: 04.02.2005 21:57
von ts-soft
Der sollte aber jetzt funzen:

Code: Alles auswählen

Enumeration
#MainWindow
#AuthorWin
#AuthorWinFrame
#AuthorWinText
#AuthorWinCombo
#AuthorWinQuit
#AuthorWinExit
#SearchAuthorSelect
EndEnumeration


;- Authors-Window
Procedure OpenAuthors()
  ; Opens a new window for choosing authors
  ; nearby the mouse cursor
  If OpenWindow(#AuthorWin,0,0,190,104,#PB_Window_BorderLess|#PB_Window_Invisible,"",WindowID(#MainWindow))
    If CreateGadgetList(WindowID())
      x = 8 : y = 28 : w = 174
      Frame3DGadget (#AuthorWinFrame, 3,3,184,98,"Choose author")                        ; Title: Choose author to search:
      TextGadget    (#AuthorWinText, x,y,w,20,"Authors",#PB_Text_Center) : y + 16   ; Authors
      ComboBoxGadget(#AuthorWinCombo,x,y,w,400)                              : y + 26
      For a=1 To 100
        AddGadgetItem(#AuthorWinCombo,-1,"Test "+Str(a))
      Next
      ButtonGadget  (#AuthorWinQuit,  x,y,w,24,"Cancel")              ; Cancel  (after choosing a keyword the window will be automatically closed)
    EndIf
    AddKeyboardShortcut(#AuthorWin,#PB_Shortcut_Escape,#AuthorWinExit)
  EndIf
EndProcedure

Procedure ShowAuthors()
  SetGadgetState(#AuthorWinCombo,-1)
  UseWindow(#AuthorWin)
  MoveWindow(DesktopMouseX(),DesktopMouseY())
  HideWindow(#AuthorWin,0)
  SetWindowPos_(WindowID(#AuthorWin),#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
  EnableWindow_(WindowID(#MainWindow), #False)
EndProcedure

Procedure HideAuthors()
  EnableWindow_(WindowID(#MainWindow), #True)
  HideWindow(#AuthorWin,1)
EndProcedure



Flags.l = #PB_Window_SystemMenu|#PB_Window_TitleBar
MainWin = OpenWindow(#MainWindow, 100, 100, 200, 100, Flags, "Test")
If MainWin
  If CreateGadgetList(WindowID())
    ButtonGadget(#SearchAuthorSelect, 50, 50, 20, 20, "...")
  EndIf
EndIf

OpenAuthors()


run = #True
Repeat
 
  Event = WaitWindowEvent()

  WindowID = EventWindowID()
  GadgetID = EventGadgetID()
  MenuID   = EventMenuID()
  EvTypeID = EventType()
  event2.l=EventwParam()            ; this we need for checking keycode + mouseclick (Return=13, LeftMB=1)

  ;- Events MainWin
  If WindowID = #MainWindow
    ;- MainWin ExitEvent
    If Event = #PB_EventCloseWindow
      run = #False

    ElseIf Event = #PB_EventGadget
      If GadgetID = #SearchAuthorSelect
        ShowAuthors()
      EndIf
    EndIf
   
  ;- Events Authors
  ElseIf WindowID = #AuthorWin

    If GadgetID = #AuthorWinQuit
      HideAuthors()
   
    ElseIf GadgetID = #AuthorWinCombo      ; Author choosen

      ;Debug "GadgetID = " + Str(GadgetID)
      ;Debug "event2 = " + Str(event2)
      ;Debug "evType = " + Str(EvTypeID)

; ********** Abfrage der Auswahlliste **********
; hab den Eventtyp geändert     
       If EvTypeID = 1  Or event2 = 13         ; LeftMouseButton or RETURN pressed
        a = GetGadgetState(#AuthorWinCombo)
        If a > 0
          Debug "Selected item: " + GetGadgetText(#AuthorWinCombo)
          HideAuthors()
        EndIf
      EndIf
; **********************************************     
     
    EndIf
   
    If MenuID = #AuthorWinExit
      HideAuthors()
    EndIf
   
  EndIf

Until run = #False
aber bitte erst Testen, bei mir gehts

[Edit]Zur Erläuterung:
; ********** Abfrage der Auswahlliste **********
If event2 = 1 Or event2 = 13 ; LeftMouseButton or RETURN pressed

Code: Alles auswählen

; ********** Abfrage der Auswahlliste **********
     If EvTypeID = 1  Or event2 = 13         ; LeftMouseButton or RETURN pressed
[/Edit]

Verfasst: 04.02.2005 22:43
von ts-soft

Code: Alles auswählen

event2.l=EventwParam()
event2 enthält nur das highword des ereignisses, aber der gesamte wert (long) muß 1 sein

Verfasst: 05.02.2005 02:24
von Andre
@ts-soft: danke, Du hast das Problem mit dem Mausklick auf den Scrollbalken gelöst. :allright:

Hat jedoch einen kleinen Haken: bei Tastaturbedienung wird jetzt bereits beim Scrollen mit den Cursortasten ein Element ausgewählt.
Bin aber zuversichtlich, das auch noch hinzukriegen. :wink:

Verfasst: 05.02.2005 08:38
von DarkDragon
[OffTopic=Sorry]Andre, wie hast du den Mauszeiger ins Bild bekommen?[/OffTopic]