2010-05-18 3 views
9

J'ai une application avec une zone de texte, et la largeur de la zone de texte sur l'écran doit toujours être de 17,5 centimètres sur l'écran de l'utilisateur.Comment donner une zone de texte d'une largeur fixe de 17,5 cm?

C'est ce que j'ai essayé jusqu'à présent:

const double centimeter = 17.5; // the width I need 
const double inches = centimeter * 0.393700787; // convert centimeter to inches 

float dpi = GetDpiX(); // get the dpi. 96 in my case. 

var pixels = dpi*inches; // this should give me the amount of pixels 
textbox1.Width = Convert.ToInt32(pixels); // set it. Done. 



private float GetDpiX() 
{ 
    floar returnValue; 
    Graphics graphics = CreateGraphics(); 
    returnValue = graphics.DpiX; 
    graphics.Dispose(); // don’t forget to release the unnecessary resources 
    return returnValue; 
} 

Mais cela me donne des tailles différentes avec des résolutions différentes.

Il me donne 13 cm avec 1680 x 1050 et 21,5 cm avec 1024 x 768.

Qu'est-ce que je fais mal?

+4

"zone de texte sur l'écran doit toujours être de 17,5 centimètres sur l'écran de l'utilisateur." - C'est une exigence particulière .... –

+0

Ouais ... c'est. Si votre client vous a donné cette exigence, dites-lui qu'il est un "tard". – mpen

+1

Peut-être une exigence étrange, mais une question intéressante néanmoins. Que diriez-vous de définir la résolution de l'écran manuellement, en calculant manuellement le DPI que vous avez, et voir si elle correspond à la sortie de GetDpiX() et GetDpiY()? Il se pourrait que tous les moniteurs ne supportent pas cette fonctionnalité? – Bryan

Répondre

7

La méthode graphics.DpiX ne donne pas les vrais points par pouce du moniteur. Il renvoie l'ensemble DPI dans les propriétés d'affichage Windows, la plupart du temps 96 ou 120 DPI.

Il n'est pas possible de lire le réel DPI du moniteur. Microsoft a fait cette recherche pour Windows Vista/7 mais tant que les fabricants de moniteurs ne fournissent pas un moyen standard de lire la valeur du matériel du moniteur, cela ne sera pas possible.

3

Oui, malheureusement, Xenan a raison. Pour contourner le problème, vous pouvez autoriser une sorte d'étalonnage manuel effectué par l'utilisateur.

par exemple. tracez une ligne de 400 pixels sur l'écran, demandez à l'utilisateur de le mesurer sur l'écran et de définir le résultat. Maintenant, il est très simple de calculer le PPI (pixels par pouce) qui est votre calibrage.

0

La propriété width de la structure Size dépend des paramètres PageUnit et PageScale de la classe Graphics. Essayez de jouer avec ces paramètres pour obtenir l'effet désiré. Puisque vous avez probablement besoin de modifier ces paramètres sur l'événement Paint du contrôle, je vous suggère de créer votre propre contrôle TextBox personnalisé à la place.

Questions connexes