Artigo: 145994 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 4.1

Como calcular unidades de caixa de diálogo com base no tipo de letra actual no Visual C++

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Nota Microsoft Visual C++ .NET (2002) suporta o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido. As informações neste artigo aplicam-se apenas ao código de Visual C++ não gerido.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

GetDialogBaseUnits() assume sempre o tipo de letra sistema ao calcular diálogo unidades. Se estiver a utilizar qualquer tipo de letra diferente do tipo de letra do sistema, o valor de retorno não é possível correcto para a caixa de diálogo. Este artigo fornece duas alternativas que pode utilizar para calcular as unidades de caixa de diálogo com base no tipo de letra actual.

Mais Informação

A unidade de base horizontal é igual à largura da média (em pixels) dos caracteres no tipo de letra do sistema. A ajuda para GetDialogBaseUnits() sugere o código seguinte para calcular as unidades correctas:
pixelX = (dialogunitX * baseunitX) / 4
pixelY = (dialogunitY * baseunitY) / 8
				

No entanto, se não estiver a utilizar o tipo de letra sistema, terá de efectuar alguns cálculos adicionais para obter as coordenadas para a direita. Seguem-se dois métodos:

Método um

A unidade de caixa de diálogo vertical é equivalente a altura de caracteres. A unidade de caixa de diálogo horizontal é equivalente à largura de carácter médio de tipo de letra da caixa de diálogo. A largura de carácter médio é calculada localizando a extensão de texto média do conjunto de caracteres alfabéticos. Isto é necessário porque não é preciso tmAveCharWidth. Utilize este código:
   void CAboutDlg::OnPaint()
   {
       CPaintDC dc(this); // device context for painting

       CFont* pFont = GetFont();
       CFont* oldFont = dc.SelectObject(pFont);
       TEXTMETRIC tm;
       dc.GetTextMetrics( &tm );
       int baseUnitY = tm.tmHeight;
       CSize size;
       size = dc.GetTextExtent(
           "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 52);
       int baseUnitX = (size.cx / 26 + 1) / 2;
       TRACE("baseUnitX = %d\n", baseUnitX);
       TRACE("baseUnitY = %d\n", baseUnitY);
       dc.SelectObject(oldFont);

   }
				

Método dois

A alternativa é ainda mais fácil. Com MapDialogRect() uma coordenada de x = 4, y = 8 devolverá a caixa de diálogo caixa unidades base independentemente do tipo de letra da caixa de diálogo. No entanto, na maioria das situações, o programador não é necessário conhecer as unidades de base de caixa de diálogo. MapDialogRect() pode ser utilizado directamente para converter quaisquer unidades de caixa de diálogo directamente para as coordenadas do dispositivo. O código de exemplo seguinte mostra como pode ser utilizado para localizar a caixa de diálogo caixa unidades base:
   void CAboutDlg::OnPaint()
   {
       CPaintDC dc(this); // device context for painting

       CRect rc( 0, 0, 4, 8 );

       MapDialogRect( &rc );
       int baseUnitY = rc.bottom;
       int baseUnitX = rc.right;
       TRACE("baseUnitX = %d\n", baseUnitX);
       TRACE("baseUnitY = %d\n", baseUnitY);

   }
				

Referências

Para obter informações adicionais, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
125681  (http://support.microsoft.com/kb/125681/EN-US/ ) como calcular a caixa de diálogo de unidades base com o tipo de letra não baseados no sistema

A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.5 Professional Edition
    • Microsoft Visual C++ 1.51
    • Microsoft Visual C++ 1.52 Professional Edition
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 6.01 Professional Edition
    • Microsoft Visual C++ 4.0 Professional Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++ 5.0 Learning Edition
    • Microsoft Visual C++ 5.0 Learning Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbinfo kbcode kbdlg kbfont kbhowto kbuidesign KB145994 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 145994  (http://support.microsoft.com/kb/145994/en-us/ )