Ошибка в управлении лентой?(вызывает отключение в Vista)

StackOverflow https://stackoverflow.com/questions/631961

  •  08-07-2019
  •  | 
  •  

Вопрос

Я обнаружил, что когда я беру простую форму, содержащую только ленту и строку состояния, она отключается.Элемент управления, который вы видите над строкой состояния, позже был удален.Одно и то же отключение происходит независимо от наличия элемента управления.Позже я удалил строку состояния и поместил туда вместо нее элемент управления memo с тем же результатом.

без ленточной планки:without ribbon bar
(источник: xrw.bc.ca)

с ленточной перекладиной:with ribbon bar
(источник: xrw.bc.ca)

я проиллюстрировал это некоторыми рисунками в 2, 4 и 8 пикселях от края.

not maximized
(источник: xrw.bc.ca)
maximized
(источник: xrw.bc.ca)

как говорит Крис Лайвли ниже, явно был допущен просчет с размерами.как я могу это исправить?

Спасибо вам за ваши комментарии!

Это было полезно?

Решение

Я неправильно понял проблему с моим предыдущим ответом.

У этой проблемы с просчетом есть обходной путь, с которым я смог быстро справиться.

Вы можете использовать собственный обработчик сообщений для WM_SYSCOMMAND с параметром w_Param SC_MAXIMIZE. Затем вы можете изменить размер своей формы, используя следующую информацию:

type
  TForm1 = class(TForm)
    // other stuff
    procedure WMSyscommand(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;



procedure TForm1.WMSysCommand(var Msg: TWMSYSCOMMAND);
var
  R: TRect;
begin
  // Test for SC_MAXIMIZE. If found...
  if Msg.CmdType = SC_MAXIMIZE then
  begin
    SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
    Top := R.Top;
    Left := R.Left;
    Width := R.Right - R.Left;
    Height := R.Bottom - R.Top;
    Msg.Result := 0; // Message handled
  end
  else
    DefaultHandler(Msg);
end;

Приведенный выше код (протестирован на Vista 32-bit Home Premium с включенным Aero / Glass) работает нормально.

 Изображение левого края ленты

 Изображение правого края ленты

 Изображение строки состояния

Другие советы

Решение, предложенное Кеном Уайтом, имеет несколько проблем:

  • Кнопка "Развернуть" остается активной, можно использовать маркеры изменения размера в развернутом окне
  • Не удалось восстановить окно до прежнего размера.

Поэтому я предлагаю следующее:

// add to form object
procedure WMGetMinMaxInfo(var mmInfo : TWMGETMINMAXINFO); message WM_GETMINMAXINFO;

// implementation
procedure TfrmMain.WMGetMinMaxInfo(var mmInfo: TWMGETMINMAXINFO);
var
  R: TRect;
begin
  with mmInfo.MinMaxInfo^ do
  begin
    SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
    ptMaxPosition.X := R.Left;
    ptMaxPosition.Y := R.Top;
    ptMaxSize.X     := R.Right - R.Left;
    ptMaxSize.Y     :=  R.Bottom - R.Top-1;
  end;
end;

Не идеально, так как я должен (по какой-то причине) настроить maxHeight на -1, чтобы обработчик по умолчанию не повторял самоутверждение и не перемещал окно в -8,-8,...Но у меня это работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top