ID do 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 na fonte atual 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.
Observação Microsoft Visual C++ .NET (2002) oferece suporte o modelo de código gerenciado que é fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado. As informações neste artigo se aplicam somente ao código do Visual C++ não gerenciado.

Nesta página

Expandir tudo | Recolher tudo

Sumário

GetDialogBaseUnits() sempre pressupõe que a fonte do sistema ao calcular unidades de diálogo. Se você estiver usando qualquer fonte diferente a fonte do sistema, o valor de retorno pode não ser correto para sua caixa de diálogo. Este artigo oferece duas alternativas, que você pode usar para calcular as unidades de caixa de diálogo com base na fonte atual.

Mais Informações

A unidade de base horizontal é igual à largura média (em pixels) dos caracteres na fonte de sistema. A Ajuda para GetDialogBaseUnits() sugere o código a seguir para calcular as unidades corretas:
pixelX = (dialogunitX * baseunitX) / 4
pixelY = (dialogunitY * baseunitY) / 8
				

No entanto, se você não estiver usando a fonte do sistema, você precisará fazer alguns cálculos adicionais para obter as coordenadas à direita. Aqui estão dois métodos:

Método um

A unidade de caixa de diálogo vertical é equivalente à altura de caractere. A unidade de caixa de diálogo horizontal é equivalente à largura de caractere médio de fonte da caixa de diálogo. A largura de caractere média é calculada pelo encontrar a extensão de texto média do conjunto de caracteres alfabéticos. Isso é necessário porque tmAveCharWidth não é preciso. Use 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. Usando MapDialogRect() com uma coordenada de x = 4, y = 8 retornará a caixa de diálogo caixa unidades base independentemente fonte da caixa de diálogo. No entanto, na maioria das situações, o programador não precisa saber as unidades base de caixa de diálogo. MapDialogRect() pode ser usado diretamente para converter qualquer unidades de caixa de diálogo diretamente em coordenadas de dispositivo. O código de exemplo a seguir mostra como ele pode ser usado 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 diálogo unidades base com a fonte 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )