Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Form на весь экран с Vcl styles


Автор: Illusion Dolphin 7.10.2012, 10:53
Актуально для XE2/XE3.
Если форма использует стили, то при полноэкранном режиме с включённом Aero (DwmCompositionEnabled and (Form.WindowState = wsMaximized)) форма "вылазит" за предоставленные пределы и часть контролов слва, справа и снизу обрезается.
Я попробовал исправить это через дополнение к TFormStyleHook:
Код

type
  TFormStyleHookEx = class(TFormStyleHook)
  private
    function GetBorderSize: TRect; //from TFormStyleHook
    procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
  end;

...

procedure TFormStyleHookEx.WMNCCalcSize(var Message: TWMNCCalcSize);
var
  Params: PNCCalcSizeParams;
  R: TRect;
begin
  inherited;

  if DwmCompositionEnabled and (Form.WindowState = wsMaximized) then
  begin
    R := GetBorderSize;

    Params := Message.CalcSize_Params;
    with Params^.rgrc[0] do
    begin
      Inc(Left, R.Left);
      Inc(Top, 0);
      Dec(Right, R.Right);
      Dec(Bottom, R.Bottom);
    end;
  end;
end;


Но это только уменьшает размеры клиентской области, чтобы она не влазила за экран, при этом контролы всё равно обрезаются, а на месте получившейся рамки не работает прорисовка. В аттаче пример и скриншоты. Кто может помочь? 

Заранее спасибо откликнувшимся!

P.S. пробовал перехватывать WM_GETMINMAXINFO - не удалось выставить корректные размеры формы (она вылазил за экран), поэтому код не привожу. Тут http://stackoverflow.com/questions/10936906/what-can-i-do-about-maximized-styled-windows-which-show-their-borders-on-adjac дан пример, который страдает проблемой - InflateRect(R, -1, -1);             // odd pixel - меньше на пиксель чем экран, если убрать строку (чтобы как раз на монитор) - то всё становится совсем неправильных размеров

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)