Ошибка контроля ленты? (вызывает обрезание в перспективе) - PullRequest
2 голосов
/ 10 марта 2009

Я обнаружил, что когда я беру простую форму, содержащую только строку ленты и строку состояния, это обрезается. Элемент управления, который вы видите над строкой состояния, был позже удален. Такое же отключение происходит независимо от наличия контроля. Позже я удалил строку состояния и поместил там элемент управления 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 )

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

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

Ответы [ 2 ]

2 голосов
/ 11 марта 2009

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

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

Вы можете использовать собственный обработчик сообщений для 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) работает нормально.

Image of ribbon left end

Image of ribbon right end

Image of status bar

1 голос
/ 14 января 2010

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

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

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

// 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, ... Но это работает для меня.

...