TabControl.DrawItem не стреляет по нарисованному пользователем TabControl - PullRequest
3 голосов
/ 25 июня 2010

Эй, я пытался нарисовать свой собственный TabControl, чтобы избавиться от 3D Shadow, но я не добился большого успеха.Событие DrawItem в данный момент не запускается.Должен ли я снимать это сам?Как мне это сделать?

Код:

namespace NCPad
{
    public partial class NCE_TabControl : TabControl
    {
        Rectangle TabBoundary;
        RectangleF TabTextBoundary;

        public NCE_TabControl()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);
            this.DrawMode = TabDrawMode.OwnerDrawFixed;
            this.Paint += new PaintEventHandler(this.OnPaint);
            this.DrawItem += new DrawItemEventHandler(this.OnDrawItem);
        }

        protected void OnPaint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.FillRectangle(new SolidBrush(Color.Red), e.ClipRectangle);
        }

        protected void OnDrawItem(object sender, DrawItemEventArgs e)
        {
            Graphics g = e.Graphics;
            g.FillRectangle(new SolidBrush(Color.Blue), this.TabBoundary);
            MessageBox.Show("hi");
        }

        protected override void OnLayout(LayoutEventArgs levent)
        {
            base.OnLayout(levent);

            this.TabBoundary = this.GetTabRect(0);
            this.TabTextBoundary = (RectangleF)this.GetTabRect(0);
        }
    }
}

Ответы [ 3 ]

7 голосов
/ 20 ноября 2010

Я не уверен в этом, но я верю, что если вы укажете бит ControlStyles.UserPaint в true, DrawItem не будет срабатывать. Другие ControlStyles (AllPaintingInWmPaint и DoubleBuffer), тем не менее, имеют зависимости друг от друга, поэтому вам также необходимо их исключить. Однако, если для бита UserPaint не будет установлено значение true, событие Paint не будет запущено. То, что я делал, это переопределение метода OnPaintBackground:

public partial class NCE_TabControl : TabControl
{
    Rectangle TabBoundary;
    RectangleF TabTextBoundary;
    StringFormat format = new StringFormat(); //for tab header text

    public NCE_TabControl()
    {   InitializeComponent();         
        this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);
        this.DrawMode = TabDrawMode.OwnerDrawFixed;
        this.format.Alignment = StringAlignment.Center;
        this.format.LineAlignment = StringAlignment.Center;
    }

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        Graphics g = pevent.Graphics;
        g.FillRectangle(new SolidBrush(Color.Red), 0, 0, this.Size.Width, this.Size.Height);

        foreach (TabPage tp in this.TabPages)
        {
            //drawItem
            int index = this.TabPages.IndexOf(tp);

            this.TabBoundary = this.GetTabRect(index);
            this.TabTextBoundary = (RectangleF)this.GetTabRect(index);

            g.FillRectangle(new SolidBrush(Color.LightBlue), this.TabBoundary);
            g.DrawString("tabPage " + index.ToString(), this.Font, new SolidBrush(Color.Black), this.TabTextBoundary, format);
        }
    }
} 

Я думаю, что это сработает для вас, но могут быть и другие способы сделать это.

1 голос
/ 15 февраля 2013

Чтобы получить событие DrawItem, установите DrawMode = OwnerDrawFixed на вкладке Control http://msdn.microsoft.com/en-us/library/system.windows.forms.tabcontrol.drawitem.aspx

0 голосов
/ 26 июня 2010

Один простой способ - изменить свойство Внешний вид TabControl на Кнопки или FlatButtons и установить DrawMode badk на Нормальный .

...