2009-10-08 7 views
2

Je travaille sur une application qui montre ses formes comme une série de fenêtres modales empilées les unes sur les autres. Tous les formulaires sont placés au centre de l'écran. Lorsque l'utilisateur déplace le formulaire autour de l'écran, seul le plus haut se déplace, d'autres restent au centre et ne peuvent pas être déplacés car ils sont bloqués par le dialogue le plus haut. J'essaie de coder un code de déplacement de formulaire qui déplacerait tous les formulaires vers le nouvel emplacement et également du code qui ouvrirait de nouveaux formulaires à l'emplacement actuel non centré..NET format - l'emplacement de réglage change la taille

Mais quelque chose de bizarre se produit lors de l'exécution de ce dernier - l'ouverture d'un nouveau formulaire dans une position non centrée en utilisant la localisation d'un autre formulaire (le formulaire le plus bas). Si je définis par programme la propriété Location du formulaire, sa taille change - le formulaire devient plus petit. Sa propriété Size est modifiée de (240, 320), comme défini dans l'interface graphique de Designer, à la plus petite ClientSize (234, 294), qui est présente dans le code généré par Designer. J'ai seulement trouvé un article sur le net faisant référence à ce problème, mais aucune réponse à cela. Si je laisse la propriété Location seule, le formulaire s'affiche correctement avec la taille d'origine. La StartPosition du formulaire est définie sur Manual, FormBorderStyle sur FixedSingle, AutoScaleMode sur DPI ou sur Font (je ne sais pas comment définir celui-ci).

Des idées? Merci.

+1

après un code. Vous pourriez avoir un défaut dans la façon dont vous déplacez les formes que nous ne pouvons pas voir sans code. –

Répondre

3

Je vais répondre à ma propre question. Il semble que le comportement provient de la définition de la propriété Location alors que le formulaire n'est pas encore formé par le système d'exploitation, c'est-à-dire qu'il n'a pas encore de handle créé et son IsHandleCreated est False. J'ai débogué dans le code .NET lui-même et il y avait un appel Debug.Assert avec "Ne pas utiliser ceci avant CreateHandle" ou quelque chose comme ça comme le paramètre assert quelque part dans la pile d'appel autour du code qui était problématique. Cela m'a donné le premier indice.

La mise du code dans un gestionnaire d'événements pour l'événement Form.Load a résolu le problème. Au moment où Load se déclenche, la poignée est déjà créée et tout semble fonctionner. Maintenant que j'en connais la cause, j'ai cherché un peu dans le réseau "Initialisation du gestionnaire d'événements Constructeur vs Charger" et les discussions pertinentes impliquent que vous devez différer la gestion des contrôles jusqu'à Charger. Ce qui est logique parce que les contrôles .NET sont des wrappers autour d'entités à l'extérieur du système d'exploitation (et ceux-ci doivent être créés pour être utilisables) mais en même temps n'a pas de sens car le code Designer semble pouvoir accéder aux contrôles avant le handle est créé très bien. Si cela a un sens,

TLDR: différer l'accès au contrôle et l'utiliser jusqu'à ce que l'événement Form.Load se déclenche.

Questions connexes