本帖最后由 蓝烟清 于 2013-3-27 22:36 编辑
由于代码比较长,就把废话先放前边,希望大家能认真看应 苍天泰坦 的需求,我把这个函数做了一些修改,首先是灰色不能选择,第二个是可以指定某些选项不显示
每个参数的说明写在这
--基本参数和ShowMenu一样,有一些特别的进行着重说明
--menu 每个数据三个值,1名称,2执行函数,3显示方式(0灰色可选择,1正常显示,2不显示, 3灰色不可选择)
--itemNum 菜单的个数,通常在调用的时候 #menu就可以了
--numShow 每行显示的菜单个数
--showRow 一个版面显示的最大行数,如果可显示菜单个数达不到一个版面的数,函数会自动适应这个值
--str 是标题的文字,传nil不显示
在7.0之后的版本呢,还增加了一个特性,让选中项在版面的中间显示,超过中间就会显示下一行,而不像之前那样到达底部才会显示下一行。可能说得比较抽象,大家可以体验一下
代码很长,参数很多,理解很难,多用几次就了解了- --基本参数和ShowMenu一样,有一些特别的进行着重说明
- --menu 每个数据三个值,1名称,2执行函数,3显示方式(0灰色可选择,1正常显示,2不显示, 3灰色不可选择)
- --itemNum 菜单的个数,通常在调用的时候 #menu就可以了
- --numShow 每行显示的菜单个数
- --showRow 一个版面显示的最大行数,如果可显示菜单个数达不到一个版面的数,函数会自动适应这个值
- --str 是标题的文字,传nil不显示
- function ShowMenu2(menu,itemNum,numShow,showRow,x1,y1,x2,y2,isBox,isEsc,size,color,selectColor, str) --通用菜单函数
- local w=0;
- local h=0; --边框的宽高
- local i,j=0,0;
- local col=0; --实际的显示菜单项
- local row=0;
-
- lib.GetKey();
- Cls();
-
- --建一个新的table
- local menuItem = {};
- local numItem = 0; --显示的总数
-
- --把可显示的部分放到新table
- for i,v in pairs(menu) do
- if v[3] ~= 2 then
- numItem = numItem + 1;
- menuItem[numItem] = {v[1],v[2],v[3],i}; --注意第4个位置,保存i的值
- end
- end
-
- --计算实际显示的菜单项数
- if numShow==0 or numShow > numItem then
- col=numItem;
- row = 1;
- else
- col=numShow;
- row = math.modf((numItem-1)/col);
- end
-
- if showRow > row + 1 then
- showRow = row + 1;
- end
- --计算边框实际宽高
- local maxlength=0;
- if x2==0 and y2==0 then
- for i=1,numItem do
- if string.len(menuItem[i][1])>maxlength then
- maxlength=string.len(menuItem[i][1]);
- end
- end
- w=(size*maxlength/2+CC.RowPixel)*col+2*CC.MenuBorderPixel;
- h=showRow*(size+CC.RowPixel) + 2*CC.MenuBorderPixel;
- else
- w=x2-x1;
- h=y2-y1;
- end
- local start=0; --显示的第一项
- local curx = 1; --当前选择项
- local cury = 0;
-
- local current = curx + cury*showRow;
- local keyPress =-1;
- local returnValue =0;
- if str ~= nil then
- DrawStrBox(-1, y1 - size - CC.RowPixel, str, color, size)
- end
- local surid = lib.SaveSur(0, 0, CC.ScreenW, CC.ScreenH)
- if isBox==1 then
- DrawBox(x1,y1,x1+w,y1+h,C_WHITE);
- end
- while true do
- if col ~= 0 then
- lib.LoadSur(surid, 0, 0)
- if isBox == 1 then
- DrawBox(x1, y1, x1 + (w), y1 + (h), C_WHITE)
- end
- end
- for i=start,showRow+start-1 do
- for j=1, col do
- local n = i*col+j;
- if n > numItem then
- break;
- end
-
- local drawColor=color; --设置不同的绘制颜色
- if menuItem[n][3] == 0 or menuItem[n][3] == 3 then
- drawColor = M_DimGray
- end
- local xx = x1+(j-1)*(size*maxlength/2+CC.RowPixel) + CC.MenuBorderPixel
- local yy = y1+(i-start)*(size+CC.RowPixel) + CC.MenuBorderPixel
- if n==current then
- drawColor=selectColor;
- lib.Background(xx, yy, xx + size*maxlength/2, yy + size, 128, color)
- end
- DrawString(xx,yy,menuItem[n][1],drawColor,size);
- end
- end
- ShowScreen();
- keyPress=WaitKey();
- lib.Delay(CC.Frame);
- if keyPress==VK_ESCAPE then --Esc 退出
- if isEsc==1 then
- break;
- end
- elseif keyPress==VK_DOWN then --Down
- if curx + (cury+1)*col <= numItem then
- cury = cury + 1;
- if cury > row then
- cury = row;
- elseif cury >= showRow/2 and cury <= row - showRow/2 and start <= row-showRow then
- start = start + 1;
- end
- end
-
- elseif keyPress==VK_UP then --Up
- cury = cury -1;
- if cury < 0 then
- cury = 0;
- elseif cury >= showRow/2-1 and cury < row - showRow/2 and start > 0 then
- start = start - 1;
- end
-
- elseif keyPress==VK_RIGHT then --RIGHT
- curx = curx +1;
- if curx > col then
- curx = 1;
- elseif curx + cury*col > numItem then
- curx = 1;
- end
- elseif keyPress==VK_LEFT then --LEFT
- curx = curx -1;
- if curx < 1 then
- curx = col;
- if curx + cury*col > numItem then
- curx = numItem - cury*col;
- end
- end
- elseif (keyPress==VK_SPACE) or (keyPress==VK_RETURN) then
- current = curx + cury*col;
- if menuItem[current][3]==3 then
-
- elseif menuItem[current][2]==nil then
- returnValue=current;
- break;
- else
- local r=menuItem[current][2](menuItem,current); --调用菜单函数
- if r==1 then
- returnValue= -current;
- break;
- else
- lib.LoadSur(surid, 0, 0)
- if isBox==1 then
- DrawBox(x1, y1, x1 + (w), y1 + (h), C_WHITE)
- end
- end
- end
- end
-
- current = curx + cury*col;
- end
- lib.FreeSur(surid)
-
- --返回值,这个是取第4个位置的值
- if returnValue > 0 then
- return menuItem[returnValue][4]
- else
- return returnValue
- end
- end
复制代码 效果图是这样
也可以这样
|