8

在 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 无效?

4

2 回答 2

6

这有点神秘,但如果您使用 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);
于 2010-04-08T19:15:03.123 回答
4

如果您使用 破坏菜单项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。

于 2011-05-05T12:30:12.850 回答