如何解决悬停在字形上时,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 举报,一经查实,本站将立刻删除。