2016-06-21 1 views
2

Quelqu'un a un exemple de code ou des instructions pour faire ce travail? Je n'ai jamais été en mesure d'accomplir un menu en surbrillance qui utilise les touches fléchées et entrer pour les sélections. Merci d'avance! Mise à jourMenu Qbasic Highlighted, sérieusement

! Je prévois ce travail en dessinant des boîtes pour chaque option, et redessiner la boîte de couleur tout en colorant le texte lorsqu'une option est sélectionnée, je ne suis pas sûr comment concevoir une boucle pour y parvenir. Je suis assez à l'aise avec la fonction INKEY $ et SELECT CASE, mais je ne sais pas comment les factoriser.

Répondre

2

Un menu en surbrillance dessine le menu et attend une pression sur une touche dans une boucle ou en utilisant SLEEP. Une alternative courante consistait simplement à changer la couleur du texte de l'une des premières lettres, en informant l'utilisateur d'appuyer sur la touche correspondante pour sélectionner l'option de menu correspondante. Par exemple, les lettres Q dans "Quitter" et N dans "Nouveau jeu" seraient d'une couleur différente du reste du texte de la ligne. Cependant, vous demandez à utiliser les touches fléchées, donc clairement vous ne voulez pas le faire de cette façon. La mise en surbrillance de l'élément de menu actuel dépend du mode d'écran utilisé. Les modes d'écran 11, 12 et 13 ne vous permettent pas de spécifier une couleur d'arrière-plan, et je ne peux pas obtenir DOSBox pour rendre un arrière-plan avec les modes 7, 8 et 9. Pour contourner ce problème, vous pouvez simplement Dessinez une boîte à côté de la sélection actuelle et effacez la boîte (dessinez une noire ou quelle que soit la couleur de fond de votre écran). Ou vous pouvez simplement utiliser un astérisque pour éviter les problèmes de taille des graphiques et du texte et simplifier le code. Voici un exemple de style de boîte avec les touches fléchées, les touches WASD et les touches de style Vim (H = Gauche, J = Bas, K = Haut, L = Droite) toutes prises en charge, en supposant qu'un clavier US-QWERTY est utilisé. Si vous vouliez seulement les touches fléchées, alors vous auriez simplement besoin de changer le premier bloc (extérieur) SELECT CASE...END SELECT en simplement IF LEFT$(k$, 1) = CHR$(0) THEN...END IF tout en préservant le bloc interne SELECT CASE...END SELECT qui fonctionne avec les touches étendues.

'size% is used in the selIncDec subroutine. 
DIM text$(0 TO 3) 
DIM SHARED size% 
size% = UBOUND(text$) - LBOUND(text$) + 1 

selected% = 0 

text$(0) = "Example 1" 
text$(1) = "Example 2" 
text$(2) = "Example 3" 
text$(3) = "Example 4" 

SCREEN 12 

' Width and height of a text cell in pixels. 
' I use 8x8 text cells for max screen compatibility, despite 8x16 looking better. 
xpxText% = 8 
ypxText% = 8 

' See the documentation for SCREEN to determine which screen sizes are 
' available with the screen mode you want to use. 
' 80x60 for mode 12 results in 8x8 text cells. 80x30 results in 8x16 text cells. 
WIDTH 80, 60 

DO 
    LOCATE 1, 1 
    FOR i% = LBOUND(text$) TO UBOUND(text$) 
     PRINT TAB(3); text$(i%) 
     ' selected% = i% 
     ' is an equality comparison, resulting in -1 for true and 0 for false. 
     ' If false, -(0) * 2 = 0; if true, -(-1) * 2 = 2. 
     LINE (0, i% * ypxText%)-STEP(xpxText% - 1, xpxText% - 1), -(selected% = i%) * 2, BF 
    NEXT i% 

    SLEEP 
    k$ = INKEY$ 
    SELECT CASE UCASE$(LEFT$(k$, 1)) 
     ' Left -- does nothing 
     CASE "H", "A" 

     ' Right -- does nothing 
     CASE "L", "D" 

     ' Up 
     CASE "K", "W" 
     CALL selIncDec(selected%, -1) 

     ' Down 
     CASE "J", "S" 
     CALL selIncDec(selected%, 1) 

     ' Enter key 
     CASE CHR$(13) 
     EXIT DO 

     ' Extended key, such as arrows. 
     CASE CHR$(0) 
     SELECT CASE RIGHT$(k$, 1) 
      ' Left 
      CASE "K" 

      ' Right 
      CASE "M" 

      ' Up 
      CASE "H" 
      CALL selIncDec(selected%, -1) 

      ' Down 
      CASE "P" 
      CALL selIncDec(selected%, 1) 
     END SELECT 
    END SELECT 
LOOP 

PRINT USING "You selected option #"; selected% + 1 

END 

SUB selIncDec (selected%, amtInc%) 
    selected% = selected% + amtInc% 
    IF selected% >= size% THEN 
     selected% = selected% - size% 
    ELSEIF selected% < 0 THEN 
     selected% = selected% + size% 
    END IF 
END SUB 

Si vous utilisez un mode d'écran qui prend en charge les couleurs d'arrière-plan ou mettre en évidence sous une certaine forme, tel que l'écran 0, vous pourriez être en mesure de sortir avec simplement « en soulignant » l'arrière-plan de toute la ligne en mode texte. Vous n'avez pas besoin de spécifier la largeur de l'écran pour que l'effet "reverse video" agisse comme une mise en surbrillance, mais il est préférable de mettre en surbrillance une ligne entière plutôt que le texte. Après l'impression de cet élément de menu, rétablissez les couleurs par défaut et continuez l'impression comme d'habitude. Ci-dessous montre quelques modifications au code ci-dessus (mode écran, réglage de la largeur de l'écran, et le code d'affichage de menu), mais il reste le même autrement:

SCREEN 0 
'8x8 text cells in SCREEN 0 for VGA adapters. 
WIDTH 80, 43 

... 

    FOR i% = LBOUND(text$) TO UBOUND(text$) 
     ' "Reverse video" highlighting. 
     IF selected% = i% THEN COLOR 0, 7 ELSE COLOR 7, 0 
     PRINT TAB(3); text$(i%); SPACE$(78 - LEN(text$(i%))) 
    NEXT i% 

    ' The screen will turn "white" when the last menu item is selected. 
    ' This fixes the issue. 
    COLOR 7, 0 

    SLEEP 
... 

Notez que je supposais un adaptateur VGA avec un écran couleur pour tous du code ci-dessus, qui a depuis longtemps été remplacé par d'autres normes d'adaptateurs d'affichage qui sont utilisés même sur des appareils aussi petits que les montres intelligentes.

Vous devriez être en mesure d'adapter le code pour répondre à vos besoins. Je l'ai conçu de telle sorte que vous puissiez simplement ajouter des éléments de menu comme vous le souhaitiez. En outre, le code d'affichage lui-même est entièrement contenu dans la boucle FOR...NEXT avec la fonctionnalité immédiatement après, tout ce que vous aurez besoin de changer est la substance dans la boucle FOR...NEXT pour changer la façon dont les choses sont affichées.