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.
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:
- Como calcular unidades de caixa de diálogo com base no tipo de letra actual no Visual C++
- Como Calcular Unidades de Base de Diálogo com os Não-Sistema Baseado no tipo de Letra
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()