Question

Il y a le bon composant pour maximiser une fenêtre enfant dans un espace client (la touche SHIFT doit être maintenue enfoncée) - NLDExtraMDIProps.

Ou ce code peut être utilisé :

procedure WMSIZE(var Msg: TMessage); message WM_SIZE;

procedure TForm2.WMSIZE(var Msg: TMessage);
begin
  inherited;
  if Msg.WParam = SIZE_MAXIMIZED then
  begin
    ShowWindow(Handle, SW_RESTORE);
    Left := 0;
    Top := 0;
    Width := Form1.ClientWidth - 4; // The BORDER
    Height := Form1.ClientHeight - 4;
  end;
end;

Mais maximiser n’est pas vraiment maximiser.La fenêtre enfant est uniquement alignée sur la zone client.Il doit automatiquement redimensionner et s'adapter à la zone client lorsque la fenêtre parent est redimensionnée, le bouton système maximiser/restaurer doit changer, etc.

J'essaie d'obtenir les effets décrits ci-dessous.

Comme vous le voyez sur les photos les fenêtres enfants sont maximisées, et

1) ils ne prennent pas toute la fenêtre parent (uniquement l'espace client).

2) C'est impossible de bouger placez-les sur la barre de légende/titre car ils sont maximisés.

3) Ils ont le bouton de restauration, plus le bouton Agrandir.

4) Ils sont aligné vers l'espace client (le redimensionnement de la fenêtre parent entraîne le redimensionnement de celle enfant au sein de l'espace client).

Le code de ma question et le composant n'aiment pas les fenêtres enfants sur les images.

Pouvons-nous créer une fenêtre vraiment maximisée (pas seulement alignée) ?

Pas maximisé (pas bon ;le composant et le code de ma question maximisent comme sur ces images) :

enter image description here enter image description here

Maximisé (ce dont j'ai besoin):

enter image description here enter image description here

Était-ce utile?

La solution

Je ne comprends pas votre problème.La maximisation d'une fenêtre enfant MDI se fait :

  • par programmation :en utilisant ShowWindow(ActiveMDIChild.Handle, SW_MAXIMIZE),
  • manuellement:en cliquant sur l'icône Agrandir la bordure ou en double-cliquant sur la légende du formulaire.

Ces deux actions entraînent :

  • la disparition de la bordure de la fenêtre enfant (se réduit à la bordure du formulaire MDI),
  • l'ajout de petites icônes de bordure (pour la fenêtre enfant) à la barre de menu principale,
  • un effet de redimensionnement similaire à celui de Align=alClient.

Pour limiter l'espace disponible pour les fenêtres enfants dans le formulaire principal, veillez à aligner les contrôles fenêtrés sur les bords du formulaire.

Réglage du Align ou Anchors les propriétés des fenêtres enfants MDI n’ont aucun effet :ils ne font plus partie de l'implémentation d'alignement VCL par défaut ;Windows a repris ce travail.

Si vous souhaitez intervenir sur le redimensionnement d'un enfant MDI, alors la manipulation WM_SIZE est la mauvaise approche, car ce message est envoyé après le redimensionnement.Au lieu de cela, gérez WM_SYSCOMMAND comme je l'ai expliqué ici.

Quant à mon composant auquel vous faites référence :

  • La maximisation manuelle en cliquant sur l'icône Maximiser la bordure fait exactement cela :une opération de maximisation par défaut comme indiqué ci-dessus,
  • La maximisation manuelle en cliquant sur l'icône de bordure Maximiser - tout en maintenant la touche Maj enfoncée - redimensionne la fenêtre enfant à la taille le plus grand espace libre dans le formulaire MDI.Dans ce cas, le redimensionnement du formulaire principal MDI ne redimensionne pas les formulaires enfants MDI.

Autres conseils

if (Msg.WParam = SIZE_MAXIMIZED) then
  begin
    Left := 0;
    Top := 0;
    Width := frmMain.ClientWidth - 4;
    Height := frmMain.ClientHeight - 4;
    SendMessage(Handle, WM_SIZE, SIZE_RESTORED, 0);
  end;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top