• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

[C#] Subclass de ToolStrip + Override ao evento OnPaint - Preciso de ajuda!

9 mensagens neste tópico

Fiz uma subclasse do ToolStrip e do ToolStripProfessionalRenderer para criar uma toolbar parecida com a do diálogo de opções do Thunderbird (versão 2). Já consegui fazer isso, mas estou com um pequeno problema.

Para além disso, tentei fazer um override ao evento OnPaint do ToolStrip para adicionar duas linhas-- uma escura seguida de uma clara (pa criar um pequeno efeito de relevo)-- logo abaixo do ToolStrip, mas por alguma razão está produzir resultados inesperados. Os 2 primeiros botões da ToolStrip também contem partes das linhas pintadas por cima deles próprios e eu não consigo entender como é que isto acontece. O mais estranho é que só acontece nos 2 primeiros botões. Tentei apagar e voltar adiciona-los mas não funcionou.

firenotesoptions.jpg

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace FireNotes
{
    internal class MyToolStrip : ToolStrip
    {
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Pen cDarkDark = new Pen(SystemColors.ControlDarkDark);
            Pen cLightLight = new Pen(SystemColors.ControlLightLight);

            e.Graphics.DrawLine(cDarkDark, 0, e.ClipRectangle.Height - 2, e.ClipRectangle.Width + 1, e.ClipRectangle.Height - 2);
            e.Graphics.DrawLine(cLightLight, 0, e.ClipRectangle.Height - 1, e.ClipRectangle.Width + 1, e.ClipRectangle.Height - 1);
        }

        protected override void OnItemClicked(ToolStripItemClickedEventArgs e)
        {
            SwapSelectedButton((ToolStripButton)e.ClickedItem);
            base.OnItemClicked(e);
        }
        
        private void SwapSelectedButton(ToolStripButton tsbSelected) {
            ToolStripButton tsbThis;

            foreach (ToolStripItem tsItem in base.Items) {
                tsbThis = tsItem as ToolStripButton;

                if (tsbThis != tsbSelected) {
                    tsbThis.Checked = false;
                } else {
                    tsbThis.Checked = true;
                }
            }
        }
    }

    internal class MyToolStripProfessionalRenderer : ToolStripProfessionalRenderer
    {
        protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
        {
            ToolStripButton tsbItem = e.Item as ToolStripButton;
            Rectangle rect = new Rectangle(0, 0, 70, 43);

            if (tsbItem.Checked || (tsbItem.Selected && tsbItem.Checked)) {
                tsbItem.ForeColor = Color.White;
                e.Graphics.DrawImage(Properties.Resources.TSButton_State2, rect);
            } else if (tsbItem.Selected) {
                tsbItem.ForeColor = Color.White;
                e.Graphics.DrawImage(Properties.Resources.TSButton_State1, rect);
            }
        }
    }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Gurus do C#? Onde andam? Saco? Onde estás? ;)

Gostava mesmo de saber resolver isto...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sinceramente à primeira vista não te consigo ajudar, só testando o código e martelando nele um bocado é q poderia tentar chegar a algo.

Já tive uma situação que tentava desenhar linhas contornando um objecto e elas não me apareciam mas também já nao me recordo como resolvi e já nao tenho acesso a esse código.

Se puderes disponibilizar um projecto com isso implementado de forma a fazer alguns testes logo que tenha tempo dou-te uma olhadela nisso.

Suponho que já tenhas colocado essa dúvida noutros forums, caso contrário, recomendo-te q ponhas nos forums do MSDN e aguardes que alguem te dê dicas.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sinceramente à primeira vista não te consigo ajudar, só testando o código e martelando nele um bocado é q poderia tentar chegar a algo.

Já tive uma situação que tentava desenhar linhas contornando um objecto e elas não me apareciam mas também já nao me recordo como resolvi e já nao tenho acesso a esse código.

Se puderes disponibilizar um projecto com isso implementado de forma a fazer alguns testes logo que tenha tempo dou-te uma olhadela nisso.

Suponho que já tenhas colocado essa dúvida noutros forums, caso contrário, recomendo-te q ponhas nos forums do MSDN e aguardes que alguem te dê dicas.

Cumps

É... eu nunca fiz nada deste género, portanto só mesmo martelando um bocado.

Bom, antes de mais já cheguei à conclusão que as duas riscas só aparecem depois de lá passares com o rato, e realmente é muito estranho que no 3º e 4º botões esse problema não aconteça.

Agora para resolver só testando com mais calma, já que como nunca mexi nisto também não sei para onde me virar.

E agora agora, tenho que ir para a faculdade porque vou ter uma aula de dúvidas ;)

EDIT: mais estranho ainda: quando metes o mouse em cima do 2. Se tirares o mouse para baixo, o risco sai, se tirares o mouse para o lado, fica. :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu agora não estou em casa e só logo à noite é que estou de volta do meu portátil e deixo aqui um simples projecto com o problema para os mais preguiçosos (just kiding Tiago Salgado), ou então Saco se puderes e apareceres ai antes de eu voltar para casa, podias deixar o teu, que já deu para perceber que criaste um projecto com o código acima ;)

E sim, já deixei noutros fóruns, por acaso não deixei no MSDN porque sinceramente, julgava que aquilo tivesse muitos mais utilizadores (o numero de posts em cada secção não é assim tão grande, não parece ser muito activo) mas depois deixo lá se não arranjar solução. No entanto já deixei no Neowin, DevShed e Xtreme .NET Talk. São os que mais uso para este tipo de coisas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu por acaso logo à noite não vou estar por casa, mas o que fiz foi pegar num projecto meu qualquer, criar uma toolstrip e substituir pela tua, agora, como não tenho as imagens dos botões, o efeito pode não ficar exactamente igual, por isso era bom que criasses aí um projecto simples, só mesmo com a toolstrip para eu poder testar e ter a certeza de que estou a pegar em algo minimanente parecido com o que te está a dar problemas ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já resolvi :D

1) Passei para o evento OnBackgroundPaint, mas testei a solução no OnPaint e deu na mesma, mas o OnBackgroundPaint faz mais sentido para o que eu quero.

2) Em vez de usar e.ClipRectangle.Height/e.ClipRectangle.Width passei a usar base.Height/base.Width e já funciona como deve ser. Por alguma razão, a usar o ClipRectangle, os valores variavam... e com o base, é sempre igual.

Com toda esta cena já aprendi mais umas coisas e melhorei ainda mais o funcionamento desta minha subclasse ao ToolStrip  :cheesygrin: Esta cena de subclassing é nice, permite coisas engraçadas...

Obrigado aos dois que tentaram ajudar!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora só falta outra cena que ta relacionada, mas que não faço ideia como fazer lol...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora