Jump to content

Esconder as abas de um TabControl


Knitter
 Share

Go to solution Solved by Guest id194,

Recommended Posts

Boas,

Precisava de criar uma interface em que na esquerda existe uma árvore com alguns nós e na direita deveria ser escolhido um painel diferente a cada nó que o utilizador escolha.

Estava a usar um TabControl para mostrar os painéis dado que seria mais simples mudar a página visível com todas as funcionalidades que esse controlo oferece, agora deparo-me com um problema, como esconder as abas do controlo. Não quero que apareçam os títulos de cada página.

Existe alguma forma de atingir o objectivo que pretendo com o controlo que estou a usar ou uma forma melhor para o atingir?

Link to comment
Share on other sites

Boas,

Precisava de criar uma interface em que na esquerda existe uma árvore com alguns nós e na direita deveria ser escolhido um painel diferente a cada nó que o utilizador escolha.

Estava a usar um TabControl para mostrar os painéis dado que seria mais simples mudar a página visível com todas as funcionalidades que esse controlo oferece, agora deparo-me com um problema, como esconder as abas do controlo. Não quero que apareçam os títulos de cada página.

Existe alguma forma de atingir o objectivo que pretendo com o controlo que estou a usar ou uma forma melhor para o atingir?

Já andei a pesquisar sobre isso e cheguei à conclusão que não era possível ou que dava muito trabalho (override ao Draw do controlo e não sei o quê).

A solução que utilizei foi criar várias forms e adicionar esse control via código. Também podes criar várias frames e utilizar o Visible.

<3 life

Link to comment
Share on other sites

Bem, esse artigo é referente a um componente específico, neste caso ao UltraWinToolbars, que não estou a usar.

Resolvi o problema de outra forma, através de um componente específico para criar wizards, que neste momento está adaptado às necessidades do projecto.

Mais tarde irei investigar essas soluções, nomeadamente a de usar containers que não percebi bem.

Link to comment
Share on other sites

  • Solution

Eu por acaso estou a fazer um controlo (apesar de nunca mais ter pegado nele desde há uns meses) que faz mais ou menos a mesma coisa que um TabControl, mas com um aspecto mais à-lá-thunderbird (janela de preferências), talvez depois lhe adicione uns métodos/propriedades para esconder os botões de troca de páginas e mudar a página por código, acho que é o que tu queres. Se tiveres interessado: http://www.portugal-a-programar.pt/index.php?showtopic=11386 (bem que esta precisar de mais uns comentários para eu voltar a carga lol 😉)

Quanto ao link que te dei, tens razão, vi mal, sorry... Mas eu sei que há maneiras de o fazer isto porque quando comecei a desenvolver o controlo que falei acima, comecei por fazer um derivado do TabControl (depois larguei a ideia e comecei a fazer uma cena diferente) e fiz isso que queres, só não me lembro como. Vou investigar mais um pouco ou achas que não vale a pena? 😛

EDIT:

Acho que encontrei o que querias, crias uma subclasse do TabControl com o seguinte código:

public class MyTabControl : TabControl {
private const TCM_ADJUSTRECT = 0x1328;

protected override void WndProc(ref Message m) {
	if (m.Msg == TCM_ADJUSTRECT && !DesignMode) {
		m.Result = (IntPtr)1;
	} else {
		base.WndProc(ref m);
	}
}
}

Depois acho que sabes fazer o resto... Durante o tempo de execução as tabs vão estar escondidas, durante o tempo de desenho vais vê-las. Podes facilmente alterar este comportamento como podes ver pelo código do if.

Link to comment
Share on other sites

Não quererás elaborar mais nesse assunto?

Tenho andado pouco por cá. Quando disse containers, estava a referir-me ao controlo Panel. Toma lá um exemplo meio tosco:

    public partial class Form1 : Form
    {
        Panel myPanel;

        public Form1()
        {
            InitializeComponent();

            myPanel = new Panel();
            TextBox tb = new TextBox();
            myPanel.Controls.Add(tb);
            Controls.Add(myPanel);

            tb.Click += new EventHandler(tb_Click);
        }

        void tb_Click(object sender, EventArgs e)
        {
            myPanel.Visible = !myPanel.Visible;
        }
    }

As coordenadas da TextBox passam a ser relativas à origem do Panel. Quando a propriedade Visible do Panel é colocada a false, todos os controlos que o têm como Parent desaparecem também.

Desaparecido.

Link to comment
Share on other sites

A ideia de usar os painéis foi a primeira depois de ver que não conseguia esconder as abas, mas isso significa que teria de reinventar a roda, neste caso teria de implementar quase todas as funcionalidades que o componente TabControl contém, algo que não me apetece fazer.

A necessidade não é tanta que me obrigue a isso e parece-me trabalho desnecessário.

Para já vou estar a usar o componente que encontrei, é a solução mais simples para o objectivo. Sinceramente pensava que fosse mais simples fazer o que quero, e até estava à espera que me mandassem olhar melhor para as propriedades 😄 , parece que o Java me deixa mal habituado, e como a única vez que usei outra tecnologia para isto foi em Delphi e foi bastante simples assumi que fosse igual.

Esse código é interessante, já tinha visto algumas alternativas em código mas envolviam muito mais alterações ao componente, tantas que resolvi mudar de ideia 😄 .

Bem, acho que tenho as soluções que queria, obrigado.

Link to comment
Share on other sites

Mas tu não lês-te a minha última resposta? Achas aquilo trabalho desnecessário? É bué simples e faz exactamente o que queres... E para trocares de tabs em design time é porreiro, porque assim consegues facilmente trabalhar em cada "painel" diferente.

Link to comment
Share on other sites

Tu é que não leste o que eu escrevi, e se voltares a ler com atenção verificas que escrevi que achava desnecessário implementar com painéis o toda a funcionalidade de um TabControl. Em nada me referi ao teu código, que, como também escrevi mais abaixo e na única linha em resposta a ti, é mais o simples do que os que tinha visto até este momento.

Link to comment
Share on other sites

Sei que estou desenterrando um tópico, mas encontrei uma solução simples para esse problema

Criei as abaspelo modo design normal e em tempo de execução uso os códigos abaixo.

Ocultar:

tabCentral.Controls.Remove(tab);

Mostrar

tabCentral.Controls.Add(tab);

                   

Estou fazendo exatamente a mesma coisa, uma árvore que chama as abas.

Link to comment
Share on other sites

Ae pessoal... Como disse o colega acima vamos ressuscitar o topico. hehehe,

Bom estava eu e meu colega de desenvolvimento discutindo isto e chegamos a conclusão de por um Panel na frente das abas ou na propriedade Locaction -> Y acrescentar o numero -22 (isso mesmo -22).

Isto resolve nossos problemas em partes pois o Control + Tab ainda funciona. Para resolver isto, ponha um flag para bloquear.

Conclusão: A POG FUNCIONA! ( PROGRAMAÇÃO ORIENTADA A GAMBIARRA)

Att.,

Darcy Buss Neto

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.