Pergunta

Toda vez que eu criar uma nova forma no meu aplicativo, ele usa o "Microsoft Sans Serif, 8.25pt" font por padrão. Eu não estou mudando isso porque eu sei que, neste caso, a minha forma deve pegar qualquer que seja a fonte padrão é para o sistema. No entanto, quando eu executar o meu aplicativo, a fonte que é usada ainda não é nada Segoe UI (minha fonte padrão do sistema no meu Windows Vista OS).

Por que isso acontece? Como posso ter certeza de que a minha candidatura se parece com uma aplicação normal do Windows?

Foi útil?

Solução

Confira este href="http://weblogs.asp.net/KDente/archive/2005/03/13/394499.aspx" rel="noreferrer"> blog falando sobre o fonte padrão em formulários que leva ao problema que você está enfrentando e este Ligação Bug com a resposta da Microsoft. Em suma, apenas parece que as formas não recebe as janelas (correto) padrão da fonte (que você mudou).

Outras dicas

A resposta aceita realmente não responder à pergunta; ele só explica por que esse comportamento está ocorrendo.

Algumas das outras respostas propor soluções sólidas, mas eu descobri que a melhor solução é realmente para criar um formulário base que todos os formulários em seu herdar aplicativo de e defina a propriedade Font desta forma base para SystemFonts.MessageBoxFont no construtor . Isso não só garante que suas escolhas de aplicação até a fonte correta em tempo de execução, com base no ambiente do usuário (posição fora do problema potencial representado por Hans Passant-an XP sem o Office 2007 vai recorrer a Microsoft Sans Serif na ausência de Segoe UI ), mas também lhe dá em tempo de design suporte para a sua fonte atual do Windows. Usando a fonte correta no resolve tempo de design o problema Josuegomes aponta, porque qualquer controle de recipiente que é criado no formulário vai pegar a fonte usada pela forma em tempo de design.

Além das vantagens acima, isso o liberta de ter que lembrar de modificar o construtor para cada forma que você cria e assegura a consistência entre todos os formulários na sua aplicação, bem como dando-lhe um lugar para colocar outra funcionalidade comum. Eu uso isso em um par de maneiras diferentes, como p / invocando, etc, para fixar bugs na implementação WinForms.

O único problema que resta com esta abordagem é que se você quiser definir um estilo de fonte para um controle específico, como negrito. O melhor lugar para fazer isso ainda está no construtor dessa forma, começando com a fonte do formulário como uma base e modificando o estilo dele:

myControl.Font = New Font(Me.Font, FontStyle.Bold)

Você pode adicionar antes InitializeComponent () no construtor Form (s):

this.Font = SystemFonts.MessageBoxFont;

Esta aparecem para trabalhar com o Windows XP e Windows Vista.

Sim, ele usa a fonte retornado por GetStockObject(DEFAULT_GUI_FONT). Que é MS Sans Serif. Uma fonte antiga, muito longe da maioria das máquinas. A fonte mapeador de traduzi-lo para, nenhuma surpresa, Microsoft Sans Serif.

Não existe um procedimento documentado que conheço para mudar essa fonte padrão, os docs SDK mencionar MS Sans Serif explicitamente. Se você quiser Segoe, você vai ter que perguntar para ele. O que não é seguro fazer, ainda há um monte de máquinas XP lá fora sem o Office 2007. A fonte mapeador irá traduzi-lo em uma máquina que não tem Segoe disponível. Não sei o que salta para fora, eu não tenho uma máquina desse tipo deixaram mais.

Definir propriedade fonte do formulário para SystemFonts.DialogFont não funciona se você tiver caixas de grupo com controles associados. Os controles dentro da caixa de grupo não são afetados por propriedade fonte do formulário. I "resolvido" isso definindo a propriedade Font para SystemFonts.DialogFont para cada caixa de grupo.

Os controles dentro da caixa de grupo são, na verdade não é afetado pela propriedade Font do formulário. A razão é que os controles em controles de recipiente são tratados como os filhos dos controles de recipiente como groupbox, mas não filhos do formulário principal. Para que todos os controles, incluindo aqueles em groupboxes para dimensionar corretamente, você pode usar código semelhante ao abaixo:

        foreach (Control ctr in this.Controls)
        {
            ctr.Font = SystemFonts.IconTitleFont;

            // controls in groupboxes are not child of main form
            if (ctr.HasChildren)
            {
                foreach (Control childControl in ctr.Controls)
                {
                    childControl.Font = SystemFonts.IconTitleFont;
                }
            }        
        }

Tente isto, clique em um formulário e fonte de mudança tamanho, por exemplo, eu mudei um tamanho de fonte de formulário para 12pt e, em seguida, teste pela caixa arrastar o texto para o formulário. Você vai ver, O tamanho caixa de texto é alterado para 12pt também. Eu só tenho esta solução por acidente.

O Control.DefaultFont é somente leitura; um hacky foi para substituí-lo é usar a reflexão.

Type settingsType = typeof(Control);
var defaultFontField = settingsType.GetField("defaultFont", BindingFlags.Static | BindingFlags.NonPublic);
defaultFontField.SetValue(null, new Font("Segoe UI", 8.25F));

Certifique-se de ter um UT manter um olho sobre este código, não há contrato de API para protegê-lo se as mudanças de implementação Framework.

Também estar ciente de designer de formulários, que na maioria das vezes irá inserir as classes de fontes verbatim em .designer.

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