回 帖 发 新 帖 刷新版面

主题:菜单的制作方法(简介)

做菜单很简单,在下面我主要讲讲原理,这个也不需要什么高深的算法知识,但是又得去做,而且很多初学的人也不知道怎么做。
1、最简单的菜单选择(做了一个要显示的菜单后,用的是输入语句来判断你的选择 )
2、复杂一些的就是用键盘的上下键来选择菜单,(在后面我会讲到)

1、简单的
做了一个要显示的菜单后,用的是输入语句来判断你的选择,就象下面的这个
LOCATE 10,10:PRINT "1.TEST1"
LOCATE 11,10:PRINT "2.TEST2"

INPUT "INPUT ",M

IF M=1 THEN....
IF M=2 THEN....
.....
这个是个最简单的选择方式,不过,这个我们还可以改进,这个你输入以后还得按个回车键,如果把INPUT "INPUT ",M 这个语句改成M$=INPUT$(1):这样你只要一按1或者是2就会选择,当然还得把字符转换成数字,所以加上这个语句m=val(m$)
当然没有哪个成熟的软件会用这个方式来让大家来选择菜单项!不过这种方式代码少,写给自己或者很少人用用还是可以!

我们当然希望能用键盘上的上下键来选择菜单,那样就更人性化一些!
2、复杂些的!
我就用文本下的菜单选择来举例说明这个方法!
在这个大致上有这么几步
1,在屏幕上显示要选择的菜单项
2,一些初始化工作,把选择光条停在菜单的某一行中,记住这行
3,进入一个循环,对键盘进行捕捉(如果按的是下,就把行加一,如果是上就减一,如果按回车就退出循环)
4,先把旧的光条还原,再把光条停在新的行,(以前记住的旧行就更新)
5,根据选择执行相应的功能(最好用选择语句)
请看下面我给出的代码
CLS
''用一个数组来定义这些个菜单(这样选择会很方便)
DIM MenuTxt$(4)
MenuTxt$(0) = "Menu Demo 1.0 XXX:_QB45"
MenuTxt$(1) = " 1. Test1 "
MenuTxt$(2) = " 2. Test2 "
MenuTxt$(3) = " 3. Test3 "
MenuTxt$(4) = " 4. Exit "
''在屏幕上显示菜单(如果标题用些彩色的话效果会很好)
COLOR 4
LOCATE 3, 25: PRINT MenuTxt$(i)
COLOR 7
FOR i = 1 TO 4
    LOCATE 5 + i, 30: PRINT MenuTxt$(i)
NEXT i
''把光条停留在第一行,并且记住它(当燃你也可以停留在别的行,方便自己做成子程序)
Mx = 1 '  '这个是要停留的行 (在实用中最好定义成整数)
MxOld = Mx '  '这个是记住的行
COLOR 0, 7 '  '用颜色设置语句来加亮你要选择的行
LOCATE 5 + Mx, 30: PRINT MenuTxt$(1)
''进入一个循环判断
DO
   WHILE k$ = "": k$ = INKEY$: WEND'  '当键盘有键按就退出小循环
   IF k$ = CHR$(0) + "P" THEN Mx = Mx + 1'  '按的是下键就加1
   IF k$ = CHR$(0) + "H" THEN Mx = Mx - 1
   IF k$ = CHR$(13) THEN EXIT DO'      '按回车就退出
   IF Mx > 4 THEN Mx = 1'        '超过4行光条就回到第一行
   IF Mx < 1 THEN Mx = 4' '这里最大最小的行可以用个变量来定义会更方便
   COLOR 7, 0'  '把以前旧的行还原
   LOCATE 5 + MxOld, 30: PRINT MenuTxt$(MxOld)
   COLOR 0, 7'   '显示新的行
   LOCATE 5 + Mx, 30: PRINT MenuTxt$(Mx)
   MxOld = Mx: k$ = ""'  '把当前新的记住
LOOP

COLOR 7, 0
LOCATE 10, 5
''根据选择执行
SELECT CASE Mx
    CASE 1
      PRINT " You Select is  ";
      COLOR 29, 0
      PRINT 1
    CASE 2
      PRINT " You Select is  ";
      COLOR 29, 0
      PRINT 2
    CASE 3
      PRINT " You Select is  ";
      COLOR 29, 0
      PRINT 3

    CASE 4
      PRINT " Exit Program "
END SELECT
COLOR 7
END

回复列表 (共5个回复)

沙发

下面我们来把这个做成一个通用的菜单选择过程
在这里我们来看看这个需要的几个参数
菜单的横,树坐标,菜单的内容,菜单的开始行(焦点)
我们用一个过程MENUselect来返回你选择的行
MenuSelect% (MenuX%, MenuY%, Mx!, MenuTxt$())
过程中的MENUX%,MENUY%,是菜单的横,树坐标,MX是菜单开始的行,MENUTXT¥是菜单的内容

程序如下:
CLS
''用一个数组来定义这些个菜单(这样选择会很方便)
DIM MenuTxt$(4)
MenuTxt$(0) = "Menu Demo 1.0 XXX:_QB45"
MenuTxt$(1) = " 1. Test1 "
MenuTxt$(2) = " 2. Test2 "
MenuTxt$(3) = " 3. Test3 "
MenuTxt$(4) = " 4. Exit "
''在屏幕上显示菜单标题
COLOR 4
LOCATE 4, 25: PRINT MenuTxt$(i)
''调用菜单选择的过程,根据选择执行响应的功能
SELECT CASE MenuSelect%(6, 30, 1, MenuTxt$())  
    CASE 1
      PRINT " You Select is  ";
      COLOR 29, 0
      PRINT 1
    CASE 2
      PRINT " You Select is  ";
      COLOR 29, 0
      PRINT 2
    CASE 3
      PRINT " You Select is  ";
      COLOR 29, 0
      PRINT 3

    CASE 4
      PRINT " Exit Program "
END SELECT
COLOR 7


FUNCTION MenuSelect% (MenuX%, MenuY%, Mx, MenuTxt$())
''菜单选择的过程
''在屏幕上显示菜单
COLOR 7
MaxLine=UBOUND(MenuTxt$)
FOR i = 1 TO MaxLine
    LOCATE MenuX% + i, MenuY%: PRINT MenuTxt$(i)
NEXT i
MxOld = Mx '  '这个是记住的行
COLOR 0, 7 '  '用颜色设置语句来加亮你要选择的行
LOCATE MenuX% + MxOld, MenuY%: PRINT MenuTxt$(1)
''进入一个循环判断
DO
   WHILE k$ = "": k$ = INKEY$: WEND'  '当键盘有键按就退出小循环
   IF k$ = CHR$(0) + "P" THEN Mx = Mx + 1'  '按的是下键就加1
   IF k$ = CHR$(0) + "H" THEN Mx = Mx - 1
   IF k$ = CHR$(13) THEN EXIT DO'      '按回车就退出
   IF Mx > MaxLine THEN Mx = 1'        '超过最大行光条就回到第一行
   IF Mx < 1 THEN Mx = MaxLine' '超过最小行光条就回到最大行
   COLOR 7, 0'  '把以前旧的行还原
   LOCATE MenuX% + MxOld, MenuY%: PRINT MenuTxt$(MxOld)
   COLOR 0, 7'   '显示新的行
   LOCATE MenuX% + Mx, MenuY%: PRINT MenuTxt$(Mx)
   MxOld = Mx: k$ = ""'  '把当前新的记住
LOOP
MenuSelect% = Mx '返回选择的行
COLOR 7, 0
END FUNCTION

板凳


用过程的好处就是可以随便替换中的内容,下面我把菜单过程改成图形模式下,请大家看看效果!主程序我不大更改,主要改过程!
CLS
''用一个数组来定义这些个菜单(这样选择会很方便)
SCREEN 12   '图形模式
DIM MenuTxt$(4)
MenuTxt$(0) = "Menu Demo 1.0 XXX:_QB45"
MenuTxt$(1) = " 1. Test1 "
MenuTxt$(2) = " 2. Test2 "
MenuTxt$(3) = " 3. Test3 "
MenuTxt$(4) = " 4. Exit "
''在屏幕上显示标题
COLOR 4
LOCATE 4, 25: PRINT MenuTxt$(i)
''根据菜单过程选择执行响应功能
SELECT CASE MenuSelect%(6, 30, 1, MenuTxt$())
    CASE 1
      PRINT " You Select is 1 ";
    CASE 2
      PRINT " You Select is 2 ";
    CASE 3
      PRINT " You Select is 3 ";
    CASE 4
      PRINT " Exit Program "
END SELECT
COLOR 7

FUNCTION MenuSelect% (MenuX%, Menuy%, Mx, MenuTxt$())
'菜单选择过程
'定义和准备光条
DIM CursorLine%(322)
FOR i = 1 TO 322
     CursorLine%(i) = -1
NEXT i
CursorLine%(0) = 80
CursorLine%(1) = 16
''在屏幕上显示菜单
COLOR 7
FOR i = 1 TO UBOUND(MenuTxt$)
    LOCATE MenuX% + i, Menuy%: PRINT MenuTxt$(i)
NEXT i
MxOld = Mx '  '这个是记住的行
'图形模式和文本模式的坐标是有区别的,所以转化一下
Menuy% = Menuy% * 8 - 8
MenuX% = MenuX% - 1
'加亮行
PUT (Menuy%, (MenuX% + MxOld) * 16), CursorLine%
''进入一个循环判断
DO
   WHILE k$ = "": k$ = INKEY$: WEND'  '当键盘有键按就退出小循环
   IF k$ = CHR$(0) + "P" THEN Mx = Mx + 1'  '按的是下键就加1
   IF k$ = CHR$(0) + "H" THEN Mx = Mx - 1
   IF k$ = CHR$(13) THEN EXIT DO'      '按回车就退出
   IF Mx > 4 THEN Mx = 1'        '超过4行光条就回到第一行
   IF Mx < 1 THEN Mx = 4' '这里最大最小的行可以用个变量来定义会更方便
   PUT (Menuy%, (MenuX% + MxOld) * 16), CursorLine%
   PUT (Menuy%, (MenuX% + Mx) * 16), CursorLine%
   MxOld = Mx: k$ = ""'  '把当前新的记住
LOOP
MenuSelect% = Mx
END FUNCTION

3 楼


如果大家对上面的哪个语句的用法不清楚的话,先看书,然后可以问,拒绝回答不看书,不运行程序就发问的帖子!

4 楼

请问.......QB书  怎么我这里的书店都没有卖了呢?????????????   都是C,C++  VB了.....QB根本找不到了。......我应该去哪里买书呢??

5 楼

这是因为QB现在已经被淘汰了,你要QB书的话去学校看看学校那里应该有的,叫他们卖给你一本

我来回复

您尚未登录,请登录后再回复。点此登录或注册