2009-03-10 1 views
2

Я обнаружил, что, когда я беру простую форму, содержащую только ленточный бар и строку состояния, это отсечка. Затем элемент управления, который вы видите над панелью состояния, был удален. Такое же обрезание происходит независимо от того, какой контроль присутствует. Позже я удалил строку состояния &, вместо этого поставил контрольный элемент с тем же результатом.Ribbon контроль ошибка? (вызывает обрезание в vista)

без ленты бар: without ribbon bar http://xrw.bc.ca/download/so/OnVista1.png

с лентой бар: with ribbon bar http://xrw.bc.ca/download/so/OnVista2.png

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

not maximized http://xrw.bc.ca/download/so/OnVista3.png maximized http://xrw.bc.ca/download/so/OnVista4.png

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

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

+0

erm ... не связанное с программированием? На самом деле, это даже вопрос? – luiscubal

+0

уверен, что это связано с программированием. Я пишу приложение delphi. –

+0

Луис, как это связано не с программированием? Если вы не знаете, что такое Delphi, или что это о написании приложения Delphi, возможно, вам не следует комментировать вопрос. –

ответ

2

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

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

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

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-битным Home Premium с Aero/Glass включен) работает отлично.

alt text http://clipperfunctions.com/images/ribbonleft.png

alt text http://clipperfunctions.com/images/ribbonright.png

alt text http://clipperfunctions.com/images/statusbar.png

+0

хорошая работа, кен! Спасибо! пару маленьких исправлений для тех, кто может использовать это позже: если Msg .CmdType = SC_MAXIMIZE затем ... SystemParametersInfo (SPI_GETWORKAREA, 0, @R, 0); –

+0

хорошая работа, кен! Спасибо! несколько крошечных исправлений для тех, кто может использовать это позже: [reposted, потому что HTML не отображается]. если Msg.CmdType = SC_MAXIMIZE, то ... SystemParametersInfo (SPI_GETWORKAREA, 0, @R, 0); –

+0

Спасибо за исправление, рентген. Я исправлю опечатку (я знал, что должен был скопировать и вставить вместо повторного набора. ) –

1

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

  • кнопка Maximize остается активным, можно использовать размер ручки на развернутом окне
  • Не удалось восстановить окно назад наш размер.

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

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

+0

звучит интересно, спасибо, я попробую, когда вернусь к этому! –

Смежные вопросы