菜单枚举记

来源:互联网 发布:广电网络突然不能上网 编辑:程序博客网 时间:2024/04/18 11:27
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

菜单枚举记

 

有一MDI应用程序,现假设要枚举出其能够得到系统命令响应所有菜单项的内容:如命令ID,资源名称,所在(子)菜单的句柄等,并对之进行操作。本文对此略述一二,未达意处,望各位海涵之外,以我之深度,唯与诸位共勉而已。

1、 我的迷惑

这几天修炼EnglishHelp,悟得些许正果,希望得与世人共超,尚不知是否有效,但为之而已。言归正传:

菜单项可以是菜单,反之亦然,此时菜单被称为子菜单;如果菜单项不是菜单,则它便是’纯菜单项’。以前我以为菜单中每一项都是菜单,我的思维中因此不再有菜单项的定义。可能这是个菜鸟级问题,但也可能您尚不甚解,那您不妨纸上谈兵一番,将最简单的菜单画上一画,再琢磨琢磨。

2、 菜单枚举算法

A、菜单抽象结构之一(树型抽象):



       现在要访问到这棵’树’的所有叶结点并处理之,方法如B所述。

 

B、枚举算法(深度遍历,语法)

1.      )求得当前结点的子结点数c;

2.      )循环查询当前结点的I(0<=I<c)子结点信息:

若该子结点I无下级子结点,则子结点I为叶结点,按需处理后,作I=I+1,重复此步骤;

否则子结点I为分枝结点,置下级子结点为当前结点,转向1;

             3.)遍历完毕。

intFindMenuItem(HMENUhmenu)//参数hmenu为分支结点资源标识

{

inti,c;

longres;

char*s=newchar[33];

MENUITEMINFOmii;

mii.cbSize=sizeof(MENUITEMINFO);

mii.fMask=MIIM_DATA|MIIM_ID|MIIM_SUBMENU|MIIM_TYPE|MIIM_STATE|MIIM_CHECKMARKS;

mii.dwTypeData=s;

 

c=GetMenuItemCount(hmenu);//获取当前菜单所有的菜单项数目

for(i=0;i<c;i++)

{      

mii.cch=32;//注意哦!

res=GetMenuItemInfo(hmenu,i,true,&mii);

if(res==0){deletes;return-1;}//如果获取菜单信息失败

if(mii.hSubMenu==NULL)//

        {

              //若该菜单项非子菜单,则在此作相应处理

              }

      else

              {

              //若该菜单项为子菜单,则如此处理

              res=FindMenuItem(mii.hSubMenu);//直接递归调用

              if(res==-1){deletes;return-1;}

              }

}

deletes;

return0;

}

 

intEnumMenuEndItems(HWNDhwnd)//开始遍历窗口菜单项。参数hwnd为菜单所在的窗体。

{

       HMENUhmenu=GetMenu(hwnd);

       if(hmenu==NULL)return–1;

       returnFindMenuItem(hmenu);

}            

注:此处代码仅仅描述算法。若应用到它处,根据不同的需要,Function的返回值和结点处理代码理所当然要发生改变。

   附录2为上述代码的PB文本,两者略有不同,以资参考。1<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击