在Microsoft Windows中,此作品:

 mnu := GetSystemMenu(h, false);
 EnableMenuItem(mnu, SC_CLOSE, MF_BYCOMMAND or MF_GRAYED);

但是,这不工作:

 mnu := GetSystemMenu(h, false);
 EnableMenuItem(mnu, SC_MOVE, MF_BYCOMMAND or MF_GRAYED);

因此,我知道如何禁用窗口的“关闭”系统菜单项,而不是“移动”项目。我该怎么做呢?

<强>更新

当然一个替代使用非常好的功能EnableMenuItem中,是使用SetMenuItemInfo:

  FillChar(info, sizeOf(info), 0);
  with info do
  begin
    cbSize := sizeOf(info);
    fMask := MIIM_STATE;
    fState := MFS_GRAYED;
  end;
  SetMenuItemInfo(mnu, SC_MOVE, false, info);

但是,这一次完全适用于SC_CLOSE,但不是为SC_MOVE!

<强>更新2

即使问题是在这个意义上解决了工作代码已被发现,“做工作”,可以这么说,它会听到关于该问题的原因的假设是很有意思:为什么SC_CLOSE工作,但不SC_MOVE?

有帮助吗?

解决方案

这是一个有点神秘,但如果你使用ModifyMenu或DeleteMenu它的工作原理:

   HMENU mnu = GetSystemMenu(hWnd, false);
   DeleteMenu(mnu, SC_MOVE, MF_BYCOMMAND);

或:

   HMENU mnu = GetSystemMenu(hWnd, false);
   MENUITEMINFO info = { sizeof(MENUITEMINFO) };
   TCHAR name[256] = _T("Cannot move");
   info.fMask = MIIM_TYPE;
   info.dwTypeData = name;
   info.cch = sizeof(name) / sizeof(TCHAR);
   GetMenuItemInfo(mnu, SC_MOVE, false, &info);
   ModifyMenu(mnu, SC_MOVE, MF_BYCOMMAND | MF_GRAYED, 0, info.dwTypeData);

其他提示

如果你破坏使用DeleteMenu()菜单项,你就会使应用程序无法移动(即使使用光标)。

的关键是暂时删除该项目。

首先,保存“移动”项的使用下面的语句的说明:

GetMenuString(hMenu, SC_MOVE, szMoveCaption, MAX_PATH, MF_BYCOMMAND);

然后,从菜单中删除项目:

RemoveMenu(hMenu, SC_MOVE, MF_BYCOMMAND);

,当你需要的 “移动” 项背,只需使用InsertMenu()

InsertMenu(hMenu, 0, MF_BYPOSITION, SC_MOVE, szMoveCaption);

PS。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top