7 de septiembre de 2016

FONTMETRIC(), TXTWIDTH() y DPI pantallas de Windows

Artículo original: FONTMETRIC(), TXTWIDTH(), and screen DPI in Windows http://www.spacefold.com/colin/posts/2005/12-01FONTMETRICandScreenD.html
Autor: Colin Nicholls
Traducido por: Ana María Bisbé York


Si está tratando de dar tamaño a objetos en un formulario VFP que se correspondan a una fuente específica, tiene que tener en cuenta también la configuración actual de DPI ( Dots Per Inch - Puntos por pulgada) de la pantalla. Considere calcular el tamaño de un objeto Rectángulo que rodee un trozo de texto dado. Conoce las propiedades fontname, fontsize y la cadena de texto; pero no conoce las dimensiones. No hay problemas, puede decir, solo necesito utilizar FONTMETRIC() y TXTWIDTH() para calcular el tamaño del texto en pixeles:

iAvgCharWidth = FONTMETRIC(6, cFontName, cFontSize, "" )
iTextWidth = TXTWIDTH( cString, cFontName, cFontSize, "" ) * iAvgCharWidth

... y diría ... ahora puedo calcular adecuadamente el tamaño de mi rectángulo

No tan rápido. ¿Qué tal si su monitor de Windows estuviera configurado en 120 DPI? El texto se crearía de tamaño diferente. Debe tener esto en cuenta:

*---------------------------------
* Determina la configuración DPI de la pantalla:
*---------------------------------
#DEFINE LOGPIXELSX 88
DECLARE INTEGER GetDeviceCaps IN WIN32API INTEGER HDC, INTEGER ITEM
DECLARE INTEGER GetDC IN WIN32API INTEGER HWND
*DECLARE INTEGER DeleteDC in WIN32API integer HDC
DECLARE INTEGER ReleaseDC IN WIN32API INTEGER HWND, INTEGER HDC
LOCAL hdc, screenDPI
hdc = GetDC(0)
THIS.screenDPI = GetDeviceCaps( m.hdc, LOGPIXELSX )
ReleaseDC( 0, m.hdc )
IF iScreenDPI <> 96
  iTextWidth = INT( (iTextWidth * iScreenDPI)/96 )
ENDIF

Estuve peleándome con este tema recientemente, ocupándome de un bug reportado por alguien que decía que los textos del título del Pageframe se truncaban, si su entorno estaba configurado como 120DPI + "Fuentes grandes"

Bueno, esta mañana leí un post del prestigioso Charles Petzold (http://www.charlespetzold.com/blog/blog.xml#0511250723) sobre Unidades independientes de dispositivo Device Independent Units (DIU) que de alguna manera (y más) explica por qué tenemos que hacerlo de esta forma, porque creo que Visual FoxPro en realidad emplea pixeles reales en lugar de DIU. Este post merece ser leído.

No hay comentarios. :

Publicar un comentario