Como posso especificar a altura da fonte em diferentes orientações?
-
06-09-2019 - |
Pergunta
O modo comum para criar um tipo de letra com GDI é usar o tamanho do ponto desejado e resolução vertical do dispositivo de destino (DPI) assim:
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, GetDeviceCaps(hdc, LOGPIXELSY), 72);
...
HFONT hfont = CreateFontIndirect(&lf);
Assumindo que o modo de mapeamento MM_TEXT
padrão, esta convertidos point_size na altura do pixel para o dispositivo desejado. (Esta é uma aproximação comum. Na verdade, existem 72,27 pontos em uma polegada, não 72.) (Os meios sinal de menos eu quero especificar a altura de caráter real, não a altura da célula.)
Se eu quiser criar uma fonte de lado - isto é, um com uma orientação e escapamento de 90 graus - eu uso LOGPIXELSX
em vez de LOGPIXELSY
? Para algumas das impressoras Estou alvo, as resoluções horizontal e vertical são diferentes.
Geralmente, se eu quiser um ângulo de theta
, posso combinar LOGPIXELSX
e LOGPIXELSY
? Estou pensando em algo como isto:
// 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);
...
Isso faz sentido intuitivo para mim, mas eu estou querendo saber se isso é realmente como o GDI fonte drivers de impressora mapeador e trabalho.
Nenhuma solução correta
Outras dicas
1) Existem 72 pontos / polegada. (Que costumava ser 72,27 mas foi alterado). 2) Combinando LOGPIXELSX e LOGPIXELSY da maneira que você faz é bom, mas 3) O mapeador de fonte não olha para escapamento e orientação quando as fontes de mapeamento. Os valores LOGPIXELS só serão utilizadas como parte da transformação de coordenadas.
http://msdn.microsoft.com/en- us / library / ms969909 (loband) .aspx
Não tenho certeza sobre como os "drivers de impressora de trabalho", porque a declaração poderia incluir muitos motoristas e impressoras possíveis.
Eles poderiam rasterizar com pixels quadrados, em seguida, esticar para não-quadrado. Eles poderiam transformar curvas glifo. Eles poderiam fazer outra coisa.