2006. március 5., vasárnap

MDI application without annoying ScrollBars


Problem/Question/Abstract:

I've been trying to create a MDI form without those annoying scrollbars when a child form is moved outside main form area and I couldn't find an easy way. Setting the scrollbars to visible := false won't work!
So, I found an example on a newsgroup... yeah! Here I show how to do it.

Answer:

It's a two step proccess.

Step one : put the code below inside the OnCreate event of the main form.

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;

Step two: Put this standalone function inside the unit that contains the main form, before the OnCreate event (once OnCreate references to this function).

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;

That's it!!!

The code was originally posted by Peter Below in a newsgroup (borland.public.delphi.objectpascal). I've made some little changes.

Nincsenek megjegyzések:

Megjegyzés küldése