Comment contrôler le placement d'une fenêtre enfant MDI (FormStyle: = fsMDIChild) dans Delphi ou C++ Builder? Je sais que je peux définir Gauche, Haut, Position, etc., mais pour un enfant MDI en particulier, ils ne prennent effet qu'après que la fenêtre a déjà été créée et affichée dans son emplacement par défaut. Le résultat est que la création et le positionnement de plusieurs fenêtres à la fois donnent lieu à un peu de scintillement lorsque les fenêtres sont créées dans leurs positions par défaut, puis immédiatement déplacées et redimensionnées. De la recherche dans la source VCL, la seule solution que j'ai pu trouver est de remplacer la méthode CreateParams de TCustomForm et de modifier les champs X, Y, Width et Height du paramètre Params, mais cela ressemble à un hack . Y a-t-il une façon plus propre de faire cela?Contrôle du placement des fenêtres fsMDIChild dans Delphi
Répondre
Je n'observe aucun scintillement du tout, mais cela peut être dû au fait que mon ordinateur est trop rapide ou que cela peut constituer une amélioration de Windows 7 pour réduire le scintillement.
je régler la position de la fenêtre MDI enfant à sa FormShow:
procedure TForm2.FormShow(Sender: TObject);
begin
Top := 200;
Left := 400;
end;
Vous pouvez envoyer WM_SETREDRAW
messages à clientHandle du MainForm, l'un avec l'wParam définie sur False, puis plus tard avec la wParam définie sur True, éviter le clignotement pendant que vous configurez une fenêtre enfant MDI, par exemple:
Delphi:
SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, False, 0);
try
Child := TChildForm.Create(Self);
Child.Left := ...;
Child.Top := ...;
Child.Show;
finally
SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, True, 0);
InvalidateRect(Application.MainForm.ClientHandle, nil, True);
end;
C++:
SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, FALSE, 0);
try
{
Child = new TChildForm(this);
Child->Left = ...;
Child->Top = ...;
Child->Show();
}
__finally
{
SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, TRUE, 0);
InvalidateRect(Application->MainForm->ClientHandle, NULL, TRUE);
}
Merci. J'ai dû utiliser RedrawWindow au lieu de InvalidateRect pour que les enfants MDI soient correctement redessinés, comme décrit à http://msdn.microsoft.com/en-us/library/dd145219%28VS.85%29.aspx sous "Remarques". –
J'utilise InvalidateRect() et ça marche très bien pour moi. Les remarques se réfèrent à un ListBox, pas une fenêtre MDI. –
Merci. J'essayais de le faire depuis le constructeur et je n'avais pas réalisé que OldCreateOrder était réglé sur true. Une fois que j'ai fixé OldCreateOrder, en utilisant le constructeur et FormShow les deux fonctionnent. –