J'ai une application qui génère des métafiles (EMFS). Il utilise le dispositif de référence (alias l'écran) pour rendre ces métafiles, de sorte que le DPI du métafichement change en fonction de la machine sur laquelle le code s'allume. P>
Disons que mon code a l'intention de créer un métafichier de 8,5 en X 11 po. Utilisation de mon poste de travail de développement comme référence, je me retrouve avec un EMF qui a P>
D'accord, donc la RCLRAME me dit que la taille de l'EMF devrait être p>
Droit sur. En utilisant ces informations, nous pouvons également déterminer le DPI physique de mon moniteur, si mon calcul a raison: p>
Tout ce qui lit ce métafile - une conversion EMF-TO-PDF, la page "Résumé" lorsque vous cliquez avec le bouton droit de la souris sur l'EMF dans l'Explorateur Windows, etc. semble tronquer la valeur DPI calculée, affichant 87 au lieu de 87.9231 (même 88 irait bien). P>
Il en résulte une page physiquement dimensionnée comme 8,48 en x 10,98 en (87 dpi) au lieu de 8,5 x 11 dans x 11 dans (en utilisant 88 dpi) lorsque le métafichier est lu. P>
Merci pour toute idée. P>
4 Réponses :
Je suis curieux de savoir comment Windows connaît la taille physique de votre moniteur. Vous devez avoir changé une configuration quelque part? Peut-être que vous pouvez le changer à des valeurs plus pratiques qui divisent bien. P>
Comme impliqué par le nom, un "contexte de périphérique" doit être connecté à un périphérique système. Cependant, cela n'a pas besoin d'être un pilote matériel, il pourrait s'agir d'un émulateur de périphérique tel qu'un pilote d'impression d'écrivain PDF. J'ai vu au moins un qui vous permet de définir un DPI arbitraire. P>
Windows ne connaît pas la taille physique du moniteur, bien que vous puissiez l'obtenir à partir d'EDID, voir Stackoverflow.com/questions/577736 . Je crois comprendre que si vous définissez le moniteur sur sa résolution natale, vous obtiendrez presque toujours (très proche de) 96 points par pouce, s'il s'agit d'un panneau plat.
Eh bien, c'est intéressant. Il semblerait indiquer que GDIPRECORDMETAFILESTREAM, que le constructeur de la classe de métafile de .NET met en place, incite. (Mon moniteur est à sa résolution natale - un Dell E198WFP - et j'ai éclaté un ruban à mesurer, et assurez-vous que ces dimensions mm sont correctes!)
J'ai maintenant appris plus que je me suis soucié d'avoir connu des méafiles.
Considérez les éléments suivants: P>
metafileGraphics = Graphics.FromImage(this.currentMetafile); metafileHeader = this.currentMetafile.GetMetafileHeader(); metafileGraphics.ScaleTransform( metafileHeader.DpiX / metafileGraphics.DpiX, metafileHeader.DpiY / metafileGraphics.DpiY);
Sachez que vous pouvez modifier votre configuration de moniteur Windows afin que 96 DPI ne soit plus le DPI logique. Là encore, cela ne pourrait être un problème que sur XP, puisqu'ils ont changé de choses pour Vista. Là encore, utiliser GDI + change de choses plus. Découvrez msdn.microsoft.com/en-us/library /ms701681(vs.85).aspx
Notez que je cours avec 120 dpi sur WXP tout le temps (de grandes polices) qui signifie métafilegraphics.dpix retourneront 120. P>
Le fichier EMF ne semble pas enregistrer ce que le DPI était du contexte de référence (120 dans ce cas, 96 pour la plupart des autres personnes). P>
Pour rendre les choses plus intéressantes, il est possible de créer un EMF via un dessin sur un bitmap de mémoire qui a eu une sertre () définie sur, dire, 300 dpi. Dans ce cas, je pense que le facteur d'échelle doit être 300 et non ce que le moniteur (86.x) ou Windows (120) pourrait utiliser. P>
semble que des valeurs sur la page de résumé sont erronées. Ils sont calculés comme: où les valeurs de précision sont calculées sans arrondissement ni troncature. P> p>
La taille de la page de résumé est-elle affichée correctement? Est-ce 748x968 ou 747x967?
Avoir les mathématiques aménagées, la façon dont vous avez fait dans cette question - est d'une valeur incommensurable pour moi