如何获取具有ID的菜单项的文本

时间:2018-02-09 13:32:59

标签: visual-prolog

我有一个旧的视觉序言项目,我必须在运行时更改菜单的文本 这就是我改变文本所做的:

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_setTextmenu_Enable需要文本本身的常量一样正常。 (是的,我用菜单项的初始文本测试了menu_Enable,但是当文本发生变化时,一切都会中断)

我的问题出现了:

  

当我知道其ID而不是其名称时,如何启用/禁用菜单?
  如果不能直接使用,当我知道其ID时,如何获取菜单的当前名称?

如果这有帮助,这个项目将使用VIP52打开并编译(自2001年之前)。

1 个答案:

答案 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"找不到。

所以在尝试在这样的谓词中使用它之前,我需要从字符串中删除任何&符号。