frank21 发表于 2008-12-2 14:59:03

请教傻孩子的目录引擎中ShowMenu函数【恢复】

最近在做一个LCD16*2的模块,幸好论坛上看到傻孩子发过他目录的引擎代码,

http://ouravr.com/bbs/bbs_content.jsp?bbs_sn=457580&bbs_page_no=1&search_mode=1&search_text=%B2%CB%B5%A5&bbs_id=9999



拿来好好学习,由于功力不够,在解读其中一个ShowMenu函数是有点看不懂,特来向各位请教。

先说说我的理解,

其中全局变量(*MenuPoint)是指向当前目录的结构体指针,DisplayPoint用来表示显示目录,UserChoose表示用户选择目录,MaxItem表示当前目录一共有几个项目。



我不太明白,

DisplayStart是做什么用?

为什么显示的时候有 if (MaxItems>= 4)的区分?



/***********************

*     全局变量声明区   *

***********************/



    

    struct MenuItem (*MenuPoint) = MainMenu;

    short DisplayStart = 0;

    short UserChoose = 0;

    short DisplayPoint = 0;

    short MaxItems;    



/**************************************************************

*  函数说明:目录显示函数                                     *

**************************************************************/

void ShowMenu(void)

{

    short n = 0;



    MaxItems = MenuPoint.MenuCount;

    DisplayPoint = DisplayStart;

        if (MaxItems>= 4)

        {

             for (n = 0;n<4;n++)

             {

                         

                 LOCATE(n+1,1);

                 PRINT(MenuPoint.DisplayString);

                 

                 if ((DisplayPoint) == UserChoose)

                     {

                         BOX(1,n*16+1,126,(n+1)*16-2,1,1);

                     }

                 

                     DisplayPoint +=1;

                     if ((DisplayPoint) == (MaxItems))

                     {

                         DisplayPoint = 0;

                     }

             }

         }

         else

         {

             for (n = 0;n<MaxItems;n++)

             {

                         

                 LOCATE(n+1,1);

                 PRINT(MenuPoint.DisplayString);

                 

                 if ((DisplayPoint) == UserChoose)

                     {

                         BOX(1,n*16+1,126,(n+1)*16-2,1,1);

                     }

                 

                     DisplayPoint +=1;

                     if ((DisplayPoint) == (MaxItems))

                     {

                         DisplayPoint = 0;

                     }

                 

             }

         }

        //BOX(0,0,127,63,2,2);

}

Gorgon_Meducer 发表于 2008-12-3 18:31:48

to 【3楼】 frank21 

    对不起,忘记提供参考链接了,现在补上

    http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=827434&bbs_page_no=2&bbs_id=1038

    有什么问题大家多多交流哈

    

    

frank21 发表于 2008-12-3 04:43:47

谢谢yan97ao 



思维定势阿,想着自己做1602,就把傻孩子的程序往这方面想,进了死胡同了。

而且看程序不仔细,刚才看了LOCATE     PRINT   BOX函数,对功能基本理解了



【2楼】 Gorgon Meducer 傻孩子 

关于1602的菜单引擎,你参考的那个太老了。

这里有一个新的,有具体的范例的,使用1602实现。



请问新的是在你论坛置顶的头文件中吗?

Gorgon_Meducer 发表于 2008-12-2 21:05:57

关于1602的菜单引擎,你参考的那个太老了。

这里有一个新的,有具体的范例的,使用1602实现。

yan97ao 发表于 2008-12-2 18:14:09

傻孩子的这个函数默认情况下一屏显示四个菜单项,所以判断if (MaxItems>= 4)就是判断你所存储的所有菜单项在一屏以内能不能装得下

至于DisplayStart可以当做一个“指针”,指向屏幕上要显示的第一个菜单项对应的MenuPoint数组的下标
页: [1]
查看完整版本: 请教傻孩子的目录引擎中ShowMenu函数【恢复】