2016-06-21 6 views
2

誰かがこの作業を行うためのサンプルコードまたは手順を持っていますか?私は、矢印キーを使用して選択項目を入力する強調表示されたメニューを達成することはできませんでした。前もって感謝します!Qbasicハイライトメニュー、真剣に

更新! オプションが選択されたときにテキストを塗りつぶしている間に、各オプションのボックスを描画し、ボックスを色で再描画することで、この作業ができることを期待しています。私はINKEY $とSELECT CASE関数にはかなり慣れていますが、それをどのように因数分解するのか分かりません。

答えて

2

強調表示されたメニューがメニューを描画し、ループでキーを押すか、SLEEPを使用するのを待ちます。一般的な選択肢は、対応するメニューオプションを選択するために対応するキーを押すようにユーザーに通知する最初の数文字のうちの1つのテキスト色を単に変更することでした。たとえば、「Quit」の文字Qと「New Game」のNは、行内のテキストの残りの部分とは異なる色になります。

しかし、矢印キーを使用するように求めているので、そのようにしたくないことは明らかです。現在のメニュー項目をどのように強調表示するかは、使用中の画面モードによって異なります。画面モード11,12、および13では、背景色を指定することができません。モード7,8、および9の背景を表示するためにDOSBoxを表示することはできません。この問題の回避策として、現在の選択肢の隣にボックスを描き、ボックスを消去します(黒い線を引いたり、画面の背景色が何であれ)。または、アスタリスクを使用してグラフィックス/テキストサイズの問題を回避し、コードを単純化することもできます。 US-QWERTYキーボードが使用されていると仮定して、矢印キー、WASDキー、およびVimスタイルのキー(H =左、J =下、K =上、L =右)を含むボックススタイルの例をすべてサポートしています。矢印キーのみを使用したい場合は、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として、背景色をサポートしている画面モードを使用するか、何らかの形でハイライト表示された場合は、単にテキストモードで行全体の背景を「ハイライト表示」と逃げることができるかもしれません。ハイライトとして機能する「リバースビデオ」エフェクトを使用するには、画面の幅を指定する必要はありませんが、テキストだけでなくハイライトされた行全体を表示する方が効果的です。そのメニュー項目が印刷された後、色をデフォルトに戻して通常通り印刷を続行するだけです。以下、上記のコードにいくつかの変更(画面モード、画面幅設定、及びメニュー表示コード)を示し、それはそうでなければ同一のままである:私はすべてのためのカラーディスプレイとVGAアダプタを想定

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

注これは長い間、スマートな時計ほど小さいデバイスでさえも使用されている他の様々なディスプレイアダプタ規格に取って代わられてきた。

お客様のニーズに合わせてコードを修正する必要があります。私はあなたが望むようにメニューアイテムを追加できるように設計しました。また、表示コード自体は完全にFOR...NEXTループに含まれており、直後に機能が追加されるため、変更する必要があるのは、FOR...NEXTループ内の内容を変更するだけです。

関連する問題