Pergunta

Como faço para criar um controlo de botão (com CreateWindow de um BUTTON classe de janela) que tem um sistema padrão de tamanho (especialmente altura) que é consistente com o resto das aplicações do Windows?Eu deveria, claro, levar DPI em conta e, provavelmente, outras configurações.

Comentário: Usando USE_CW_DEFAULT para largura e altura resulta em 0, 0 botão de tamanho, de modo que não é uma solução.

Foi útil?

Solução 2

Perfeito, livre de problemas o mundo...

Para criar um padrão de tamanho botão de nós tem para fazer isso:

LONG units = GetDialogBaseUnits();
m_hButton = CreateWindow(TEXT("BUTTON"), TEXT("Close"), 
                 WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 
                 0, 0, MulDiv(LOWORD(units), 50, 4), MulDiv(HIWORD(units), 14, 8),
                 hwnd, NULL, hInst, NULL);

onde 50 e 14 são respectivo DLU dimensões, 4 e 8 são horizontais e verticais do modelo de diálogo unidades, respectivamente, com base no GetDialogBaseUnits() função documentação de observações.


Nada é perfeito

MAS como Anders apontou, essas métricas são baseadas no tipo de letra do sistema.Se a sua janela usa um shell de diálogo tipo de letra ou, simplesmente, tudo o que não fazer seus olhos sangrarem, você está muito bonita em seu próprio país.

Para obter o seu próprio "diálogo" unidades de base, você tem de recuperar texto atual com métricas GetTextMetrics() e o uso de caracteres altura e largura média (tmHeight e tmAveCharWidth do TEXTMETRIC struct respectivamente) e traduzi-los com MulDiv pelo seu próprio, a menos que você está em uma caixa de diálogo e, em seguida, MapDialogRect() vai fazer todo o trabalho para você.

Note que tmAveCharWidth somente se aproxima da largura de caractere médio real por isso é recomendado o uso de um GetTextExtentPoint32() a função de um conjunto de caracteres alfabéticos em vez disso.

Veja:


Alternativa mais simples

Se os botões são o único controle que você deseja redimensionar automaticamente, você também pode usar BCM_GETIDEALSIZE mensagem Button_GetIdealSize() macro (Windows XP e apenas) para recuperar ideal largura e altura que se encaixa em nada o contém, que parece muito feio, sem qualquer margem aplicado em todo o texto do botão.

Outras dicas

Isso é o que MSDN tem a dizer: As Especificações de projeto e Diretrizes de Design Visual:Layout.

O tamanho padrão de um botão é 50x14 DLUs, que pode ser calculada para pixels usando os exemplos apresentados para GetDialogBaseUnits.

O MapDialogRect função parece estar a fazer o cálculo para você.

@macbirdie:você NÃO deve usar GetDialogBaseUnits(), ele é baseado no padrão de fontes do sistema (Feio letra de mapa de bits).Você deve usar MapDialogRect()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top