Question

La voie commune pour créer une police avec GDI est d'utiliser la taille de point souhaitée et la résolution verticale de l'appareil cible (DPI) comme suit:

LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, GetDeviceCaps(hdc, LOGPIXELSY), 72);
...
HFONT hfont = CreateFontIndirect(&lf);

En supposant que le mode de mappage par défaut MM_TEXT, cette convertit point_size dans la hauteur de pixel pour le dispositif désiré. (Ceci est une approximation commune. Il y a en fait 72,27 points dans un pouce, et non 72.) (Le signe moins signifie que je veux spécifier la hauteur du caractère réel, et non la hauteur de la cellule.)

Si je veux créer une police de côté - à savoir, l'une avec une orientation et de 90 degrés échappement - dois-je utiliser LOGPIXELSX plutôt que LOGPIXELSY? Pour certaines des imprimantes je cible, les résolutions horizontales et verticales sont différentes.

En général, si je veux un angle de theta, dois-je combiner LOGPIXELSX et LOGPIXELSY? Je pense à quelque chose comme ceci:

// Given theta in degrees (e.g., theta = 45.0) ...
double theta_radians = theta * 2.0 * pi / 360.0;
int dpi = static_cast<int>(GetDeviceCaps(hdc, LOGPIXELSX) * sin(theta_radians) +
                           GetDeviceCaps(hdc, LOGPIXELSY) * cos(theta_radians) +
                           0.5);
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, dpi, 72);
// Set escapement and orientation to theta in tenths of a degree.
lf.lfEscapement = lf.lfOrientation = static_cast<LONG>(theta * 10.0 + 0.5);
...

Cela est logique intuitive pour moi, mais je me demande si cela est vraiment comment les pilotes mappeur de polices GDI et imprimante fonctionnent.

Pas de solution correcte

Autres conseils

1) Il y a 72 points / pouce. (Il était autrefois 72,27, mais a été changé.) 2) La combinaison LOGPIXELSX et LOGPIXELSY de la manière que vous faites est bien, mais 3) Le mappeur de police ne regarde pas et l'orientation échappement lors du mappage des polices. Les valeurs de LOGPIXELS ne seront utilisées que dans le cadre de la transformation de coordonnées.

http://msdn.microsoft.com/en- nous / bibliothèque / ms969909 (Loband) .aspx

Je ne sais pas comment les « pilotes d'imprimante fonctionnent » parce que la déclaration pourrait inclure de nombreux pilotes possibles et les imprimantes.

Ils pourraient tramer avec des pixels carrés, puis étirer à la non-carré. Ils pourraient transformer les courbes de glyphe. Ils pourraient faire autre chose.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top