1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
void Text3D::CreateFont(void)
{
HRESULT hr;
int nLogPixelsY = DeviceCaps();
hr = D3DXCreateFont(D3DDevice,
FontSize(nLogPixelsY), // The height of the characters in logical units.
0, // The width of the characters in logical units.
FW_NORMAL, // Weight FW_BOLD
1, // MipLevels, 0 = autogen mipmaps
FALSE, // Italic
DEFAULT_CHARSET,//Charset
OUT_DEFAULT_PRECIS, //Output Precision OUT_TT_ONLY_PRECIS
PROOF_QUALITY, //Quality, ANTIALIASED_QUALITY
DEFAULT_PITCH|FF_DONTCARE, //Pitch and Family
L"Arial",
&D3DXFont);
if ( FAILED( hr ) ){
throw ExceptionE(false,std::string("Text3D::Initialize() D3DXCreateFont()"),DXGetErrorDescriptionW(hr));
}
}
int Text3D::DeviceCaps(void)
{
HDC hDC = ::GetDC( NULL );
// http://support.microsoft.com/kb/74299/fr
// Pour créer une police dans l'environnement de graphique de Microsoft Windows ne donne que la
// taille d'un point. Une application doit calculer la hauteur logique de la police, étant donné
// que les fonctions CreateFont() et CreateFontIndirect() utilisent des unités logiques pour
// spécifier la hauteur.
// Pour décrire une police à l'utilisateur, une application peut calculer la taille d'un point d'une police,
// donnée par sa hauteur. Cet article fournit les formules requis pour effectuer ces calculs pour
// le mode de mise en correspondance MM_TEXT.
if (!::SetMapMode(hDC,MM_TEXT)){
throw ExceptionE(true,std::string("Text3D::Initialize() SetMapMode()"));
}
int nLogPixelsY = ::GetDeviceCaps( hDC, LOGPIXELSY );
::ReleaseDC( NULL, hDC );
return nLogPixelsY;
}
int Text3D::FontSize(const int nLogPixelsY)
{
// Fonctionne bien avec Arial comme police de caractères.
// La taille sur l'écran est proportionnelle à la taille de la fonte.
// La première constante!!
double taillePoint = 39.5;
double nPointSize = HeightWithScreenAdjuster(taillePoint);
// http://support.microsoft.com/kb/74299/fr
// Cet article s'applique à NT. Je ne sais pas s'il est valable pour XP, Vista et Seven.
// Calcul de la hauteur logique de la police:
// -(Point Size * LOGPIXELSY)
// height = --------------------------
// DPI
// DPI est la valeur provenant de la base de registre:
// \\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontDPI\\LogPixels
// Soit 96 par défaut sur XP et Seven.
double nHeight = (-nPointSize * (double)nLogPixelsY) / (double)DPI;
// Ratio d'affichage pour Vista et Seven.
// La deuxième constante : 0.75!!
if (isWindowsVistaOrMore==true) nHeight = nHeight * 72.0/96.0;
return (int)nHeight;
}
double Text3D::HeightWithScreenAdjuster(const double height) const
{
// heightPhysicalScreenReal est la hauteur de l'écran en mm réelle.
// C'est à dire mesuré avec un mètre sur l'écran!
return (height * (double)::GetDeviceCaps(hDeviceContext, VERTSIZE)) / (double)heightPhysicalScreenReal;
} |
Partager