Combobox: Event für Anklicken des Scrollbalkens ausfiltern?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Combobox: Event für Anklicken des Scrollbalkens ausfiltern?

Beitrag 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
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Antwort

Beitrag 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.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Re: Antwort

Beitrag 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... /:->
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Keiner eine Idee ? /:->

Oder ist dies gar Windows-Standard ?
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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 ! :)
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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]
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

[OffTopic=Sorry]Andre, wie hast du den Mauszeiger ins Bild bekommen?[/OffTopic]
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten