Pergunta

Estou escrevendo um comportamento personalizado para um ToolStripDropDown ao controle.Eu também gostaria de modificar o ToolStripDropDownButton para exibir uma forma colorida.

Vejo que posso lidar com Paint evento e desenhar o que eu quiser.No entanto, existe alguma maneira de fazer com que o botão pinte o plano de fundo padrão antes de pintar a forma?Seria difícil obter o plano de fundo exatamente correto, especialmente com versões futuras do .NET e do Windows.

No velho Windows, eu poderia invocar o manipulador proc padrão antes ou depois do meu código de pintura.Não estou vendo nenhuma maneira de fazer isso no .NET.Ou talvez haja uma maneira de dizer ao botão para pintar apenas o fundo?

Foi útil?

Solução

Quando você lida com Paint evento (em vez de substituir o OnPaint método em uma classe derivada) a classe base (manipulador de proc padrão) já está sendo chamada.Tudo é desenhado normalmente, e então você está essencialmente desenhando além disso no Paint evento.Você pode ver isso claramente aqui:

     Lime rectangle drawn over part of the drop-down button, clearly showing the default contents underneath

O truque é garantir que você deixe o suficiente do retângulo de recorte do controle exposto a mostrar a parte que você deseja.O e.ClipRectangle propriedade recupera o inteiro área do cliente do botão, então se você apenas
preencha isso com uma amostra de cor, você também cobrirá a seta suspensa e o plano de fundo padrão.A demonstração acima foi criada usando o seguinte código de exemplo feio:

private void ToolStripDropDownButton1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(Brushes.Chartreuse,
                             e.ClipRectangle.X + 3, e.ClipRectangle.Y + 3,
                             e.ClipRectangle.Width - 12,
                             e.ClipRectangle.Height - 12);
}

Fora isso, não acho que haja uma maneira de personalizar exatamente o que é desenhado pela classe base.O desenho do proprietário (pelo menos no WinForms) tende a ser uma questão de tudo ou nada.Você obtém controle total,
mas isso tem o preço de ter que implementar tudo sozinho.


Claro, caso você ainda não tenha notado, o ToolStrip ao controle não se parece com um controle nativo do Windows.E pior ainda, é sempre vai ficar exatamente igual a agora,
mesmo em versões futuras do Windows que reformulam completamente a interface do usuário.(O MenuStrip é atormentado por
esse mesmo fenômeno, e a diferença é muito visível no Windows Vista/7, onde os menus padrão da API mudaram drasticamente).A razão é que ambos os controles são desenhados inteiramente em código C# escrito em suas implementações WinForms.Pessoalmente, acho que parece ridiculamente cafona e não o usaria em uma de minhas aplicações de aposta.

Você pode atribua um renderizador personalizado que use a API UxTheme para desenhar os botões, que obterá muito mais próximo da aparência dos menus e barras de ferramentas nativos.Uma amostra bastante completa está disponível aqui.Eu escrevi algo muito semelhante para o desenvolvimento do WinForms, exigindo os recursos adicionais do ToolStrip classe (como incorporar caixas de combinação) não oferecida pelo
moda antiga MainMenu e ToolBar controles que simplesmente agrupam seus equivalentes da API do Windows.Ao optar por fazer as coisas dessa maneira, você tem mais controle sobre exatamente quais partes do renderizador da classe base deseja chamar, já que você mesmo escreveu o código explicitamente.Altamente recomendado se você estiver
o tipo que se preocupa com a interface do usuário, a sensação nativa ou a experiência do usuário.

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