Скрыть полосы прокрутки в форме MDI с помощью стилей VCL

Работа над настольным приложением, состоящим в основном из MDI parent form, где модули показаны как MDI Child form. Я хочу избавиться от полос прокрутки при перемещении дочерней формы за пределы клиента. Я уже установил для свойства AutoScroll значение False и попробовал следующее решение:

procedure TForm1.FormCreate(Sender: TObject);
begin
  if ClientHandle <> 0 then
  begin
    if (not (GetWindowLong(ClientHandle, GWL_USERDATA) <> 0)) then
    begin
      SetWindowLong(ClientHandle, GWL_USERDATA,
      SetWindowLong(ClientHandle, GWL_WNDPROC,
      Integer(@ClientWindowProc)));
    end;
  end;        
end;

function ClientWindowProc(wnd: HWND; Msg: Cardinal;  wParam, lParam: Integer): Integer; stdcall;
var
  f: Pointer;
begin
  f := Pointer(GetWindowLong(wnd, GWL_USERDATA));

  case Msg of
    WM_NCCALCSIZE: begin
                     if (GetWindowLong(wnd, GWL_STYLE) and (WS_HSCROLL or WS_VSCROLL)) <> 0 then
                       SetWindowLong(wnd, GWL_STYLE, GetWindowLong(wnd, GWL_STYLE) and not (WS_HSCROLL or WS_VSCROLL));
                   end;
  end;

  Result := CallWindowProc(f, wnd, Msg, wparam, lparam);
end;

Это работает как шарм, если стили VCL не включены. В противном случае я не могу поймать сообщение WM_NCCALCSIZE.

Я использую Delphi Rio 10.3.3 с включенным VCL Styles.


person Carlos M    schedule 29.07.2020    source источник
comment
Почему вы так подключаете клиент WndProc? Не проще ли переопределить ClientWndProc в основной форме?   -  person Peter Wolf    schedule 30.07.2020


Ответы (1)


Найден обходной путь при регистрации StyleHook:

TFixedFormStyleHook = class(TFormStyleHook)
  public
    procedure WMMDIChildMove(var Message: TMessage); message WM_MDICHILDMOVE;
  end;

 procedure TFixedFormStyleHook.WMMDIChildMove(var Message: TMessage);
  begin
    handled := true;
  end;

В начале выполнения:

  TCustomStyleEngine.RegisterStyleHook(TForm,TFixedFormStyleHook);
person Carlos M    schedule 30.07.2020
comment
Однако это решение не является пуленепробиваемым. Это будет работать, когда вы перемещаете дочерний MDI внутри родителя. Но полоса прокрутки появится, когда вы измените размер родителя таким образом, что полосы прокрутки необходимы. - person Peter Wolf; 30.07.2020