2016-06-21 2 views
2

У кого-нибудь есть пример кода или инструкции для выполнения этой работы? Я просто не смог выполнить выделенное меню, которое использует клавиши со стрелками и вводит для выбора. Заранее спасибо!Qbasic Highlighted Menu, серьезно

Обновление! Я ожидаю, что это будет работать с помощью ящиков для каждой опции и перерисовки поля в цвете при раскраске текста при выборе опции. Я просто не знаю, как создать цикл для этого. Мне очень комфортно работать с функцией INKEY $ и SELECT CASE, но я не знаю, как их учесть.

ответ

2

Выделенное меню будет отображать меню и ждать нажатия клавиши в цикле или с использованием SLEEP. Общей альтернативой было просто изменить цвет текста одной из первых нескольких букв, сообщив пользователю нажать соответствующую клавишу, чтобы выбрать соответствующую опцию меню. Например, буквы Q в «Quit» и N в «New Game» будут отличаться от остальной части текста в строке.

Однако вы просите использовать клавиши со стрелками, поэтому вы явно не хотите этого делать. Как вы выделяете текущий пункт меню, зависит от используемого режима экрана. Экранные режимы 11, 12 и 13 не позволяют указать цвет фона, и я не могу заставить DOSBox отображать фон с режимами 7, 8 и 9. В качестве обходного пути к этой проблеме вы могли бы просто просто нарисуйте поле рядом с текущим выбором и сотрите ящик (нарисуйте черный или любой цвет фона вашего экрана). Или вы можете просто использовать звездочку, чтобы избежать проблем с размером текста и текста и упростить код. Вот пример стиля коробки с клавишами со стрелками, клавишами WASD и клавишами Vim (H = Left, J = Down, K = Up, L = Right), все поддерживаемые, если используется клавиатура US-QWERTY. Если вам нужны только клавиши со стрелками, вам просто нужно изменить первый (внешний) SELECT CASE...END SELECT блок на просто IF LEFT$(k$, 1) = CHR$(0) THEN...END IF, сохраняя внутренний блок SELECT CASE...END SELECT, который работает с расширенными ключами.

'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 

Если вы используете режим экрана, который поддерживает цвета фона или выделение в той или иной форме, например, экран 0, вы можете быть в состоянии уйти с просто «выделение» фона всей линии в в текстовом режиме. Вам не нужно указывать ширину экрана, чтобы иметь эффект «обратного видео», действующий как подсветка, но он выглядит лучше, если у вас выделена целая линия, а не только текст. После того, как этот пункт меню будет напечатан, просто измените цвета на значение по умолчанию и продолжите печать, как обычно. Ниже показаны несколько изменений в коде выше (режим экрана, настройки ширины экрана, и меню кода дисплея), но он остается тем же иначе:

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 
... 

Обратите внимание, что я предположил, адаптер VGA с цветным дисплеем для всех вышеприведенного кода, который уже давно заменен различными другими стандартами адаптера дисплея, которые используются даже на устройствах, таких же, как смарт-часы.

Вы должны иметь возможность адаптировать код в соответствии с вашими потребностями. Я разработал его так, чтобы вы могли просто добавлять пункты меню по своему усмотрению. Кроме того, сам код отображения полностью содержится в цикле FOR...NEXT с функциональностью, непосредственно следующей за ним, поэтому все, что вам нужно изменить, - это содержимое внутри цикла FOR...NEXT, чтобы изменить способ отображения.

 Смежные вопросы

  • Нет связанных вопросов^_^