Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Qbasic突出显示菜单,严重_Loops_Menu_Highlight_Qbasic - Fatal编程技术网

Loops Qbasic突出显示菜单,严重

Loops Qbasic突出显示菜单,严重,loops,menu,highlight,qbasic,Loops,Menu,Highlight,Qbasic,有人有一个示例代码或说明来实现这一点吗?我只是从来没有能够完成一个突出显示的菜单,使用箭头键和输入进行选择。提前谢谢 更新! 我通过为每个选项绘制框来预测这一工作,并在选择选项时用颜色重新绘制框,同时为文本着色,我只是不确定如何设计循环来实现这一点。我对INKEY$和SELECT CASE函数非常满意,但我不知道如何将其考虑在内 突出显示的菜单将绘制菜单,并在循环中等待按键或使用SLEEP。一个常见的替代方法是简单地更改前几个字母之一的文本颜色,通知用户按相应的键选择相应的菜单选项。例如,“Qu

有人有一个示例代码或说明来实现这一点吗?我只是从来没有能够完成一个突出显示的菜单,使用箭头键和输入进行选择。提前谢谢

更新!
我通过为每个选项绘制框来预测这一工作,并在选择选项时用颜色重新绘制框,同时为文本着色,我只是不确定如何设计循环来实现这一点。我对INKEY$和SELECT CASE函数非常满意,但我不知道如何将其考虑在内

突出显示的菜单将绘制菜单,并在循环中等待按键或使用
SLEEP
。一个常见的替代方法是简单地更改前几个字母之一的文本颜色,通知用户按相应的键选择相应的菜单选项。例如,“Quit”中的字母Q和“New Game”中的字母N的颜色将不同于行中的其余文本

但是,您要求使用箭头键,因此显然您不想这样做。突出显示当前菜单项的方式取决于使用的屏幕模式。屏幕模式11、12和13不允许您指定背景颜色,我无法让DOSBox使用模式7、8和9渲染背景。作为解决此问题的方法,您可以只在当前选择旁边绘制一个框并删除该框(绘制一个黑色框或任何屏幕背景颜色)。或者您可以使用星号来避免图形/文本大小问题,并简化代码。下面是一个方框样式的示例,其中包含箭头键、WASD键和Vim样式键(H=左、J=下、K=上、L=右),假设使用US-QWERTY键盘,则所有这些键都受支持。如果只需要箭头键,则只需将第一个(外部)
SELECT CASE…END SELECT
块更改为simply
If LEFT$(k$,1)=CHR$(0),然后…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
请注意,我假设上面的所有代码都使用带有彩色显示的VGA适配器,这一点早已被各种其他显示适配器标准所取代,这些标准甚至在像智能手表这样的小型设备上也在使用

您应该能够调整代码以满足您的需要。我设计它的目的是,你可以简单地添加菜单项,如你所愿。此外,显示代码本身完全包含在
FOR…NEXT
循环中,其功能紧随其后,因此您需要更改的只是
FOR…NEXT
循环中的内容,以更改显示方式

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