悬停在字形上时,TreeView节点的图形是否与Application.EnableVisualStyles有关?

问题描述

使用下面的树视图后,我注意到当我注释掉Application.EnableVisualStyles();时,树节点的绘制明显减少了,从而减少了闪烁。我会这样做,但这会改变应用程序的整体风格,这不是我想要的。我想知道是否有人知道如何禁用该事件,或者是否存在可以在树视图上更改的样式设置,以导致仅在选择和创建时才重画节点。谢谢

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp4
{


    public class TreeViewOwnerDraw : Form
    {
        private FakeTree myTreeView;
        private TreeView tester;
        private Button testeeee;
        private TreeNode select;
        private Button button1;
        // Create a Font object for the node tags.
        Font tagFont = new Font("Helvetica",8,FontStyle.Bold);

        public TreeViewOwnerDraw()
        {
            // Create and initialize the TreeView control.
            myTreeView = new FakeTree();
            myTreeView.Dock = DockStyle.Left;
            myTreeView.BackColor = Color.Tan;
            myTreeView.CheckBoxes = true;
            myTreeView.Size = new System.Drawing.Size(75,200); 

            // Add nodes to the TreeView control.
            TreeNode node;
            for (int x = 1; x < 4; ++x)
            {
                // Add a root node to the TreeView control.
                node = myTreeView.Nodes.Add(String.Format("Task {0}",x));
                for (int y = 1; y < 4; ++y)
                {
                    // Add a child node to the root node.
                     TreeNode t = node.Nodes.Add(String.Format("Subtask {0}",y));
                    t.ToolTipText = "help";
                    for (int i = 1; i < 4; ++i)
                    {
                        // Add a child node to the root node.
                         t.Nodes.Add(String.Format("sSubtask {0}",i));
                    }
                }
            }
            myTreeView.ExpandAll();

            // Add tags containing alert messages to a few nodes 
            // and set the node background color to highlight them.
            myTreeView.Nodes[1].Nodes[0].Tag = "urgent!";
            myTreeView.Nodes[1].Nodes[0].BackColor = Color.Yellow;
            myTreeView.SelectedNode = myTreeView.Nodes[1].Nodes[0];
            myTreeView.Nodes[2].Nodes[1].Tag = "urgent!";
            myTreeView.Nodes[2].Nodes[1].BackColor = Color.Yellow;

            // Configure the TreeView control for owner-draw and add
            // a handler for the DrawNode event.
            myTreeView.DrawMode = TreeViewDrawMode.OwnerDrawText;
            myTreeView.DrawNode +=
            new DrawTreeNodeEventHandler(myTreeView_DrawNode);

            // Add a handler for the MouseDown event so that a node can be 
            // selected by clicking the tag text as well as the node text.
            myTreeView.MouseDown += new MouseEventHandler(myTreeView_MouseDown);
            myTreeView.NodeMouseHover += new TreeNodeMouseHoverEventHandler(NodeMousHover);
            myTreeView.Size = new Size(500,500);
            button1 = new Button();
            button1.Size = new Size(100,100);
            button1.Location = new Point(700,700);
            button1.Click += button1_Click;
            // Initialize the form and add the TreeView control to it.
            this.ClientSize = new Size(1000,1000);
            this.Controls.Add(myTreeView);
            this.Controls.Add(button1);
        }

        // Clean up any resources being used.        
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                tagFont.Dispose();
            }
            base.Dispose(disposing);
        }

        [STAThreadAttribute()]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new TreeViewOwnerDraw());
        }

        // Draws a node.
        private void myTreeView_DrawNode(
            object sender,DrawTreeNodeEventArgs e)
        {
            Console.WriteLine(e.Node.Text + " Rewritten");
            // Draw the node text.
            if (e.Node == select)
            {
                e.Graphics.FillRectangle(new SolidBrush(Color.Red),e.Bounds);
                TextRenderer.DrawText(e.Graphics,e.Node.Text,e.Node.NodeFont,e.Bounds,Color.Black,Color.Empty,TextFormatFlags.VerticalCenter);
            }
            else
            {
                e.Graphics.FillRectangle(new SolidBrush(Color.Black),Color.White,TextFormatFlags.VerticalCenter);
            }
        }

        //Selects a node that is clicked on its label or tag text.
        private void myTreeView_MouseDown(object sender,MouseEventArgs e)
        {
            Console.WriteLine("Clicked");
            TreeNode clickedNode = myTreeView.GetNodeAt(e.X,e.Y);
            select = clickedNode;    
            myTreeView.SelectedNode = clickedNode; 
        }


        private void  NodeMousHover(object sender,TreeNodeMouseHoverEventArgs e)
        {
            Console.WriteLine("hover");
        }
  
        private void button1_Click(object sender,EventArgs e)
        {
            Console.WriteLine("Break");
       
        }

    }
}
public class FakeTree : TreeView
     {
    private const int WM_ERASEBKGND = 0x0014;


    // Pinvoke:
    private const int TVM_SETEXTENDEDSTYLE = 0x1100 + 44;
    private const int TVM_GETEXTENDEDSTYLE = 0x1100 + 45;
    private const int TVS_EX_DOUBLEBUFFER = 0x0004;
    protected override void WndProc(ref Message msg)
    {
        if (msg.Msg == WM_ERASEBKGND)
        {
            return;
        }
        base.WndProc(ref msg);

    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)