一个菜单处理的难题,谢了!

visualc 2003-10-20 09:56:22
现有
菜单条目1:名称:AAA,ID:2000
菜单条目2:名称:BBB,ID:2000
菜单条目3:名称:CCC,ID:2000

三条菜单使用同一个ID,添加了ID:2000的消息处理函数,如何在该函数中得出被选中菜单的文本呢?因为是同一个ID,所以想通过得到选择的是哪个文本来做不同的事。不想使用 BASEID+n 的方法。


...全文
40 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
visualc 2003-10-22
  • 打赏
  • 举报
回复
呵呵,我也认为还是算了吧。结贴!
icr_mio 2003-10-22
  • 打赏
  • 举报
回复
实在不好意思,一直没弄明白你的意思,现在我可是想通了。:)

我在PreTranslateMessage中截取了这个菜单消息,并且做了比较,
发现AAA,BBB,CCC三条菜单的消息内容基本是一样的,不同的就是time不一样。
而且如果你修改三条菜单任意一条的Prompt属性,其余两条也会跟着改变,也就是他们共享一个prompt。所以,我觉得虽然菜单能显示出三条,其实是资源如此定义(3条),而他们ID号相同,当用户选择了某个菜单条目,系统把那个条目的ID取出来,到代码中去寻找相应的处理,当然他找到的是一样的处理。

倒是在消息中有个叫pt的东东,里面存的是当产生消息时鼠标的位置,如果你只用鼠标来选择菜单,可以判断鼠标的位置来换算出用户选择的菜单。

最后建议你还是算了吧。
visualc 2003-10-21
  • 打赏
  • 举报
回复
是的,我原来也是使用预定义一串ID的方法,就是你提到的ON_COMMAND_RANGE(id1,id2,OnTest),只是想换换口味,想使用一些简单的方法。但是,现在知道是行不通的。
大家有没有想过,当鼠标在菜单上选择了一个菜单条目后,系统怎么知道我选择的是哪条的呢?系统是能够正确发送我选择的那条菜单的id给我的程序的。侯捷说,在user模块的帮助下,系统才把消息传递给我们的程序的。不知道user模块是如何帮助我们的。如果我们能知道系统如何做的,那么它既然能够传递给我我选择的ID,那我同样可以获得选择的文本
CounterHack 2003-10-21
  • 打赏
  • 举报
回复
同意 icr_mio(兄弟姐妹们,冲啊!) 的方法。
reed_cao 2003-10-21
  • 打赏
  • 举报
回复
longx的说法和我的建议是一样的。
在程序里,你一定得有一个唯一的标识,用名称'aaa'什么的是不标准的,容易产生兼容性的问题。
longx 2003-10-21
  • 打赏
  • 举报
回复
在 OnTest 这里是没办法区分的,最好还是使用 baseID+n的方法,处理函数只要定义为 afx_msg void OnTest(UINT nID), ON_COMMAND_RANGE(id1,id2,OnTest)就可以了,
icr_mio 2003-10-21
  • 打赏
  • 举报
回复
你可以写一个for循环
for(int i=0;i>-1;i++)
{
if(!GetMenuItemInfo(hMenu, i, TRUE,&mii))
break;

strMenuName=mii.dwTypeData;
if(strMenuName == "AAA")
{
……
}
else if(strMenuName == "BBB")
{
……
}
else if(strMenuName == "CCC")
{
……
}
}
这样行么?:)
visualc 2003-10-20
  • 打赏
  • 举报
回复
icr_mio(兄弟姐妹们,冲啊!) ,你提供的函数我明白。
那我的那个例子来说,菜单上3个条目,如果用户点了第二条菜单,也就是BBB那条,
void CMainFrame::OnTest()
{
//我在这如何调用那个函数呢?
GetMenuItemInfo(hMenu,//这个我知道
uItem, //这个如何赋值???
fByPosition, //这个我知道
lpmii //这个我知道)
}
reed_cao 2003-10-20
  • 打赏
  • 举报
回复
转换一下思路,如果你动态定义ID呢,动态申明消息处理函数?
icr_mio 2003-10-20
  • 打赏
  • 举报
回复
GetMenuItemInfo的第四个参数就是返回菜单信息的阿
LPMENUITEMINFO lpmii // menu item information
指向一个MENUITEMINFO结构。

typedef struct tagMENUITEMINFO {
UINT cbSize;
UINT fMask;
UINT fType;
UINT fState;
UINT wID;
HMENU hSubMenu;
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
ULONG_PTR dwItemData;
LPTSTR dwTypeData; //----->这里应该是名称吧
UINT cch;
HBITMAP hbmpItem;
} MENUITEMINFO, *LPMENUITEMINFO;
marorabbit 2003-10-20
  • 打赏
  • 举报
回复
有创意
visualc 2003-10-20
  • 打赏
  • 举报
回复
问题就在于我不知道是第几个item啊,我的菜单上只有3个条目
菜单条目1:名称:AAA,ID:2000
菜单条目2:名称:BBB,ID:2000
菜单条目3:名称:CCC,ID:2000

消息处理函数
ON_COMMAND(2000, OnTest)

void CMainFrame::OnTest()
{
CString strMenuName;

//问题在这,如何在这里得知选中的菜单条目的名字?

//假设已经取到了名字
if(strMenuName == "AAA")
{
……
}
else if(strMenuName == "BBB")
{
……
}
else if(strMenuName == "CCC")
{
……
}
}
visualc 2003-10-20
  • 打赏
  • 举报
回复
大家用过 vc 的Visual Assist吧,当安装后,在vc的工具条上点击右键,弹出的菜单,该菜单上面都是vc的工具条,倒数第二项默认是Toolbar1,是用来控制Visual Assist的工具条是否显示的条目。选择该菜单条目,可以控制Visual Assist的工具条是否显示。
兄弟当前也是要做这样一个工作,我有个一主程序,有n个扩展模块,这些模块都有自己的工具条,这些模块是另外安装的。当安装好后,在主程序中点右键,弹出工具条菜单,该菜单上要求具有了控制扩展模块工具条是否显示的菜单条目。如上面的Visual Assist和vc的关系。
我的扩展模块会有很多工具条。主框架上与其相对应的菜单的ID就是一个问题,我不想使用预定义一串ID的方法。
如果哪位大侠有好办法,请告知
icr_mio 2003-10-20
  • 打赏
  • 举报
回复
也就是说,你想取第几个item,就把uItem设成几
icr_mio 2003-10-20
  • 打赏
  • 举报
回复
UINT uItem的值是你给定的阿。
应该是0-base的吧
visualc 2003-10-20
  • 打赏
  • 举报
回复
ON_COMMAND(2000, OnTest)

void CMainFrame::OnTest()
{
//如何在这里得知选中的菜单条目的文本?
}

to:icr_mio(兄弟姐妹们,冲啊!)
面临同样的问题,如何在上面的函数中获得UINT uItem的值,如果不能得到该值,也就取不到正确的条目文本
阿甘 2003-10-20
  • 打赏
  • 举报
回复
我觉得问题的关键不在于区分这几个菜单项,而是找个更好的办法来不让这几个菜单项使用同一个ID,这样会好的多,楼主应该说一下这样用的原因
icr_mio 2003-10-20
  • 打赏
  • 举报
回复
对不起,搞错了,不是GetSubMenu
应该是(get from msdn)
GetMenuItemInfo
The GetMenuItemInfo function retrieves information about a menu item.

BOOL GetMenuItemInfo(
HMENU hMenu, // handle to menu
UINT uItem, // menu item
BOOL fByPosition, // meaning of uItem
LPMENUITEMINFO lpmii // menu item information
);
Parameters
hMenu
[in] Handle to the menu that contains the menu item.
uItem
[in] Identifier or position of the menu item to get information about. The meaning of this parameter depends on the value of fByPosition.
fByPosition
[in] Specifies the meaning of uItem. If this parameter is FALSE, uItem is a menu item identifier. Otherwise, it is a menu item position.
lpmii
[in/out] Pointer to a MENUITEMINFO structure that specifies the information to retrieve and receives information about the menu item.
Return Values
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, use the GetLastError function.

这个参数可以指定按照编号来取menuitem的信息。
BOOL fByPosition, // meaning of uItem

visualc 2003-10-20
  • 打赏
  • 举报
回复
不得已啊,呼呼
阿甘 2003-10-20
  • 打赏
  • 举报
回复
是啊,奇怪为什么要用同一个ID
加载更多回复(10)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧