2010-04-09 16 views
1

J'ai une ancienne application WinForms et je souhaite enregistrer la position et la taille de la fenêtre entre les sessions. J'ai utilisé GetWindowPlacement et SetWindowPlacement pendant les événements FormClosing et Load. Le problème que je reçois est que, à des réglages DPI plus élevés (tels que Medium, taille à 125%), les tailles continuent de gonfler. J'appellerai SetWindowPlacement dessus avec une certaine taille, mais quand GetWindowPlacement est appelé, ces nombres reviennent 25% plus grands, même si la fenêtre était toujours de la même taille. Le même type de problème existe lors de l'enregistrement de la taille d'un élément redimensionnable dans le formulaire.GetWindowPlacement/SetWindowPlacement ne fonctionne pas dans WinForms pour un taux de résolution élevé

Maintenant, cela fonctionne très bien si je crée un nouveau projet WinForms: La taille reste stable même lors de l'exécution au DPI supérieur. J'imagine qu'il y a un certain héritage dans les entrailles du projet ou un paramètre de Formule mystérieux qui le gâche, mais je ne peux pas savoir où.

J'ai appelé IsProcessDPIAware sur les deux projets et les deux sont true. Est-ce que quelqu'un sait ce qui pourrait causer cela?

Répondre

1

Je trouve ce paramètre dans le fichier incriminé .resx du formulaire:

<data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing"> 
    <value>5, 13</value> 
</data> 

Lorsque c'était présent, VS changerait automatiquement le AutoScaleBaseSize travailler pour votre DPI, mais personne d'autre. Pour tous les autres, la forme augmenterait ou rétrécirait constamment.

Choisir AutoScaleMode = Police dans le panneau des propriétés du concepteur a forcé VS à lancer et à "moderniser" les paramètres de mise à l'échelle des polices. Maintenant, cela fonctionne pour tous les DPI.

1

Cela vous semble déclencher la mise à l'échelle, tel que sélectionné par la propriété AutoScaleMode du formulaire. La différence entre vos deux projets serait la propriété AutoScaleDimensions, visible dans le fichier Designer.cs.

Vous ne savez pas pourquoi cela causerait un problème, mais la classe Form utilise déjà les méthodes internes GetWindowPlacement(), RecreateHandleCore() et UpdateWindowState(). Pour obtenir une aide réelle, je suppose que vous aurez besoin de poster un projet de repro quelque part.

+0

+1 pour l'indice sur AutoScaleMode. – RandomEngy