各位前辈好,小弟想问一个问题,这个问题困扰我很久,还望各位前辈照顾小弟,给个方法。
在VB6中,我通过遍历法已知窗体上所有菜单的句柄、标题、以及层次结构。
但是我不知道怎么获取指定菜单项的名称。
比如某个菜单项:
                         Name=mnuFile
                         Caption="文件"我能得到“文件”这个标题,但是无法得到mnuFile这个名称。
我的思路是通过菜单句柄来获取这个菜单对象的名称。
找了很多API函数的例子,但是都无法获取。程序是我的程序,不是外部EXE。
菜单的名称我也知道,但是我需要通过函数来获取。我只能通过GetMenu这一类函数来获取句柄,但是怎么通过句柄获取“mnuFile”这样的名称?不要说传递对象作为参数,如果是这个,就没有烦恼了。

解决方案 »

  1.   

    1,你说的"通过遍历法已知窗体上所有菜单的句柄、标题、以及层次结构"是指用GetMenu等API获得的吗
    2,你的意思是不是,你这窗口上这些菜单,并不是用那些API创建的,而是你自己在IDE中用"菜单编辑器"创建的?
      

  2.   

    获取菜单控件名称,用控件集合controls枚举名称为mnuFile的控件。
      

  3.   

    回复 bcrun 君:
    1,你说的"通过遍历法已知窗体上所有菜单的句柄、标题、以及层次结构"是指用GetMenu等API获得的吗
      ----完全正确
    2,你的意思是不是,你这窗口上这些菜单,并不是用那些API创建的,而是你自己在IDE中用"菜单编辑器"创建的?
      ----完全正确我现在已经解决这个问题,用了一个笨办法,就是用 FOR EACH iControl IN Form.Controls
    然后用 IF TYPEOF iControl IS MENU            iControl.Name
    因为我发现VB的这个逻辑判断出来的菜单顺序其实和树的先序遍历得到的顺序是一样的。
    所以我在类模块中定义了一个结构体 TYPE
    Type TypeName
         cID=String     '菜单名称
         hwnd=Long      '句柄
    end type再定义这个结构体的数组
    先用For Each的方法将Name传入到数组中的cID成员中
    然后再用遍历法将菜单的Hwnd传入到数组的hwnd成员中获得的结果是正确的。
    如果大家有更好的方法还望多多赐教。  谢谢
      

  4.   

    Sorry。刚才这个问题比较愚蠢当我没有说好了。
    就是Check属性。而不是什么样式。
      

  5.   


    菜单的句柄还是取名
    hMenu=Long '句柄
    一类的,以后维护时方便些.
    有些人就干脆连创建菜单也不用VB6自带的菜单编辑器了.
    不过那样的话,响应菜单事件一般要用子类化处理,会麻烦一些.
    获取菜单信息用GetMenuItemInfo
    http://allapi.mentalis.org/apilist/GetMenuItemInfo.shtml