Controle tabControl personalizado, CSharp, Microsoft Visual Studio 2022

17/11/2023

0

Esta classe cria um controle personalizado SFTabControl que herda do controle TabControl, Estou utilizando o Microsoft Visual Studio 2022

Problema: Quando vou adicionar outros controles na tabpage em tempo de design os mesmos ao ser desenhados ficam escondidos. Como posso resolver este problema?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GUI.SFControls
{
public enum TabPosition
{
Superior,
Inferior,
Esquerda,
Direita
}

public class SFTabControl : TabControl
{
private TabPosition tabPosition = TabPosition.Superior;

#region Properties
[Category("SisFlex")]
[Description("Cor de fundo das abas.")]
public Color TabBackColor { get; set; } = Color.LavenderBlush;

[Category("SisFlex")]
[Description("Cor da borda das abas.")]
public Color TabBorderColor { get; set; } = Color.MediumSlateBlue;

[Category("SisFlex")]
[Description("Largura da borda das abas.")]
public int TabBorderWidth { get; set; } = 1;

[Category("SisFlex")]
[Description("Fonte das abas.")]
public Font TabFont { get; set; } = new Font("Century Gothic", 10f);

[Category("SisFlex")]
[Description("Cor da borda do controle SFTabControl.")]
public Color SFTabControlBorderColor { get; set; } = Color.Transparent;

[Category("SisFlex")]
[Description("Largura da borda do controle SFTabControl.")]
public int ControlBorderWidth { get; set; } = 0;

[Category("SisFlex")]
[Description("Cor da borda da TabPage.")]
public Color TabPageBorderColor { get; set; } = Color.MediumSlateBlue;

[Category("SisFlex")]
[Description("Largura da borda da TabPage.")]
public int TabPageBorderWidth { get; set; } = 1;
#endregion

#region Constructors
public SFTabControl()
{
this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
this.SizeMode = TabSizeMode.Fixed;
this.ItemSize = new Size(100, 30);
}
#endregion

#region Methods
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);

using (SolidBrush backBrush = new SolidBrush(TabBackColor))
using (Pen borderPen = new Pen(TabBorderColor, TabBorderWidth))
using (Pen tabPageBorderPen = new Pen(TabPageBorderColor, TabPageBorderWidth))
{
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;

for (int i = 0; i < TabPages.Count; i++)
{
Rectangle tabRect = GetTabRect(i);
bool isSelected = i == this.SelectedIndex;

tabRect.Inflate(new Size(-TabBorderWidth, -TabBorderWidth));

// Altera a cor de fundo e a cor da fonte da aba selecionada
Color tabBack = isSelected ? Color.LightSkyBlue : TabBackColor;
Color tabFontColor = isSelected ? Color.White : Color.Black;

using (SolidBrush tabBackBrush = new SolidBrush(tabBack))
using (SolidBrush tabFontBrush = new SolidBrush(tabFontColor))
{
e.Graphics.FillRectangle(tabBackBrush, tabRect);
e.Graphics.DrawRectangle(borderPen, tabRect);
e.Graphics.DrawString(TabPages[i].Text, TabFont, tabFontBrush, tabRect, stringFormat);
}

RectangleF tabPageContentRect = GetTabRect(i);
tabPageContentRect.Y += tabRect.Height;
tabPageContentRect.Height -= tabRect.Height;

// Calcula o retângulo para o conteúdo da TabPage (excluindo a área da aba)
RectangleF tabPageRect = new RectangleF(
tabPageContentRect.X + 2, tabPageContentRect.Y + 2,
tabPageContentRect.Width - 4, tabPageContentRect.Height - 4);

// Desenha um retângulo em volta da página das abas
int alturaTab = this.ItemSize.Height;
e.Graphics.DrawRectangle(tabPageBorderPen, new Rectangle(1, alturaTab + 1, Width - 3, Height - alturaTab - 3));
}
}

using (Pen controlBorderPen = new Pen(SFTabControlBorderColor, ControlBorderWidth))
{
e.Graphics.DrawRectangle(controlBorderPen, new Rectangle(0, 0, Width - 1, Height - 1));
}
}
#endregion
}
}
Jean Carlos

Jean Carlos

Responder

Posts

17/11/2023

Arthur Heinrich

Não conheço o Visual Studio, mas, o componente é da API do Windows.

No Delphi, todo componente possui duas propriedades especiais:

Owner: Componente ao qual o componente pertence. Por exemplo o form ou um panel.
Ao destruir um componente, todos os componentes pertencentes a ele (que possuem como owner o componente que está sendo destruído), são destruídos junto.

Parent: O "Parent Control" é responsável pela exibição do componente. Você deve indicar onde o seu componente será exibido. No seu caso, como deve ser exibido em um TabSheet, informe este componente, para que seja exibido nele.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar