Как отключить пункт меню системы перемещения?

В 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?

6
задан Andreas Rejbrand 9 April 2010 в 14:52
поделиться

1 ответ

Это немного загадка, но это работает, если вы используете 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);
4
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: