Autor Beitrag
gmenzel
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 26.06.03 14:04 
Hallo Forum,

der Titel sagt eigentlich schon alles. Ich möchte das Einblenden der ScrollBars, die ein MDI-Parent erhält, wenn ein Child über den Rand hinausragt, unterdrücken (wie Windows Desktop).

Die ScrollBar-Eigenschaften der Form haben keinerlei Einfluß auf die MDI-ScrollBars. Auch mit CreateParams (WS_VSCROLL/WS_HSCROLL-Flags) ergibt sich keine Änderung.

Alternativ: Gibt es einen Ersatz für den Standard-MDI-Form-Client, also z.B. ein Panel, welches MDI-Childs aufnehmen und handeln kann?

Danke.
/GM
gmenzel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 27.06.03 17:19 
Hat keiner eine Idee?
toms
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: Fr 27.06.03 17:41 
Doch, Dr. Google hat viele Ideen:

groups.google.com/gr...N&tab=wg&lr=
gmenzel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 27.06.03 21:21 
Titel: Danke!
Auf die Google Groups hätt' ich nun wirklich auch selber kommen können! :wink:

Nach ein wenig Suchen fand sich hier auch tatsächlich eine Lösung für das Problem:

Zitat:

Since this question has come up so frequently in recent days i have modified a sample based on the stock MDI project to include this feature. The salient parts are quoted below.

Open the main forms unit in the IDE. If you don't have a handler for the OnCreate event, add one. In the handler you do this:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
  If ClientHandle <> 0 Then Begin
    If GetWindowLong( ClientHandle, GWL_USERDATA ) <> 0 Then
      Exit; // cannot subclass client window, userdata already in use
    SetWindowLong( ClientHandle, GWL_USERDATA, 
                   SetWindowLong( ClientHandle, GWL_WNDPROC, 
                                  integer( @ClientWindowProc)));
  End;

Add a new standalone function to the unit, it has to go above the FormCreate method since it is referenced in the statement above.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
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;

I clipped this code from a larger project, so lets hope i did not create errors in the process. What this code does is to subclass the client window the API way. It stores the old window function into the GWL_USERDATA field of the window structure since it is needed in the replacement window function, all messages need to be passed on to the old window function. There is only one message of interest in this case (the use of a Case results from the larger project, which handles more than this message): WM_NCCALCSIZE. The window gets this message when Windows tries to hide or show the scrollbars, among other cases. And it arrives *before* there is any painting of the scrollbar. So we can check if the window is going to sprout scrollbars and simply remove the scrollbar styles again.

For the purists: there is no need to undo the subclassing before the form is destroyed since the client window is destroyed before the form object.