Как отключить пункт меню «Переместить систему»? - PullRequest
6 голосов
/ 08 апреля 2010

В 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

Ответы [ 2 ]

4 голосов
/ 05 мая 2011

Если вы уничтожите пункт меню с помощью 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.

4 голосов
/ 08 апреля 2010

Это немного загадка, но это работает, если вы используете 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);
...