Как перерисовать узел в TreeView (WinForms) - PullRequest
0 голосов
/ 10 сентября 2009

Мне нужно реализовать собственный TreeView с мигающим TreeNode. Мой прототип:

public class BlinkTreeView : TreeView
    {
        private int blinkInterval; 

        private bool blinkState;

        [Category("Behavior"), Browsable(true)]
        public Icon BlinkIcon { get; set; }

        [Category("Behavior"), Browsable(true)]
        public Icon SelectedBlinkIcon { get; set; }

        [Category("Behavior"), Browsable(true), DefaultValue(1000)]
        public int BlinkInterval {
            get
            {
                return blinkInterval;
            }
            set
            {
                blinkInterval = value;
                if (value > 0)
                {
                    blinkTimer.Interval = value;
                    blinkTimer.Start();
                }
                else
                {
                    blinkTimer.Stop();
                    blinkState = false;
                    Invalidate();
                }
            }
        }

        private Timer blinkTimer;

        public BlinkTreeView()
            : base()
        {
            blinkTimer = new Timer();
            blinkTimer.Tick += new EventHandler(blinkTimer_Tick);
            blinkState = false;
            this.DrawMode = TreeViewDrawMode.OwnerDrawAll;
        }

        void blinkTimer_Tick(object sender, EventArgs e)
        {
            if (BlinkInterval > 0)
            {
                blinkState = !blinkState;
            }
            else
            {
                blinkState = false;
            }
            Invalidate();
        }

        protected override void OnDrawNode(DrawTreeNodeEventArgs e)
        {
            e.DrawDefault = true;
            base.OnDrawNode(e);
            if (blinkState)
                {
//here i want to draw blinked item, but i can't redraw item icons and text.
                }
            }
        }

В OnDrawNode я не могу перерисовать значок и текст узла. Есть идеи как это решить?

Ответы [ 2 ]

2 голосов
/ 10 сентября 2009

Просто мысль, но вы можете инвертировать (xor) поверх элемента, не превращая дерево в элемент управления для рисования владельцем. Я думаю, что это работает примерно так:

using (Graphics g = Graphics.FromHwnd(Tree.Handle))
{
    TreeNode node = myBlinkyNode;
    if (node != null)
    {
        using(Region myRegion = new Region(node.Bounds))
            myRegion.Xor(xorRect);
    }
}

Вам нужно будет следить за тем, виден ли миг или нет, и обрабатывать событие Paint, чтобы вы могли заново нарисовать перевернутый прямоугольник.

0 голосов
/ 10 сентября 2009

Имейте таймер, чтобы переключать состояние мигающих узлов, т.е.

Node.ForeColor = Node.ForeColor == Color.White ? Color.Black : Color.White;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...