我有一个旧的视觉序言项目,我必须在运行时更改菜单的文本 这就是我改变文本所做的:
menu_setText(Win, id_menu, NewMenuText)
这很好,但是,当我想启用/禁用此菜单时,以下操作不起作用(意味着菜单项不会改变其状态):
menu_Enable(Win, id_menu, b_true)
经过一番搜索,我发现:
在MS-Windows下,资源标识符不能引用子菜单。如果子菜单的菜单项,需要启用,禁用,选中或更改文本。有必要使用特殊版本的 menu_Enable , menu_Check 和 menu_SetText 谓词,它们指定菜单项的文本而不是常量。
menu_Enable(WinHandle, String, BOOLEAN)
menu_Check(WinHandle, String, BOOLEAN)
menu_SetText(WinHandle, String, NewString)
奇怪的是,就我而言,menu_setText
与menu_Enable
需要文本本身的常量一样正常。 (是的,我用菜单项的初始文本测试了menu_Enable
,但是当文本发生变化时,一切都会中断)
我的问题出现了:
当我知道其ID而不是其名称时,如何启用/禁用菜单?
如果不能直接使用,当我知道其ID时,如何获取菜单的当前名称?
如果这有帮助,这个项目将使用VIP52打开并编译(自2001年之前)。
答案 0 :(得分:0)
我终于找到了解决我问题的解决方法,但我仍然不满意,所以如果有人想出更好的答案,我会接受它!
我宣布:
txt_menu(menu_tag,string)
然后叫:
txt_menu(id_menu, MenuText),
menu_setText(Win, MenuText, NewText),
retractAll(txt_menu(id_menu,_)),
assert(txt_menu(id_menu,NewText)),
menu_Update(Win)
每当我必须更改菜单项的文本时,这可以很容易地转换为menu_setTextById
谓词:
menu_setTextById(Win, MenuId, NewText):-
txt_menu(MenuId, MenuText),
menu_setText(Win, MenuText, NewText),
retractAll(txt_menu(MenuId,_)),
assert(txt_menu(MenuId, NewText)),
menu_Update(Win).
用法:
menu_setTextById(Win, id_menu, "My new text menu").
注意到如果我需要有多个带菜单的窗口,我必须将窗口ID添加到我的txt_menu
子句中。
此解决方法的主要问题是我无法在新文本菜单中使用&
,因为如果我的菜单有"& Menu"作为文本(意味着M
将加下划线),然后尝试使用menu_setText(Win,"&Menu","New Menu")
将会中断因为"& Menu"找不到。
所以在尝试在这样的谓词中使用它之前,我需要从字符串中删除任何&符号。