在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → treegrid自定义控件

treegrid自定义控件

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.91M
  • 下载次数:28
  • 浏览次数:567
  • 发布时间:2016-07-12
  • 实例类别:C#语言基础
  • 发 布 人:lwdream
  • 文件格式:.rar
  • 所需积分:3
 相关标签: 自定义控件

实例介绍

【实例简介】
【实例截图】

【核心代码】

/// <summary>
/// 锁定线的颜色,可以自定义,默认为DarkGray
/// </summary>
public Color LockLineColor = Color.DarkGray;
/// <summary>
/// q锁定线的宽度
/// </summary>
public int   LockLineWidth = 1; 

//----------------------------------显示控制-------------------begin
public bool Disp_VLine     = true; //显示列上的线
public bool Disp_HLine     = true; //显示行上的线
public bool Disp_LockLine  = true; //显示锁定线

public bool Disp_TreeHLine     = true; //显示行树上的级次线

//----------------------------------显示控制-------------------end


//------------event----------------
/// <summary>
/// NODE被展开时的事件;行上的树
/// </summary>
public IEvent_NodeExpand     iEvent_RowNodeExpanded = null;
/// <summary>
/// NODE被展开时的事件;列上的树
/// </summary>
public IEvent_NodeExpand     iEvent_ColNodeExpanded = null;
/// <summary>
/// 当前单元格被改变前的事件,相当于TREE中的ONCHANGING;
/// </summary>
public IEvent_RowColChanging iEvent_RowColChanging = null;
/// <summary>
/// 当前单元格被改变后的事件,相当于TREE中的ON_CHANGED;
/// </summary>
public IEvent_RowColChanged  iEvent_RowColChanged = null;

/// <summary>
/// 某一单元的内容即将发生变化时的事件
/// </summary>
public IEvent_CellValueChanging iEvent_CellValueChanging = null;

/// <summary>
/// 某一单元值发生变化后的事件
/// </summary>
public IEvent_CellValueChanged  iEvent_CellValueChanged = null;

//---------event end-------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>var define end -------------------------------------------

internal Graphics dc() { {
// get
if (m_dc == null) {
Rectangle rr = this.workRegion.WorkRect;

if(rr.Width <= 0 || rr.Height <= 0) {
m_bmp = new Bitmap(1,1);
}
else {
m_bmp = new Bitmap(rr.Width,rr.Height); //r.Width,r.Height);
}

m_dc = Graphics.FromImage(m_bmp);//this.CreateGraphics();
//m_dc = this.CreateGraphics();
}

return m_dc;
}

}

internal void ResetDC() {
try {
if(m_dc != null) {
m_dc.Dispose();
}
}
catch {

}
try {
if(m_bmp != null) {
m_bmp.Dispose();
}

}
catch {

}

m_dc = null;
m_bmp = null;
}


/// <summary>
/// 初始化,在显示控件之前调用;
/// </summary>
public void Init() {
this.curPos = new TRCellPos(this);
this.mousePosition_Director = new TRMousePosition(this);

//TREDIT
this.TREDIT = new TREdit(this);
this.TREDIT.SetAdapter(new TREdit_Adapter(this));

// this.TREDIT.TextChanged = new System.EventHandler(this.On_TextChanged);

//-------------------------------------- vTree.IncWnd(1);
// vTree.DrawControl();
// vTree.dc = this.dc();
vTree.m_bVertical = true;
vTree.Indent      = 10;
vTree.defaultDistance = 90;

vTree.ClientRectAll = new Rectangle(0,0,this.ClientRectangle.Width,70);

//vTree.outputDebug       = this.outputDebug;
vTree.RequestPaint         = new event_NotifyPaint(event_TRSoil_RequestPaint);
vTree.On_Notify_Expanded   = new event_NotifyExpanded(event_vTree_NodeExpanded);
//hTree ---------------------------------------------------------
// hTree.dc = this.dc();
hTree.m_bVertical = false;


hTree.ClientRectAll = new Rectangle(0,70,
this.ClientRectangle.Width,
this.ClientRectangle.Height - 70);

//hTree.outputDebug = this.outputDebug;
hTree.RequestPaint = new event_NotifyPaint(event_TRSoil_RequestPaint);
hTree.On_Notify_Expanded   = new event_NotifyExpanded(event_hTree_NodeExpanded);
//-----------SCRollBar-------------------------
hScrollBar.Height = this.hScrollBarHeight;
hScrollBar.Parent = this;
hScrollBar.Visible = true;
hScrollBar.Scroll = new ScrollEventHandler(this.hScrollBar_Scroll);

//----------vScrollBar


vScrollBar.Width  = this.vScrollBarWidth;
vScrollBar.Parent = this;
vScrollBar.Visible = true;

vScrollBar.Scroll = new ScrollEventHandler(this.vScrollBar_Scroll);
//==============all============================
//this.Resize     = new System.EventHandler(this.On_Resize);

this.SizeChanged = new EventHandler(this.ON_SizeChanged);


this.MouseDown = new MouseEventHandler(this.On_MouseDown);
//this.Paint = new PaintEventHandler(this.On_Paint);
this.MouseMove = new MouseEventHandler(this.On_MouseMove);
this.MouseUp   = new System.Windows.Forms.MouseEventHandler(this.On_MouseUp);

this.MouseWheel = new MouseEventHandler(On_MouseWheel);
this.KeyDown   = new System.Windows.Forms.KeyEventHandler(this.On_KeyDown);

}


internal void DrawTextOfTopLeft(Graphics dc) {
Rectangle rect = new Rectangle(workRegion.WorkRect.Location,
new Size(this.hTreeWidth,
workRegion.vTreeRect.Height
));

dc.SetClip(rect);
//shadow effect

dc.DrawLine(Pens.Gray,rect.Right - 1,rect.Top,rect.Right - 1,rect.Bottom);
dc.DrawLine(new Pen(Color.White,0.5F),rect.Right,rect.Top,rect.Right ,rect.Bottom);

StringFormat fmt = new StringFormat();
// fmt.Alignment = StringAlignment.Far;
fmt.LineAlignment = StringAlignment.Center;
// fmt.LineAlignment = StringAlignment.Near;
fmt.FormatFlags = StringFormatFlags.NoWrap;

dc.DrawString(textOfTopLeft,
fontOfTopLeft,
Brushes.Black,
rect,
fmt
);

}


/// <summary>
/// 对控件进行重新绘制
/// </summary>
public void DrawAll() {
//DateTime dt0 = DateTime.Now;

Graphics g = this.CreateGraphics();

this.DrawAll(g);

// GC.Collect(3);

DateTime dt = DateTime.Now;

//--------------ShowEdit------------------
ShowEdit_Smart();


//get focus to make mousewheel event visible
this.Focus();



/*
this.HideEdit();


if (curPos.vTreeNode().readOnly != true)
this.ShowEdit();
if (curPos.hTreeNode().readOnly != true)
this.ShowEdit();
*/

this.Debug("---------DrawAll() ");



}





/// <summary>
/// 对控件进行重新绘制
/// </summary>
public void DrawAll(Graphics g) {
this.ResetDC();

Graphics dc = this.dc();

try {
dc.Clear(Color.White);


//TextOf TopLeft


//-----------------Header

Rectangle rect = new Rectangle(workRegion.WorkRect.Location,
new Size(workRegion.WorkRect.Width,
workRegion.vTreeRect.Height
));

dc.SetClip(rect);

//shadow effect
dc.FillRectangle(new SolidBrush(Color.LightGray),rect);
dc.DrawLine(new Pen(Color.Black,1F),rect.Left,rect.Bottom - 1,rect.Right,rect.Bottom - 1);

//ControlPaint.DrawButton(dc,rect,ButtonState.Normal);

//-------TopLeft--------------------------------------------
DrawTextOfTopLeft(dc);

//-------------vTree----------------------------------------
dc.SetClip(workRegion.vTreeRect);
vTree.DrawControl(dc,this.nodeDrawParam_vTree,this.curPos.vTreeNode());

//-------------hTree---------------------------------------
dc.SetClip(workRegion.hTreeRect);
dc.FillRectangle(Brushes.White,workRegion.hTreeRect);
hTree.DrawControl(dc,this.nodeDrawParam_hTree,this.curPos.hTreeNode());

//cell
dc.SetClip(workRegion.R);
DrawCell(dc);

//-------------Line
dc.SetClip(workRegion.WorkRect);
DrawGridLine(dc);
    
if(this.Disp_LockLine){
DrawLockLine(dc);
}

//------------Stretch--------------------------------------
//Graphics g = this.CreateGraphics();
Rectangle r = this.workRegion.WorkRect;
g.SetClip(r);
g.DrawImageUnscaled(m_bmp,0,0);
}
catch(Exception e) {
MessageBox.Show("DrawAll Error \n\r" e.Message);
}

//show Edit Window
//ShowEdit_Smart();
statusVar.Draw_Count = 1;

if (statusVar.Draw_Count > 100){
GC.Collect();
statusVar.Draw_Count = 0;
}


}


/// <summary>
/// 重新绘制锁定线,一般不需要显式调用
/// </summary>
/// <param name="dc"></param>
public void DrawLockLine(Graphics dc) {
if (!Locked()) return;

Graphics g = dc;
g.SetClip(workRegion.WorkRect);

Rectangle r = vTree.ClientRect_Lock;

Point pt0 = new Point(r.Right,r.Top);
Point pt  = new Point(r.Right,workRegion.WorkRect.Bottom);

g.DrawLine(new Pen(new SolidBrush(LockLineColor),LockLineWidth),pt0,pt);
}

private void On_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
if (!this.Focused) this.Focus();

Point pt = new Point(e.X,e.Y);

SetRegion_R1_R2();

if (this.vTree.ClientRectAll.Contains(pt)){
vTree.On_MouseDown(pt);

On_MouseDown_ResizeCol(pt);
}
else
if (this.hTree.ClientRectAll.Contains(pt)){
if(!hTree.On_MouseDown(pt)){
On_Click_hTree(workRegion.hTreeRect,pt);
}
}
else
if (workRegion.RTopLeft.Contains(pt)){
this.On_MouseDown_ResizeCol(pt);
}
else
if (workRegion.R1.Contains(pt)){
On_Click_R1(workRegion.R1,pt);

mouseInfo.oldPos.X = -1;
mouseInfo.eventID  = TRMouseEvent.None;
}
}


private int Debug_Count = 0;
/// <summary>
/// 用于跟踪
/// </summary>
/// <param name="s"></param>
public void Debug(string s) {
// if (!this.outputDebug.Equals(null))
// this.outputDebug(s);
Debug_Count ;
System.Console.WriteLine("------- " Debug_Count " ---------------  " s);

return;
}

internal Rectangle gridRectX(TRRegionType iRegionType) {
Rectangle r = new Rectangle();
switch (iRegionType) {
case TRRegionType.RTopLeft: {
r = new Rectangle(this.ClientRectangle.Location,
new Size(this.hTreeWidth,
this.vTreeHeight )
);
break;
}

case TRRegionType.WorkRect: {
r = new Rectangle(this.ClientRectangle.Location,
new Size(ClientRectangle.Width - this.vScrollBarWidth,
ClientRectangle.Height - this.hScrollBarHeight
));
break;
}
case TRRegionType.R: {
int iLeft =  this.workRegion.WorkRect.Left this.hTreeWidth;
int iTop  =  this.workRegion.WorkRect.Top this.vTreeHeight;

//old
int iWidth = this.workRegion.WorkRect.Width - this.hTreeWidth ;
int iHeight = this.workRegion.WorkRect.Height - this.vTreeHeight;

r = new Rectangle(iLeft,iTop,iWidth,iHeight);
break;
}

case TRRegionType.R1: {
int iLeft =  this.workRegion.WorkRect.Left this.hTreeWidth;
int iTop  =  this.workRegion.WorkRect.Top;

//??? May be wrong ,  20060816
int iWidth = this.workRegion.WorkRect.Width - this.vScrollBarWidth - this.hTreeWidth;
int iHeight = this.vTreeHeight;

r = new Rectangle(iLeft,iTop,iWidth,iHeight);
break;
}
case TRRegionType.R2: {
int iLeft =  this.workRegion.WorkRect.Left this.hTreeWidth;
int iTop  =  this.workRegion.WorkRect.Top;

//??? May be wrong ,  20060816
int iWidth = this.workRegion.WorkRect.Width - this.vScrollBarWidth - this.hTreeWidth;
int iHeight = this.vTreeHeight;

r = new Rectangle(iLeft,iTop,iWidth,iHeight);
break;
}

case TRRegionType.vTreeRect: {
int iLeft =  this.workRegion.WorkRect.Left this.hTreeWidth;
int iTop  =  this.workRegion.WorkRect.Top;
int iWidth = this.workRegion.WorkRect.Width - this.vScrollBarWidth - this.hTreeWidth;
int iHeight = this.vTreeHeight;

r = new Rectangle(iLeft,iTop,iWidth,iHeight);
break;
}

case TRRegionType.hTreeRect: {
int iLeft =  this.workRegion.WorkRect.Left ;
int iTop  =  this.workRegion.WorkRect.Top this.vTreeHeight;
int iWidth = this.hTreeWidth;
int iHeight = this.workRegion.WorkRect.Height - this.vTreeHeight;

r = new Rectangle(iLeft,iTop,iWidth,iHeight);
break;
}

}
return r;
}


/// <summary>
/// 不般不需要显式调用
/// </summary>
public void SetRect() {
workRegion.SetGridRect(this);

hScrollBar.Bounds =  new Rectangle(0,
workRegion.hTreeRect.Bottom,
workRegion.WorkRect.Width,
hScrollBarHeight);

vScrollBar.Bounds =  new Rectangle(workRegion.WorkRect.Right,
workRegion.WorkRect.Top,
this.vScrollBarWidth,
workRegion.WorkRect.Height );

vTree.ClientRectAll = workRegion.vTreeRect;
vTree.SetRect();

hTree.ClientRectAll = workRegion.hTreeRect;
hTree.SetRect();

//ResetDC();

//vTree.dc = this.dc();
//hTree.dc = this.dc();

this.Set_hScrollBar_Range();
this.Set_vScrollBar_Range();
}


private void On_Resize(object sender, System.EventArgs e) {
// SetRect();
//
// vTree.dc   = this.CreateGraphics();
//
// vTree.Reset();
}

private void ON_SizeChanged(object sender, System.EventArgs e) {
SetRect();  //中间已经RESETDC了

this.DrawAll();
}

private void Set_hScrollBar_Range() {
if(this.Locked()) {
int iMax = vTree.GetVisibleNodeCount(vTree.wndLockList[vTree.wndLockList.count - 1].getNextVisibleNode()) ;// vTree.wndList.count vTree.wndLockList.count;

if (iMax > 0) {
hScrollBar.Maximum = iMax ;
hScrollBar.LargeChange = iMax > 20 ? iMax / 10 : 2;

hScrollBar.Maximum = iMax   hScrollBar.LargeChange;
hScrollBar.Minimum = 0;
}
else {
hScrollBar.Maximum = 0;
hScrollBar.Minimum = 0;
}
}
else{
int iMax = vTree.GetVisibleNodeCount(null) ;

if (iMax > 0) {
hScrollBar.Maximum = iMax;
hScrollBar.LargeChange = iMax > 20 ? iMax / 10 : 1;
hScrollBar.Maximum = iMax   hScrollBar.LargeChange;

hScrollBar.Minimum = 0;
}
else {
hScrollBar.Maximum = 0;
hScrollBar.Minimum = 0;
}
}

}


private void Set_vScrollBar_Range() {
//---------vScrollBar

int iMax_H = hTree.GetVisibleNodeCount(null) ;
if (iMax_H > 0) {
vScrollBar.Maximum      = iMax_H;
vScrollBar.LargeChange  = iMax_H > 20 ? iMax_H / 20 : 5;
vScrollBar.Maximum      = iMax_H  vScrollBar.LargeChange;
vScrollBar.Minimum      = 0;
}
else {
vScrollBar.Maximum = 0;
vScrollBar.Minimum = 0;
}
}

private void hScrollToValue(int iValue) {
if(!this.m_hScroll_CanDo) return;

if (this.Locked()) {
TRNode node = vTree.wndLockList[vTree.wndLockList.count - 1].nextVisibleNode;

vTree.SetAbsScrollPos(node,iValue);
}
else {
TRNode node = vTree.nodes[0];

vTree.SetAbsScrollPos(node,iValue);
}  
}

private void hScrollBar_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e) {
hScrollToValue(e.NewValue);

DrawAll();

}



/// <summary>
/// 控制是否滚动滚动条;
/// </summary>
private bool m_vScroll_CanDo = true;
private bool m_hScroll_CanDo = true;
private void vScrollBar_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e) {
this.vScrollToValue(e.NewValue);
}

public void DrawGridLine_H(Graphics dc) {
#region 
// Graphics g = dc;  //Graphics.FromHdc(m.WParam);
//
// if (hTree.wndList.count == 0) return;
//
// for(int i = 0; i < hTree.wndList.count ; i ) {
// TRNode node = hTree.wndList[i];
// int iLeft = workRegion.WorkRect.Left;
// int iTop  = node.bounds.Top;
// int iWidth = workRegion.WorkRect.Width;
// int iHeight = node.bounds.Height;
//
// Rectangle r = new Rectangle(iLeft,iTop,iWidth,iHeight);
// g.DrawRectangle(Pens.LightGray,r);
// }
#endregion

Graphics g = dc;  //Graphics.FromHdc(m.WParam);

if (hTree.wndList.count == 0) return;


//

//-get Width fixed
int  iWidthFixed   = 0; 
int  iWidthDynamic = 0;

if (vTree.wndLockList.count != 0) {
for(int i = 0; i < vTree.wndLockList.count ; i ) {
TRNode node = vTree.wndLockList[i];

iWidthFixed = node.distance;
}
}

//getWidth Dynamic
if (vTree.wndList.count != 0) {
for(int i = 0; i < vTree.wndList.count ; i ) {
TRNode node = vTree.wndList[i];

iWidthDynamic = node.distance;
}
}

//
int iWidthTotal = iWidthFixed iWidthDynamic;

int iLeft  = workRegion.WorkRect.Left;
int iWidth = iWidthTotal this.hTreeWidth;

if(!this.Disp_TreeHLine){
iLeft  = workRegion.R.Left;
iWidth = iWidthTotal ;
}


//---------draw

for(int i = 0; i < hTree.wndList.count ; i ) {
TRNode node = hTree.wndList[i];
int iTop  = node.bounds.Top;

int iHeight = node.bounds.Height;

Rectangle r = new Rectangle(iLeft,iTop,iWidth,iHeight);
g.DrawRectangle(Pens.LightGray,r);


//draw LastLIne
if(!this.Disp_TreeHLine){
if(i == hTree.wndList.count - 1){
int iLastX1 = r.Right;
int iLastY = r.Bottom;

int iLastX0 = workRegion.WorkRect.Left;

g.DrawLine(Pens.LightGray,iLastX0,iLastY,iLastX1,iLastY);
}
}
}


}


private void DrawGridLine_V(Graphics dc,Color lineColor) {
#region
//Graphics g = dc;  //Graphics.FromHdc(m.WParam);
//
//if (vTree.wndList.count == 0) return;
//
//int iDistance = 2;
//
////Dynamic
//for(int i = 0; i < vTree.wndList.count ; i ) {
// TRNode node = vTree.wndList[i];
// int iLeft = node.bounds.Left;
// int iTop  = workRegion.WorkRect.Top - iDistance;
// int iWidth  = node.bounds.Width;
// int iHeight = workRegion.WorkRect.Height;
//
// Rectangle r = new Rectangle(iLeft,iTop,iWidth,iHeight);
// g.DrawRectangle(new Pen(lineColor),r);
//}
//
////Fixed
//for(int i = 0; i < vTree.wndLockList.count ; i ) {
// TRNode node = vTree.wndLockList[i];
// int iLeft = node.bounds.Left ;
// int iTop  = workRegion.WorkRect.Top - iDistance ;
// int iWidth  = node.bounds.Width;
// int iHeight = workRegion.WorkRect.Height;
//
// Rectangle r = new Rectangle(iLeft,iTop,iWidth,iHeight);
// g.DrawRectangle(Pens.Gray,r);
//}

#endregion


Graphics g = dc;  //Graphics.FromHdc(m.WParam);

if (vTree.wndList.count == 0) return;

int iDistance = 2;

//get HeightTotal
int iHeightTotal = 0;
for(int i = 0; i < hTree.wndList.count ; i ) {
TRNode node   = hTree.wndList[i];
iHeightTotal = node.distance;
}

//Dynamic
for(int i = 0; i < vTree.wndList.count ; i ) {
TRNode node = vTree.wndList[i];
int iLeft   = node.bounds.Left;
int iTop    = workRegion.R.Top - iDistance; //workRegion.WorkRect.Top - iDistance;
int iWidth  = node.bounds.Width;
//int iHeight = workRegion.WorkRect.Height;
int iHeight = iHeightTotal;

Rectangle r = new Rectangle(iLeft,iTop,iWidth,iHeight iDistance);
g.DrawRectangle(new Pen(lineColor),r);
}

//Fixed
for(int i = 0; i < vTree.wndLockList.count ; i ) {
TRNode node = vTree.wndLockList[i];
int iLeft = node.bounds.Left ;
int iTop  = workRegion.R.Top - iDistance ;//workRegion.WorkRect.Top - iDistance ;
int iWidth  = node.bounds.Width;
//int iHeight = workRegion.WorkRect.Height;
int iHeight = iHeightTotal;

Rectangle r = new Rectangle(iLeft,iTop,iWidth,iHeight iDistance);
g.DrawRectangle(Pens.Gray,r);
}



}

private void DrawGridLine(Graphics dc) {
RectangleF clipOld = dc.ClipBounds;

if(this.Disp_HLine){
DrawGridLine_H(dc);
}

//画列头上的效果
dc.SetClip(workRegion.vTreeRect);
DrawGridLine_V_3D(dc);


//
if (this.Disp_VLine){
dc.SetClip(workRegion.R);
DrawGridLine_V(dc,Color.LightGray);
}

dc.SetClip(clipOld);
}

private void DrawGridLine_V_3D(Graphics dc) {
Graphics g = dc;  //Graphics.FromHdc(m.WParam);
g.SetClip(workRegion.vTreeRect);

if (vTree.wndList.count == 0) return;

int iDistance = 2;

//Dynamic
for(int i = 0; i < vTree.wndList.count ; i ) {
TRNode node = vTree.wndList[i];
int iLeft   = node.bounds.Left;
int iTop    = workRegion.WorkRect.Top - iDistance;
int iWidth  = node.bounds.Width;
int iHeight = workRegion.WorkRect.Height;

//Rectangle r = new Rectangle(iLeft,iTop,iWidth,iHeight);
//g.DrawRectangle(new Pen(lineColor),r);
//ControlPaint.DrawBorder3D(g,iLeft,iTop,2,workRegion.vTreeRect.Height 2 ,Border3DStyle.Etched);
g.DrawLine(Pens.Gray,iLeft - 1,iTop,iLeft - 1,iTop iHeight);
g.DrawLine(new Pen(Color.White,0.5F),
iLeft,iTop,
iLeft,iTop iHeight);


//RIGHT MAX
if(i ==   vTree.wndList.count - 1) {

iLeft   = node.bounds.Right  ;
iTop    = workRegion.WorkRect.Top - iDistance;
iWidth  = node.bounds.Width;
iHeight = workRegion.WorkRect.Height;

g.DrawLine(Pens.Gray,iLeft - 1,iTop,iLeft - 1,iTop iHeight);
g.DrawLine(new Pen(Color.White,0.5F),
iLeft,iTop,
iLeft,iTop iHeight);

}



}

//Fixed
for(int i = 0; i < vTree.wndLockList.count ; i ) {
TRNode node = vTree.wndLockList[i];
int iLeft = node.bounds.Left ;
int iTop  = workRegion.WorkRect.Top - iDistance ;
int iWidth  = node.bounds.Width;
int iHeight = workRegion.WorkRect.Height;

//ControlPaint.DrawBorder3D(g,iLeft,iTop,2,workRegion.vTreeRect.Height 2 ,Border3DStyle.Etched);
g.DrawLine(Pens.Gray,iLeft - 1,iTop,iLeft - 1,iTop iHeight);
g.DrawLine(new Pen(Color.White,0.5F),
iLeft,iTop,
iLeft,iTop iHeight);

}

}

private void event_TRSoil_RequestPaint(object obj) {
this.DrawAll();
}


protected override void DefWndProc(ref Message m) {
const int WM_LBUTTONUP = 0x0202;
const int WM_LBUTTONDOWN  = 0x0201;

const int WM_PAINT  = 0x000F;

if(m.Msg == MyMessage.WM_TG_FlushData){
bool b = this.FlushData();

m.Result = new IntPtr(0);

if(!b) m.Result = new IntPtr(-1);

return;
}


base.DefWndProc(ref m);
}

public override bool PreProcessMessage(ref Message msg) {
const int WM_LBUTTONDOWN  = 0x0201;

const int WM_KEYDOWN   = 0X0100;
const int WM_KEYUP     = 0X0101;

if (msg.Msg == WM_KEYDOWN) {
if (msg.WParam.ToInt32() == 9) {
//不进行默认的处理;不能让控件失去焦点,模拟一个向右的键ARROW键
msg.WParam = new IntPtr(0);//new IntPtr(13);
if(this.TREDIT.GetAdapter() != null) {
this.TREDIT.GetAdapter().DoNextCol();
}
return true;
}
else {
base.PreProcessMessage(ref msg);
}

}
else {
base.PreProcessMessage(ref msg);
}

return false;
}


/// <summary>
/// 把编辑时未定的内容刷到控件的数据中
/// </summary>
/// <returns></returns>
public bool FlushData(){
//刷新当前的EDIT窗中的内容到数据结构中;
TRNode rowNode = this.curPos.hTreeNode();
TRNode colNode = this.curPos.vTreeNode();

if(rowNode == null || colNode == null) return true;

bool b = true;
this.curPos.FlushData(ref b);

return b;
}


/// <summary>
/// 显否TR被锁定
/// </summary>
/// <returns></returns>
public bool Locked() {
return (vTree.wndLockList.count > 0);

vTree.Clear();
}

private void SetRegion_R1_R2() {
int iWidthTotal = 0;
for( int i = 0; i < vTree.wndLockList.count; i ) {
TRNode node = vTree.wndLockList[i];

iWidthTotal = node.bounds.Width;
}

int iLeft = workRegion.R.Left;
int iTop  = workRegion.R.Top ;
int iWidth  = iWidthTotal;
int iHeight = workRegion.R.Height;

workRegion.R2 = new Rectangle(iLeft,iTop,iWidth,iHeight);

iLeft = workRegion.R.Left iWidthTotal;
iTop  = workRegion.R.Top;
iWidth = workRegion.R.Width - iWidthTotal;
iHeight = workRegion.R.Height;

workRegion.R1 = new Rectangle(iLeft,iTop,iWidth,iHeight);
}

/// <summary>
/// 从某节点开始锁定到结束节点
/// </summary>
/// <param name="fromNode">开始的NODE</param>
/// <param name="endNode">结束的NODE</param>
public void Lock(TRNode fromNode,TRNode endNode) {
vTree.LockNodeRange(fromNode,endNode);

SetRegion_R1_R2();


TRNode node = vTree.wndLockList[vTree.wndLockList.count - 1].nextVisibleNode;

this.Set_hScrollBar_Range();

this.SetRect();
this.DrawAll();
}

/// <summary>
/// 解除锁定
/// </summary>
public void UnLock() {
if (!Locked()) return;

TRNode node = vTree.wndLockList[0];

vTree.wndLockList.Clear();
vTree.TopNode_Lock = null;

vTree.TopNode = node;

//SetRect();
vTree.SetRect();

vTree.ScanDrawNodeToWnd(vTree.wndList,vTree.TopNode,workRegion.vTreeRect);

hScrollBar.Maximum = hTree.GetVisibleNodeCount(null);

hScrollBar.Value = 0;


this.Set_hScrollBar_Range();

this.DrawAll();
}

/// <summary>
/// 返回鼠标在客户区的位置
/// </summary>
/// <returns></returns>
public Point MousePos() {
return this.PointToClient(Control.MousePosition);
}

private void SetCursor() {
//只有等于-1时,才需要设置光标;
if (mouseInfo.eventID != TRMouseEvent.None) return;

//add 20071217
bool bFromRight = this.mousePosition_Director.FromRight;
//end



Point pt = this.MousePos();

//col fixed0
if (workRegion.R.Contains(pt)) {
this.Cursor = Cursors.Arrow;
}

//col fixed
if (workRegion.vTreeRect.Contains(pt)) {
this.Cursor = Cursors.Arrow;

if (vTree.ClientRect_Lock.Contains(pt)) {
Rectangle tempRect = vTree.ClientRect_Lock;

int iWidth = tempRect.Left;
int iIndex = 0;
int iRectRight = tempRect.Right;
bool bFind = false;

for(int i = 0; i < vTree.wndLockList.count ; i ) {
TRNode node = vTree.wndLockList[i];

int iColWidth = node.distance;
iWidth = iColWidth;
Rectangle r = new Rectangle(iWidth - 5,tempRect.Top,11,tempRect.Height);

if (r.Contains(pt))     { bFind = true  ; break;   }
}

if (bFind) this.Cursor = Cursors.VSplit;
}

if (vTree.ClientRect_Dynamic.Contains(pt)) {
Rectangle tempRect = vTree.ClientRect_Dynamic;

int iWidth = tempRect.Left;
int iIndex = 0;
int iRectRight = tempRect.Right;
bool bFind = false;

TRNode curNode = null;

////add 20071217
TRNode findNode = null;
Stack stk = new Stack();
//end

for(int i = 0; i < vTree.wndList.count ; i ) {
TRNode node = vTree.wndList[i];

int iColWidth = node.distance;
iWidth = iColWidth;
Rectangle r = new Rectangle(iWidth - 5,tempRect.Top,11,tempRect.Height);


// if (iWidth > iRectRight) { iIndex = i - 1;  break;      }
//if (r.Contains(pt))     { bFind = true  ;curNode = node; break;}
//----add 20071217
if (r.Contains(pt)) {   
bFind = true  ;
if(bFromRight) {
stk.Push(node);
findNode = node;
this.Debug("-----find node loop in: "   findNode.ToString());
}
else {
findNode = node; 
break;  
}
}
//end

}

//if (bFind) this.Cursor = Cursors.VSplit;
if (bFind) {
if(bFromRight) {
this.Debug("-----from right -------" );
if(stk.Count > 0) {
TRNode  nodeStack = (TRNode)stk.Pop();
findNode = nodeStack;
}
}

if(findNode.distance_lock){
this.Debug("-----distance_lock " );
this.Cursor = Cursors.NoMoveHoriz;
}
else{
this.Debug("-----*** distance_no_lock " );
this.Cursor = Cursors.VSplit;
}
}

}



}

//---------------topLeft Resize-------------------------------------
if (this.workRegion.RTopLeft.Contains(pt)) {
Rectangle tempRect = new Rectangle(workRegion.RTopLeft.Right - 3,
workRegion.RTopLeft.Top,
7,
workRegion.RTopLeft.Height);
this.Cursor = Cursors.Arrow;

bool bFind = tempRect.Contains(pt);

if(bFind){
if(this.hTreeWidth_lock){
this.Cursor = Cursors.NoMoveHoriz;
}
else{
this.Cursor = Cursors.VSplit;
}
}
}

//col Dynamic
if (workRegion.hTreeRect.Contains(pt)) {
this.Cursor = Cursors.Arrow;
}


}

标签: 自定义控件

实例下载地址

treegrid自定义控件

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警