how to design a new tree view control

   
We recently need a special tree view control that included some Checkbox or Radio controls in some tree node in a VSTO project. Some of complex nodes included checkbox controls or radio controls but others nodes maybe only is a simply tree node in same TreeView control. If we set value of the property named Checkboxes is “true”, all of the node are included a Checkbox in the TreeView controls, otherwise it will have not any checkbox controls.
So I have to redesign a control to implements these features. I decided to inherit directly from the TreeView class instead of create a new class. I overwrite the method named ( OnPaint, WndProc, OnResize etc ) and add some new method that will draw a CheckBox control or Radio control in a tree node.
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

None.gif public  partial  class  BaseTreeView : TreeView
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
ContractedSubBlock.gifExpandedSubBlockStart.gif        
private define#region private define
InBlock.gif        
private Bitmap internalBitmap = null;
InBlock.gif        
private Graphics internalGraphics = null;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// Indicates whether the OnMouseClick event is raised by expand or collapse a tree node.
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        private bool isExpandOrCollapseMouseClick;
ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
InBlock.gif        
InBlock.gif        
public BaseTreeView()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            InitializeComponent();
ExpandedSubBlockEnd.gif        }

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
private method#region private method
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// Dispose the internal object of treeview.
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        private void DisposeInternalObject()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (internalGraphics != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                internalGraphics.Dispose();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
if (internalBitmap != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                internalBitmap.Dispose();
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
public method#region public method
InBlock.gif        
protected override void OnAfterExpand(TreeViewEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            isExpandOrCollapseMouseClick 
= true;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
protected override void OnAfterCollapse(TreeViewEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            isExpandOrCollapseMouseClick 
= true;
InBlock.gif            
//throw new Exception("The method or operation is not implemented.");
ExpandedSubBlockEnd.gif
        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// override the OnResize method
InBlock.gif        
/// </summary>
ExpandedSubBlockEnd.gif        
/// <param name="e"></param>

InBlock.gif        protected override void OnResize(EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (internalBitmap == null ||
InBlock.gif               internalBitmap.Width 
!= Width || internalBitmap.Height != Height)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                
if (Width != 0 && Height != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    DisposeInternalObject();
InBlock.gif                    internalBitmap 
= new Bitmap(Width, Height);
InBlock.gif                    internalGraphics 
= Graphics.FromImage(internalBitmap);
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>Occurs when a Windows message is dispatched.</summary>
InBlock.gif        
/// <param name="message">Message to process.</param>
ExpandedSubBlockEnd.gif        
/// <remarks>Overrides WM_PAINT, WM_ERASEBKGND.</remarks>

InBlock.gif        protected override void WndProc(ref Message message)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
const int WM_PAINT = 0x000F;
InBlock.gif            
const int WM_PRINTCLIENT = 0x0318;
InBlock.gif            
const int WM_ERASEBKGND = 0x0014;
InBlock.gif
InBlock.gif            
switch (message.Msg)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                
case WM_ERASEBKGND:
InBlock.gif                    
//removes flicker
InBlock.gif
                    return;
InBlock.gif
InBlock.gif                
case WM_PAINT:
InBlock.gif                    
// The designer host does not call OnResize()                    
InBlock.gif
                    if (internalGraphics == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        OnResize(EventArgs.Empty);
ExpandedSubBlockEnd.gif                    }

InBlock.gif
InBlock.gif                    
//Set up 
InBlock.gif
                    Win32.RECT updateRect = new Win32.RECT();
InBlock.gif                    
if (Win32.GetUpdateRect(message.HWnd, ref updateRect, false== 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
break;
ExpandedSubBlockEnd.gif                    }

InBlock.gif
InBlock.gif                    Win32.PAINTSTRUCT paintStruct 
= new Win32.PAINTSTRUCT();
InBlock.gif                    IntPtr screenHdc 
= Win32.BeginPaint(message.HWnd, ref paintStruct);
InBlock.gif                    
using (Graphics screenGraphics = Graphics.FromHdc(screenHdc))
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
//Draw Internal Graphics
InBlock.gif
                        IntPtr hdc = internalGraphics.GetHdc();
InBlock.gif                        Message printClientMessage 
= Message.Create(Handle, WM_PRINTCLIENT, hdc, IntPtr.Zero);
InBlock.gif                        DefWndProc(
ref printClientMessage);
InBlock.gif                        internalGraphics.ReleaseHdc(hdc);
InBlock.gif
InBlock.gif                        
//Add the missing OnPaint() call
InBlock.gif
                        OnPaint(new PaintEventArgs(internalGraphics, Rectangle.FromLTRB(
InBlock.gif                            updateRect.left,
InBlock.gif                            updateRect.top,
InBlock.gif                            updateRect.right,
InBlock.gif                            updateRect.bottom)));
InBlock.gif
InBlock.gif                        
//Draw Screen Graphics
InBlock.gif
                        screenGraphics.DrawImage(internalBitmap, 00);
ExpandedSubBlockEnd.gif                    }

InBlock.gif
InBlock.gif                    
//Tear down
InBlock.gif
                    Win32.EndPaint(message.HWnd, ref paintStruct);
InBlock.gif                    
return;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
base.WndProc(ref message);
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>Occurs when the control is redrawn.</summary>
ExpandedSubBlockEnd.gif        
/// <remarks>Re enable browsing attributes for the Paint Event.</remarks>

InBlock.gif        [
InBlock.gif        EditorBrowsableAttribute(EditorBrowsableState.Always),
InBlock.gif        BrowsableAttribute(
true)
InBlock.gif        ]
InBlock.gif        
public new event PaintEventHandler Paint
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            add 
dot.gifbase.Paint += value; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            remove 
dot.gifbase.Paint -= value; }
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
private void OnPaintChildNode(TreeNode parentNode, PaintEventArgs pe)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif           
InBlock.gif            
if (parentNode.Parent != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                OptionTreeNode optionNode 
= parentNode.Parent as OptionTreeNode;
InBlock.gif                OptionItemTreeNode optionItem 
= parentNode as OptionItemTreeNode;
InBlock.gif
InBlock.gif                
if (optionNode != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if (optionNode.IsOptionFolder )
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
if ( optionItem != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
dot.gif{
InBlock.gif                            Rectangle rect 
= new Rectangle(001616);
InBlock.gif                            Bitmap bitmap 
= new Bitmap(1616);
InBlock.gif                            Graphics graphics 
= Graphics.FromImage(bitmap);
InBlock.gif                            
if (optionNode.IsCheckBox)
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
dot.gif{
InBlock.gif                                
if (parentNode.Checked)
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
dot.gif{
InBlock.gif                                    ControlPaint.DrawCheckBox(graphics, rect, ButtonState.Checked 
| ButtonState.Flat);
ExpandedSubBlockEnd.gif                                }

InBlock.gif                                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
dot.gif{
InBlock.gif                                    ControlPaint.DrawCheckBox(graphics, rect, ButtonState.Normal 
| ButtonState.Flat);
ExpandedSubBlockEnd.gif                                }

InBlock.gif
ExpandedSubBlockEnd.gif                            }

InBlock.gif                            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
dot.gif{
InBlock.gif                                
if (parentNode.Checked)
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
dot.gif{
InBlock.gif                                    ControlPaint.DrawRadioButton(graphics, rect, ButtonState.Checked 
| ButtonState.Flat);
ExpandedSubBlockEnd.gif                                }

InBlock.gif                                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
dot.gif{
InBlock.gif                                    ControlPaint.DrawRadioButton(graphics, rect, ButtonState.Normal 
| ButtonState.Flat);
ExpandedSubBlockEnd.gif                                }

ExpandedSubBlockEnd.gif                            }

InBlock.gif
InBlock.gif                            rect 
= parentNode.Bounds;
InBlock.gif                            rect.Y 
= rect.Y + 4;
InBlock.gif                            rect.Height 
= 16;
InBlock.gif                            rect.Width 
= 16;
InBlock.gif                            rect.X 
= rect.X - 40;
InBlock.gif                            pe.Graphics.DrawImage(bitmap, rect);
ExpandedSubBlockEnd.gif                        }

InBlock.gif
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif            
if (parentNode.Nodes == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
foreach (TreeNode node in parentNode.Nodes)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                OnPaintChildNode(node,pe);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif        
protected override void OnPaint(PaintEventArgs pe)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
// TODO: Add custom paint code here
InBlock.gif
           
InBlock.gif            
foreach (TreeNode node in this.Nodes)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                OnPaintChildNode(node,pe);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
base.OnPaint(pe);
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif        
protected override void OnMouseClick(MouseEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            
if (isExpandOrCollapseMouseClick == true)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                isExpandOrCollapseMouseClick 
= false;
InBlock.gif                
return;
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            TreeNode node 
= GetNodeAt(e.X, e.Y);
InBlock.gif
InBlock.gif            
if ((e.X > node.Bounds.Left) && (e.X < node.Bounds.Right) && (e.Y > node.Bounds.Top) && (e.Y < node.Bounds.Bottom))
InBlock.gif                
return;
InBlock.gif
InBlock.gif            
if (node != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (node.Parent != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    OptionTreeNode optionNode 
= node.Parent as OptionTreeNode;
InBlock.gif                    
if (optionNode != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif
InBlock.gif                        
if (optionNode.IsOptionFolder)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
dot.gif{
InBlock.gif                            
if (optionNode.IsCheckBox)
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
dot.gif{
InBlock.gif                                 node.Checked 
= !node.Checked;                            
ExpandedSubBlockEnd.gif                            }

InBlock.gif                            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
dot.gif{
InBlock.gif                                TreeNode parentNode 
= node.Parent;
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
dot.gif{
InBlock.gif                                    
foreach(TreeNode objNode in parentNode.Nodes)
ExpandedSubBlockStart.gifContractedSubBlock.gif                                    
dot.gif{
InBlock.gif                                        
if (node.Equals(objNode))
ExpandedSubBlockStart.gifContractedSubBlock.gif                                        
dot.gif{
InBlock.gif                                            objNode.Checked 
= !objNode.Checked;
ExpandedSubBlockEnd.gif                                        }

InBlock.gif                                        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                                        
dot.gif{
InBlock.gif                                            objNode.Checked 
= false;
ExpandedSubBlockEnd.gif                                        }

ExpandedSubBlockEnd.gif                                    }

InBlock.gif                                    
ExpandedSubBlockEnd.gif                                }

InBlock.gif
ExpandedSubBlockEnd.gif                            }

ExpandedSubBlockEnd.gif                        }

ExpandedSubBlockEnd.gif                    }
 
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif        
#endregion

ExpandedBlockEnd.gif    }

  If any question please reply me.

转载于:https://www.cnblogs.com/umlchina/archive/2005/12/27/305508.html

Stkcd [股票代码] ShortName [股票简称] Accper [统计截止日期] Typrep [报表类型编码] Indcd [行业代码] Indnme [行业名称] Source [公告来源] F060101B [净利润现金净含量] F060101C [净利润现金净含量TTM] F060201B [营业收入现金含量] F060201C [营业收入现金含量TTM] F060301B [营业收入现金净含量] F060301C [营业收入现金净含量TTM] F060401B [营业利润现金净含量] F060401C [营业利润现金净含量TTM] F060901B [筹资活动债权人现金净流量] F060901C [筹资活动债权人现金净流量TTM] F061001B [筹资活动股东现金净流量] F061001C [筹资活动股东现金净流量TTM] F061201B [折旧摊销] F061201C [折旧摊销TTM] F061301B [公司现金流1] F061302B [公司现金流2] F061301C [公司现金流TTM1] F061302C [公司现金流TTM2] F061401B [股权现金流1] F061402B [股权现金流2] F061401C [股权现金流TTM1] F061402C [股权现金流TTM2] F061501B [公司自由现金流(原有)] F061601B [股权自由现金流(原有)] F061701B [全部现金回收率] F061801B [营运指数] F061901B [资本支出与折旧摊销比] F062001B [现金适合比率] F062101B [现金再投资比率] F062201B [现金满足投资比率] F062301B [股权自由现金流] F062401B [企业自由现金流] Indcd1 [行业代码1] Indnme1 [行业名称1] 季度数据,所有沪深北上市公司的 分别包含excel、dta数据文件格式及其说明,便于不同软件工具对数据的分析应用 数据来源:基于上市公司年报及公告数据整理,或相关证券交易所、各部委、省、市数据 数据范围:基于沪深北证上市公司 A股(主板、中小企业板、创业板、科创板等)数据整理计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值