0 Explore TreeView
- TREEVIEW可以增加空白并且空白处不能单击
- 重绘三角箭头
重绘选中时的边框和填充色
- 重绘失去焦点时选中时的边框和填充色
- 重绘光标所在处的节点背景 MOUSE Hover
- 闪烁的问题处理 当TREEVIEW大小改变时闪烁很严重
- 做到自定义控件
- 图片背景
- 光标的在不同位置的相关改变
- WINDOWS 8的资源管理器是不显示水平滚动条






using System.Drawing;
using System.Runtime.InteropServices; namespace System.Windows.Forms
{ public class API
{
private const int WS_HSCROLL = 0x100000;
private const int WS_VSCROLL = 0x200000;
private const int GWL_STYLE = (-); [DllImport("User32.dll")]
public static extern IntPtr LoadCursor(IntPtr hInstance, CursorType cursor); [DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hwnd, int nIndex); [DllImport("user32.dll")]
public static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow); public const int WM_PRINTCLIENT = 0x0318;
public const int PRF_CLIENT = 0x00000004; [DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); /// <summary>
/// 显示系统光标小手
/// 像Win7非经典主题的小手光标
/// </summary>
public static Cursor Hand
{
get
{
IntPtr h = LoadCursor(IntPtr.Zero, CursorType.IDC_HAND);
return new Cursor(h);
}
} public static bool IsWinXP
{
get
{
OperatingSystem OS = Environment.OSVersion;
return (OS.Platform == PlatformID.Win32NT) &&
((OS.Version.Major > ) || ((OS.Version.Major == ) && (OS.Version.Minor == )));
}
} public static bool IsWinVista
{
get
{
OperatingSystem OS = Environment.OSVersion;
return (OS.Platform == PlatformID.Win32NT) && (OS.Version.Major >= );
}
} /// <summary>
/// 判断是否出现垂直滚动条
/// </summary>
/// <param name="ctrl">待测控件</param>
/// <returns>出现垂直滚动条返回true,否则为false</returns>
public static bool IsVerticalScrollBarVisible(Control ctrl)
{
if (!ctrl.IsHandleCreated)
return false; return (GetWindowLong(ctrl.Handle, GWL_STYLE) & WS_VSCROLL) != ;
} /// <summary>
/// 判断是否出现水平滚动条
/// </summary>
/// <param name="ctrl">待测控件</param>
/// <returns>出现水平滚动条返回true,否则为false</returns>
public static bool IsHorizontalScrollBarVisible(Control ctrl)
{
if (!ctrl.IsHandleCreated)
return false;
return (GetWindowLong(ctrl.Handle, GWL_STYLE) & WS_HSCROLL) != ;
}
} public enum CursorType : uint
{
IDC_ARROW = 32512U,
IDC_IBEAM = 32513U,
IDC_WAIT = 32514U,
IDC_CROSS = 32515U,
IDC_UPARROW = 32516U,
IDC_SIZE = 32640U,
IDC_ICON = 32641U,
IDC_SIZENWSE = 32642U,
IDC_SIZENESW = 32643U,
IDC_SIZEWE = 32644U,
IDC_SIZENS = 32645U,
IDC_SIZEALL = 32646U,
IDC_NO = 32648U,
//小手
IDC_HAND = 32649U,
IDC_APPSTARTING = 32650U,
IDC_HELP = 32651U
} public class TreeViewEx : TreeView
{
#region 双缓存重绘 private const int WM_VSCROLL = 0x0115;
private const int WM_HSCROLL = 0x0114;
//private const int WM_MOUSEWHEEL = 0x020A;
private const int TV_FIRST = 0x1100;
private const int TVM_SETBKCOLOR = TV_FIRST + ;
private const int TVM_SETEXTENDEDSTYLE = TV_FIRST + ;
private const int TVS_EX_DOUBLEBUFFER = 0x0004; private void UpdateExtendedStyles()
{
int Style = ; if (DoubleBuffered)
Style |= TVS_EX_DOUBLEBUFFER; if (Style != )
API.SendMessage(Handle, TVM_SETEXTENDEDSTYLE, (IntPtr)TVS_EX_DOUBLEBUFFER, (IntPtr)Style);
} protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
UpdateExtendedStyles();
if (!API.IsWinXP)
API.SendMessage(Handle, TVM_SETBKCOLOR, IntPtr.Zero, (IntPtr)ColorTranslator.ToWin32(BackColor));
} protected override void OnPaint(PaintEventArgs e)
{
if (GetStyle(ControlStyles.UserPaint))
{
Message m = new Message();
m.HWnd = Handle;
m.Msg = API.WM_PRINTCLIENT;
m.WParam = e.Graphics.GetHdc();
m.LParam = (IntPtr)API.PRF_CLIENT;
DefWndProc(ref m);
e.Graphics.ReleaseHdc(m.WParam);
}
base.OnPaint(e);
}
#endregion public TreeViewEx()
{
treeView1 = this;
treeView1.HotTracking = true;
treeView1.HideSelection = false; treeView1.SelectedImageIndex = treeView1.ImageIndex; this.treeView1.BackColor = System.Drawing.Color.White;
this.treeView1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.treeView1.Font = new System.Drawing.Font("微软雅黑", 9.7F);
this.treeView1.FullRowSelect = true;
treeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll; //treeView1.Nodes[1].Expand();
//treeView1.Nodes[5].Expand();
//treeView1.SelectedNode = treeView1.Nodes[1]; this.treeView1.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(this.treeView1_DrawNode);
this.treeView1.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeView1_BeforeSelect);
this.treeView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeView1_KeyDown);
} #region DrawNode public ImageList arrowImageList
{
get
{
return arrowImageList1;
}
set
{
arrowImageList1 = value;
}
} /*1节点被选中 ,TreeView有焦点*/
private SolidBrush brush1 = new SolidBrush(Color.FromArgb(, , ));//填充颜色
private Pen pen1 = new Pen(Color.FromArgb(, , ), );//边框颜色 /*2节点被选中 ,TreeView没有焦点*/
private SolidBrush brush2 = new SolidBrush(Color.FromArgb(, , ));
private Pen pen2 = new Pen(Color.FromArgb(, , ), ); /*3 MouseMove的时候 画光标所在的节点的背景*/
private SolidBrush brush3 = new SolidBrush(Color.FromArgb(, , ));
private Pen pen3 = new Pen(Color.FromArgb(, , ), ); private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{ #region 1 选中的节点背景=========================================
Rectangle nodeRect = new Rectangle(,
e.Bounds.Top,
e.Bounds.Width - ,
e.Bounds.Height - ); if (e.Node.IsSelected)
{
//TreeView有焦点的时候 画选中的节点
if (treeView1.Focused)
{
e.Graphics.FillRectangle(brush1, nodeRect);
e.Graphics.DrawRectangle(pen1, nodeRect); /*测试 画聚焦的边框*/
//ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, Color.Black, SystemColors.Highlight);
}
/*TreeView失去焦点的时候 */
else
{
e.Graphics.FillRectangle(brush2, nodeRect);
e.Graphics.DrawRectangle(pen2, nodeRect);
}
}
else if ((e.State & TreeNodeStates.Hot) != && e.Node.Text != "")//|| currentMouseMoveNode == e.Node)
{
e.Graphics.FillRectangle(brush3, nodeRect);
e.Graphics.DrawRectangle(pen3, nodeRect);
}
else
{
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
}
#endregion #region 2 +-号绘制=========================================
Rectangle plusRect = new Rectangle(e.Node.Bounds.Left - , nodeRect.Top + , , ); // +-号的大小 是9 * 9 if (e.Node.IsExpanded)
e.Graphics.DrawImage(arrowImageList.Images[], plusRect);
else if (e.Node.IsExpanded == false && e.Node.Nodes.Count > )
e.Graphics.DrawImage(arrowImageList.Images[], plusRect); /*测试用 画出+-号出现的矩形*/
//if (e.Node.Nodes.Count > 0)
// e.Graphics.DrawRectangle(new Pen(Color.Red), plusRect);
#endregion #region 3 画节点文本=========================================
Rectangle nodeTextRect = new Rectangle(
e.Node.Bounds.Left,
e.Node.Bounds.Top + ,
e.Node.Bounds.Width + ,
e.Node.Bounds.Height
);
nodeTextRect.Width += ;
nodeTextRect.Height -= ; e.Graphics.DrawString(e.Node.Text,
e.Node.TreeView.Font,
new SolidBrush(Color.Black),
nodeTextRect); //画子节点个数 (111)
if (e.Node.GetNodeCount(true) > )
{
e.Graphics.DrawString(string.Format("({0})", e.Node.GetNodeCount(true)),
new Font("Arial", ),
Brushes.Gray,
nodeTextRect.Right - ,
nodeTextRect.Top + );
} ///*测试用,画文字出现的矩形*/
//if (e.Node.Text != "")
// e.Graphics.DrawRectangle(new Pen(Color.Blue), nodeTextRect);
#endregion #region 4 画IImageList 中的图标=================================================================== int currt_X = e.Node.Bounds.X;
if (treeView1.ImageList != null && treeView1.ImageList.Images.Count > )
{
//图标大小16*16
Rectangle imagebox = new Rectangle(
e.Node.Bounds.X - - ,
e.Node.Bounds.Y + ,
,//IMAGELIST IMAGE WIDTH
);//HEIGHT int index = e.Node.ImageIndex;
string imagekey = e.Node.ImageKey;
if (imagekey != "" && treeView1.ImageList.Images.ContainsKey(imagekey))
e.Graphics.DrawImage(treeView1.ImageList.Images[imagekey], imagebox);
else
{
if (e.Node.ImageIndex < )
index = ;
else if (index > treeView1.ImageList.Images.Count - )
index = ;
e.Graphics.DrawImage(treeView1.ImageList.Images[index], imagebox);
}
currt_X -= ; /*测试 画IMAGELIST的矩形*/
//if (e.Node.ImageIndex > 0)
// e.Graphics.DrawRectangle(new Pen(Color.Black, 1), imagebox);
}
#endregion ///*测试 画所有的边框*/
//nodeRect = new Rectangle(1,
// e.Bounds.Top + 1,
// e.Bounds.Width - 3,
// e.Bounds.Height - 2);
//e.Graphics.DrawRectangle(new Pen(Color.Gray), nodeRect);
} #endregion private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
if (e.Node != null)
{
//禁止选中空白项
if (e.Node.Text == "")
{
//响应上下键
if (ArrowKeyUp)
{
if (e.Node.PrevNode != null && e.Node.PrevNode.Text != "")
treeView1.SelectedNode = e.Node.PrevNode;
} if (ArrowKeyDown)
{
if (e.Node.NextNode != null && e.Node.NextNode.Text != "")
treeView1.SelectedNode = e.Node.NextNode;
} e.Cancel = true;
}
}
} private void treeView1_KeyDown(object sender, KeyEventArgs e)
{
ArrowKeyUp = (e.KeyCode == Keys.Up);
if (e.KeyCode == Keys.Down)
{
Text = "Down";
} ArrowKeyDown = (e.KeyCode == Keys.Down);
if (e.KeyCode == Keys.Up)
{
Text = "UP";
} } private bool ArrowKeyUp = false;
private bool ArrowKeyDown = false;
private System.Windows.Forms.ImageList arrowImageList1;
private TreeView treeView1; }
}
0 Explore TreeView的更多相关文章
- Odoo8.0中允许用户动态调整TreeView栏位宽度
现有的Odoo8.0中TreeView的栏位宽度是固定的,不可以手动调整,通过安装第三方插件后,可以实现手工动态调整. 下载模块安装即可.http://download.csdn.net/detail ...
- 怎样制作web版的folder treeview
文件夹treeview的效果 这样的treeview在实际项目中使用的场景较多. 既然用的多,那就DIY一遍,虽没有面面俱到,但也要将其基本实现完成一遍. 1.先准备图标素材 file.gif,文件 ...
- treeview bootstrap 多级下拉树
bootstrap-treeview.js1是一款强大的树菜单插件,本文演示bootstrap-treeview.js15种不同的调用方法.它可一次性加载数据,也可异步加载.支持Checkbox,se ...
- ComboBox中如何嵌套TreeView控件
在ComboBox中嵌套TreeView控件,有时候我们在设计界面的时候,由于界面设计的需要,我们需要将TreeView控件嵌套在ComboBox中,因为TreeView控件实在是太占用地方了,要 ...
- Virtual Treeview 安装以及入门
Virtual Treeview是一套Delphi下优秀的VCL控件,代码质量高,使用灵活.功能强大.性能非常好,可以用于表达Treeview和表格类数据.它的代码现在托管在google code上. ...
- 潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据
原文:潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据 目前自己对treeview的感慨很多 今天先讲 面对这种 表结构的数据 的其中 ...
- delphi 根据数据库结构生成TreeView
procedure TUIOperate.FillTree(treeview: TTreeView); var findq: TADOQuery; node: TTreeNode; / ...
- 操作TreeView(咏南工作室)
{*******************************************************}{ ...
- 侧边栏下拉时箭头的旋转动画(treeView控件)
//点击菜单时箭头旋转 let treeView = document.getElementsByClassName("treeview");//let解决闭包问题 let las ...
随机推荐
- poj 2533 Longest Ordered Subsequence(dp)
题目:http://poj.org/problem?id=2533 题意:最长上升子序列.... 以前做过,课本上的思想 #include<iostream> #include<cs ...
- jquery提示气泡
<link href="css/manhua_hoverTips.css" type="text/css" rel="stylesheet&qu ...
- c语言关键字总结
1.关键字变更历史 1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字: inline restrict _Bool _Complex _Imaginary(注意bool 从 ...
- C#生成缩略图代码
/**//// <summary> /// 生成缩略图 /// </summary> /// <param name=&q ...
- Entity Framework 数据生成选项DatabaseGenerated
在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity.None和Computed. Identity:自增长 None:不 ...
- WCF 实例化与会话
实例管理旨在解决服务实例的激活和服务实例生命周期的控制,会话的目的是在于保持相同客户端(服务代理)多次服务调用的状态. 实例上下文 实例上下文是对服务实例的封装,是WCF管理服务实例生命周期的依托,S ...
- java jvm学习笔记四(安全管理器)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一 ...
- JMX-JAVA进程监控利器
Java 管理扩展(Java Management Extension,JMX)是从jdk1.4开始的,但从1.5时才加到jdk里面,并把API放到java.lang.management包里面. 如 ...
- [Irving]SqlServer 标量函数 详解【转】
--创建用户定义函数.这是一个已保存 Transact-SQL 或公共语言运行时 (CLR) 例程,--该例程可返回一个值.用户定义函数不能用于执行修改数据库状态的操作.--与系统函数一样,用户定义函 ...
- use vagrant under win7
1.下载安装最新版的vagrant 和 visualbox 到https://vagrantcloud.com/search 搜索要的linux发行版,比如ubuntu 我们用最上面这个版本做测试 拷 ...