KeyState und Gadgets

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

KeyState und Gadgets

Beitrag von Amon »

Hallo liebe PureBasic Gemeinde,

folgendes Problem stellt sich mir seit eben (leider konnte ich bei einer Suche nichts entsprechendes finden)

Ich programmiere gerade ein Programm das mir rel. grosse Tilemaps anzeigt. Das Ganze ist in nicht in DirectX geschrieben, da es kein Spiel ist, sondern eben nur ein Viewer.

Man kann auf der Karte mit der Maus rumklicken und sich somit weiterbewegen, der aktuelle Klickpunkt wird dann entsprechend zentriert.

Alternativ kann man sich auch mit den Cursortasten weiterbewegen, dies abzufragen ist auch kein Problem gewesen (GetAsyncKeyState_).

Weiters gibt es noch ein paar Gadgets in dem Window.
Ein editierbares ComboboxGadget über das ich auf ein paar neuralgische Punkte in der Karte springen kann.

Mein Problem ist nun folgendes:
Wenn ich in der Combobox editiere / navigiere und dazu die Pfeiltasten verwende, "scrollt" natrülich jetzt ungewollterweise die Karte mit, weil ja weiterhin die Keyevents abgefragt werden.

Wie kann ich es am besten anstellen dies abzustellen, bzw. wie kann ich feststellen weches Gadget gerade aktiv ist?

:?

Code: Alles auswählen

    GadgetID = EventGadgetID()
    
    If GadgetID = #cmbStadt
      Debug "GadgetID: #cmbStadt"
      AutocompleteComboBox(#cmbStadt)
      
      gefunden = GetGadgetState(#cmbStadt)
      If gefunden > -1 
        startX=stadt_x(gefunden)-tileX/2
        startY=stadt_y(gefunden)-tileY/2
        redraw = 1
        repaint = 1
      EndIf

.
.
.

  Select Event
    Case #WM_KEYDOWN 
      Debug "Taste drückt: "+Str(getpressedkey())
      taste = getpressedkey()
      Select taste
        Case 37
          startX - 1
          redraw = 1
        Case 38
          startY - 1
          redraw = 1
        Case 39
          startX + 1
          redraw = 1
        Case 40
          startY + 1
          redraw = 1
      EndSelect
    Case #WM_KEYUP
      Debug "Taste los: "+Str(getpressedkey())
  EndSelect

Vielen Dank im voraus

Amon
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: KeyState und Gadgets

Beitrag von Danilo »

Amon hat geschrieben:wie kann ich feststellen weches Gadget gerade aktiv ist?
Mit GetFocus_(). Das gibt die GadgetID() des aktiven Gadgets
zurück. Brauchst also nur vergleichen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

Beitrag von Amon »

Dankeschön, war perfekter Tipp :)
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

Beitrag von Amon »

Hm,

seit dem ich mein Bild nicht mehr direkt aufs Window zeichne, sondern in ein Image Gadget funktioniert diese Methode nicht mehr. Dh. mein Programm reagiert auf Pfeiltasten auch wenn ich grad in der Combobox rumtippe

Code: Alles auswählen

  ;- Event Tastatur
  Case #WM_KEYDOWN 
        Debug "Taste drückt: "+Str(getpressedkey())

        taste = getpressedkey()
        GadgetID = GetFocus_()
        If GadgetID <> #cmbStadt
          Select taste
            Case 37
              startX - offset
              redraw = 1
            Case 38
              startY - offset
              redraw = 1
            Case 39
              startX + offset
              redraw = 1
            Case 40
              startY + offset
              redraw = 1
          EndSelect
        EndIf

    Case #WM_KEYUP
      Debug "Taste los: "+Str(getpressedkey())
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Amon hat geschrieben:seit dem ich mein Bild nicht mehr direkt aufs Window zeichne, sondern in ein Image Gadget funktioniert diese Methode nicht mehr. Dh. mein Programm reagiert auf Pfeiltasten auch wenn ich grad in der Combobox rumtippe
Ohne lauffähigen Code kann man da nichts genau sagen.

Auch weiß ich nicht das Deine Funktion getpressedkey() macht.

Dieser Ausschnitt ist aber schonmal falsch:
Amon hat geschrieben:

Code: Alles auswählen

        GadgetID = GetFocus_()
        If GadgetID <> #cmbStadt
Du vergleichst hier eine GadgetID (ein Handle) mit einer
konstanten #GadgetNr.

Dieser Ausschnitt sollte also mit der GadgetID vergleichen:

Code: Alles auswählen

        ActiveID = GetFocus_()
        If ActiveID <> GadgetID(#cmbStadt)
Wobei ich hier davon ausgehe das '#cmbStadt' die #GadgetNr
Deiner Combobox ist.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

Beitrag von Amon »

Danke für die schnelle Antwort.

Du liegst richtig in der Annahme, das #cmbStadt die ID ist,

Das macht meine GetPressedkey()

Code: Alles auswählen

Procedure GetPressedKey()
     For Cnt = 0 To 256
         If GetAsyncKeyState_(Cnt) <> 0
            ProcedureReturn = Cnt
            Break
        EndIf
     Next
EndProcedure
So sieht gekürzt die Hauptschleife aus:

Code: Alles auswählen

       .
       .
       .
       ; Initalisierung und laden von Grafikdaten, Kartendaten, Ortsdaten, Initialisieren der Array usw
       .
       .
       .


SetGadgetState(#gdImage, UseImage(#mainImage))

Repeat

    
  Event = WaitWindowEvent()
  
  Select Event
  
  ;- Event Windows
  Case #PB_Event_SizeWindow
       ; Neuordnung der Gadgets und Anpassung der Bildgrösse
       .
       .
       .

   ;- Event Menu
  Case #PB_EventMenu
       ; Behandeln der Menuevents
       .
       .
       .

    ;- Event Tastatur
  Case #WM_KEYDOWN 
        Debug "Taste drückt: "+Str(getpressedkey())

        ;Entsprechend Forumpost geändert - will trotzdem noch nicht so
        taste = getpressedkey()
        ActiveID = GetFocus_()
        If ActiveID <> GadgetID(#cmbStadt)
          Select taste
            Case 37
              startX - offset
              redraw = 1
            Case 38
              startY - offset
              redraw = 1
            Case 39
              startX + offset
              redraw = 1
            Case 40
              startY + offset
              redraw = 1
          EndSelect
        EndIf

  Case #WM_KEYUP
      Debug "Taste los: "+Str(getpressedkey())
  
  ;- Event Gadgets
  Case #PB_EventGadget

    GadgetID = EventGadgetID()
          
    Select GadgetID 
      Case #cmbStadt
        Debug "GadgetID: #cmbStadt"
        AutocompleteComboBox(#cmbStadt)
        ;Autocomplete aus dem PureNet Codearchiv
        ; Ortsdaten liegen in drei Arrays (name, x und y)
        gefunden = GetGadgetState(#cmbStadt)
        If gefunden > -1 
          startX=stadt_x(gefunden)-tileX/2
          startY=stadt_y(gefunden)-tileY/2
          redraw = 1
          repaint = 1
          ;setzen der neuen startkoordinaten der linken oberen ecke, sowie setzen des flags für neuen bildaufbau (tileX und tileY sind breite und höhe des bildschirmes in tiles)
        EndIf      
      Case #txtX
        Debug "GadgetID: #txtX"        
      Case #txtY
        Debug "GadgetID: #txtY"        
      Case #btnOK
        Debug "GadgetID: #btnOK"        
      Case #scrlX
        Debug "GadgetID: #scrlX"        
      Case #scrlY
        Debug "GadgetID: #scrlY"        
    EndSelect 
    
  EndSelect 
  ;- Zeichnen 
  
   tileX=scrX/pixelX
   tileY=scrY/pixelY

   ;prüfen ob durch bewegung nicht ausserhalb der Kartendimensionen
   If startX=<minX 
      startX=minX
   EndIf
   If startX>=maxX-tileX 
      startX=maxX-tileX 
   EndIf
   If startY<=minY 
      startY=minY 
   EndIf
   If startY>=maxY-tileY 
    startY=maxY-tileY
   EndIf
   
   If old_startX<>startX Or old_startY<>startY Or redraw = 1
   
      redraw = 0
   
      old_startX=startX
      old_startY=startY

   
      ;bild = UseImage(#mainImage)     
      
      
      Debug "Bild aufbauen..."
         
      outputDC= StartDrawing(ImageOutput())
      
      DrawingMode(1)
      
      Box(0, 0, image_wd, image_hg,RGB(0,0,0))

        For x=0 To tileX
          For y=0 To tileY
          
              If x+startX <= maxX And y+startY <=maxY And x+startX >= minX And y+startY >= minY
                
                fg=bild_fg(x+startX-minX,y+startY-minY)
                bg=bild_bg(x+startX-minX,y+startY-minY)
                ma=bild_mark(fg)
              
                If bg>0
                  DrawImage(UseImage(pic_bilder(bg)), x*pixelX+24*koord,y*pixelY+24*koord)
                EndIf
                
                If fg>0 And bg > 0
                  ;Transparentes Zeichnen
                  id=UseImage(pic_bilder(fg)) 
                  imglist=ImageList_Create_(ImageWidth(),ImageHeight(),#ILC_COLORDDB|#ILC_MASK,1,0) 
                  ImageList_AddMasked_(imglist,id,RGB(0,0,0)) 
                  ImageList_Draw_(imglist,0,outputDC,x*pixelX+24*koord,y*pixelY+24*koord,#ILD_TRANSPARENT) 
                  ImageList_Destroy_(imglist)

                EndIf
                If fg>0 And bg = 0
                   DrawImage(UseImage(pic_bilder(fg)), x*pixelX+24*koord,y*pixelY+24*koord)
                EndIf
              EndIf
              
              If farbe=1
                 ; Bestimmte Tiles farblich Kennzeichnen
                 DrawingMode(4)
                 Select ma
                   Case 1
                     Box(x*pixelX+24*koord+1,y*pixelY+24*koord+1, pixelX-1, pixelY-1,RGB(255,0,0))
                   Case 2
                    If zoomstufe>1
                     Box(x*pixelX+24*koord+1,y*pixelY+24*koord+1, pixelX-1, pixelY-1,RGB(255,255,0) )          
                    EndIf
                   Case 3
                    If zoomstufe>1
                     Box(x*pixelX+24*koord+1,y*pixelY+24*koord+1, pixelX-1, pixelY-1,RGB(0,255,0) )          
                    EndIf
                 EndSelect
                 DrawingMode(1)
              EndIf
              
          
          Next
        Next
        
       If Raster = 1 
         ; Kartenraster bei Bedarf zeichnen
         If zoomstufe>2
          
          For x=0 To tileX
           LineXY(x*PixelX+24*koord,0,x*pixelX+24*koord,scrY+24,RGB(0,0,0))
          Next  
          For Y=0 To tileY
           LineXY(0,y*pixelY+24*koord,scrX+24, y*pixelY+24*koord,RGB(0,0,0))
          Next
         EndIf
      EndIf 

      StopDrawing()
      
      SetGadgetState(#gdImage, UseImage(#mainImage))
      
   EndIf
  
Until Event = #PB_EventCloseWindow
Ich hoffe die Angaben sind ausreichend :)

Danke

Amon
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

@Amon:
So wird das wohl nichts, da die editierbare Combobox ein
StringGadget zur Eingabe nimmt, d.h. der Focus liegt dann
nicht auf der Combobox sondern auf diesem EditFeld innerhalb
der Combobox.

Vielleicht könntest Du mit "If ActiveID = GadgetID(#DeinImageGadget)"
prüfen, so daß die Tasten nur reagieren wenn der Focus auf dem
Image ist.
Könnte auch sein das hier "If ActiveID = WindowID(#DeinFenster)"
besser ist. Hängt davon ab ob das ImageGadget den InputFocus
bekommen kann oder nicht. Da das eine PB-Interne Geschichte
ist, kann sich das immer mal ändern.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Amon
Beiträge: 26
Registriert: 12.05.2005 21:29

Beitrag von Amon »

Sehr schön, dank Deiner Tipps hat es nun geklappt, eine Kombination deiner letzen beiden Angaben führte zum Ziel:

Code: Alles auswählen

If ActiveID = WindowID(#Window_0) Or ActiveID = GadgetID(#gdImage)
cu

Amon
Antworten