Compartilhar via


DPI Aware Text and Fonts

Windows Mobile SupportedWindows Embedded CE Not Supported

9/9/2008

Enquanto escalabilidade fontes TrueType bem, elas não escalabilidade linear. Isto é, aumentar o valor de PPP em 10 por cento não geralmente aumenta o comprimento de uma seqüência de caracteres em Exatamente 10 por cento. O efeito cumulativo, especialmente em seqüências mais, pode causar texto em diferentes resoluções para ser relativamente menor ou ser cortado ou para quebra automática de forma inesperada. Portanto, é importante usar o GetTextExtent função instead of fazer suposições sobre quanto espaço um seqüência de caracteres ocupará. Para layouts estáticos como diálogo caixas, você deve alocar alguns adicional largura para elementos de texto para ajustá-lo corretamente em qualquer valor de PPP.

Além disso, fontes diferentes apresentam diferentes efeitos de escala não-lineares, o que significa que o uso de múltiplo fontes em uma Tela podem causar algumas apareça desproporcional para outras pessoas em diferentes resoluções.

Criando PPP aware fontes

Quando você cria fontes para Windows Mobile, você deve usar pontos para especificar a tamanho da fonte. Um apontar se refere a um tamanho lógico (1/72 de uma polegada lógica), não uma altura pixel, quando for usado corretamente é inerentemente PPP ciente. O seguinte exemplo de código mostra como criar uma fonte DPI-aware usando tamanho apontar.

LOGFONT lf;
memset(&lf, 0, sizeof(lf));
// Set other LOGFONT values as appropriate.
lf.lfHeight = -(( * GetDeviceCaps(hdc, LOGPIXELSY)) / 72;
HFONT font = CreateFontIndirect(&lf);

Porque LF.lfHeight é uma altura pixel inteiro, é assunto para arredondamento diferenças são introduzidas através de MulDiv chamar em resoluções diferentes. O tamanho da fonte resultante pode não ser linearmente dimensionado de 96 ppp, mas irá ser a aproximação correta do tamanho desejado apontar. Este é o método recomendado para criar as fontes.

Se for necessário uma escala mais exato linear de sua fonte tamanho do pixel, você poderá criar uma fonte temporário para 96 ppp, escalabilidade seu tmHeight Métrica de texto e criar a nova fonte baseia o valor resultante, conforme o seguinte exemplo. Linearmente, a fonte resultante será ser dimensionado exatamente na altura de acordo com CDC::GetTextExtent, mas ele pode não ser linearmente dimensionado em largura e também pode ser visualmente mais altos ou mais curto.

Observação

Mesmo quando você usa esse método para fontes escalabilidade com mais precisão, você não deve fazer nenhuma suposições sobre quanto espaço um seqüência de caracteres ocupará.

// Create font for 96 DPI.
LOGFONT lf;
memset(&lf, 0, sizeof(lf)); 
// Set other LOGFONT values as appropriate.
lf.lfHeight = -MulDiv(, 96, 72);
HFONT hfont = CreateFontIndirect(&lf); 
  // Scale the tmHeight; create target font.
  TEXTMETRIC tm;
HDC hdc = GetDC(target);
HFONT hfontOld = (HFONT)SelectObject(hdc, hfont);
GetTextMetrics(hdc, &tm);
SelectObject(hdc, hfontOld);
DeleteObject(hfont);
ReleaseDC(target, hdc);
lf.lfHeight = SCALEY(tm.tmHeight);
hfont = CreateFontIndirect(&lf);

Obtendo o tamanho da fonte do usuário

Windows Mobile 6 Professional e Windows Mobile 6 Classic têm um novo (item Painel de controleAs configurações/Tela/Texto Tamanho) com que o usuário pode escolher o tamanho da fonte que pareça melhor em Tela a dispositivo. Novos aplicativos escritos para Windows Mobile 6 Professional e Windows Mobile 6 Classic devem estar ciente disso e devem usar o tamanho da fonte User-Selected para seu primário interface do usuário texto sempre que possível. Para recuperar esse valor, use o SHGetUIMetric função fornecida com o codificar CrosswordSample.

LONG  dwFontSize = 12;
SHGetUIMetrics(SHUIM_FONTSIZE_PIXEL, &dwFontSize, sizeof(dwFontSize), NULL);
lf.lfHeight = -dwFontSize;

Seu aplicativo também deve estar ciente quando tamanho da fonte o usuário for alterada. Para receber essa notificação, seu aplicativo deve chamar RegisterWindowMessage Para a mensagem SH_UIMETRIC_CHANGE. Quando seu aplicativo recebe essa mensagem, ela deve consulta SHGetUIMetric para localizar o tamanho da fonte Novo e, em seguida, repintar próprio.

See Also

Concepts

Developing DPI Aware Applications
High DPI Display