cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 2009
-
13 nov. 2006 à 14:47
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 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)