Cacher ScrollBar de MainMDI

Résolu
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 13 nov. 2006 à 14:47
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 14 nov. 2006 à 09:17
salut tout le monde,

j'ai une question assez pointue...

Dans mon applic MDI, j'aimerais cacher les scroll bar (bar de défilement) lorsque qu'une fenêtre MDI est en dehors de la zone client.

Jusqu'a maintenant, j'utilisais le code suivant:

function ClientWindowProc(wnd: HWND; msg: Cardinal; wparam, lparam: Integer ): Integer; stdcall;
var
f: Pointer;
int : integer;
begin
f := Pointer( GetWindowLong( wnd, GWL_USERDATA ));
case msg of
WM_NCCALCSIZE
// , WM_STYLECHANGING // change rien
:
begin
// if ( GetWindowLong( wnd, GWL_STYLE ) and
// (WS_HSCROLL or WS_VSCROLL)) <> 0 then
int := SetWindowLong(
wnd,
GWL_STYLE,
GetWindowLong(wnd, GWL_STYLE) and not
(WS_HSCROLL or WS_VSCROLL)
);
if int = 0 then begin
putdebugstring('Error : ' + inttostr(GetLastError));
end;
end;
end;
Result := CallWindowProc(f, wnd, msg, wparam, lparam);
end;

procedure TMainForm.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;

Ce code fonctionne sur le projet d'exemple "MDI application" de delphi. Mais pas sur mon projet.
Les appels se font correctement, les handle sont juste, les valeurs de retour aussi.

Comme j'ai pas trouver pourquoi cela marchait plus (j'ai rien changé qui soit lié au message ou au create et je sais pas exactement quand ce problème est apparut), je me suis mis a chercher une solution altérnative. (je sais, c'est pas une solution, mais il faut bien que je masque ces bars...)

j'ai essayer de traiter WM_STYLECHANGING (devrait être tiger lorsque les scroll bar devienne visible):
procedure TMainForm.WMSTYLECHANGING(var Message: TWMSTYLECHANGING);
begin
if message.StyleType = GWL_STYLE then begin
message.StyleStruct^.styleNew := message.StyleStruct^.styleNew and (not (WS_HSCROLL or

WS_VSCROLL));
// Message.Result := 0;
end;
// else
inherited;
// je pense que cela ne marche pas parceque je traiter les message de la form et non de la zone client
end;

et WM_NCCALCSIZE(devrait être tiger lorsque les scroll bar devienne visible):
procedure TMainForm.WMNCCALCSIZE(var Message: TWMNCCALCSIZE);
begin
if SetWindowLong(
ClientHandle,
GWL_STYLE,
GetWindowLong(ClientHandle, GWL_STYLE) and not
(WS_HSCROLL or WS_VSCROLL)
)
= 0 then begin
putdebugstring('Error : ' + inttostr(GetLastError));
end;
inherited;
// devrait marcher, vu que la zone client est aussi redimensionnée lorsque la form l'est.
end;

sans résultat.

j'ai aussi essayer de changer les paramètres envoyer à CreateWindowEx avec:
procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
// http://msdn2.microsoft.com/en-us/library/ms632680.aspx
inherited;
params.Style := Params.Style and (not(WS_HSCROLL or WS_VSCROLL));
end;


j'ai aussi essayer la function ShowScrollBar (appel explicite avec un btn)

ShowScrollBar(Handle,SB_BOTH, longbool(0)); //dans le doute...
ShowScrollBar(ClientHandle,SB_BOTH, longbool(0));
avec ça, j'ai juste réussit a empecher window de repeindre la zone des scroll bar.


j'ai aussi essayé:
procedure TMainForm.WMCREATE(var message: TWMCREATE);
begin
inherited;
message.CreateStruct^.style := message.CreateStruct^.style and (not(WS_HSCROLL or WS_VSCROLL));
message.CreateStruct^.dwExStyle := message.CreateStruct^.dwExStyle and not WS_EX_RIGHTSCROLLBAR;
inherited;
end;
Là, c'est carrément sans effet.

Je pense qu'un des problèmes est lié au fait que le handle de la zone client n'est pas le même que celui de la fenêtre et que par conséquent on ne peut pas masquer les scroll bar d'une fenêtre MainMDI de la même façon qu'une fenêtre normal.

Mais j'arrive pas à cacher ces *#%& bars....


Est-ce que qqun à une idée pourquoi le code qui marche sur un projet d'exemple ne marche pas sur mon projet?

Est-ce que qqun connaît un moyen de cacher ces bars?

Au pire, comment changer la taille des scroll bar d'une fenetre uniquement?
(self.VertScrollBar.Size := 1; est sans effet, car affect les scroll bar "normal" et non celle de MainMDI form. enfin c'est que je pense)

Est-ce que vous voyer une erreur dans mes essais?

Est-ce que qqun sait comment récuper le handle des scroll bar pour pouvoir faire une appel a ShowScrollBar avec la class et non la fenêtre?
(http://msdn2.microsoft.com/en-us/library/ms651296.aspx)

Je suis peut-être passé à côté d'un truc évident pour vous, enfin moi je vois pas...

merci d'avance...

Context:
Win Xp SP2
Delphi 9.0
JEDI VCL 3.1 (mais j'ai désactivé les LoadFromTree vu que cela a pas mal de "side-effect")

1 réponse

cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
14 nov. 2006 à 09:17
une nuit de sommeil rend tout plus clair.

J'avait un

position := poDefault;

dans mon FomrCreate. En l'enlevant, mon code (ClientWindowProc) marche pour mon projet. :D

(si qqun sait pourquoi, ca m'intéresse)
3
Rejoignez-nous