C# 实现简单的甘特图控件 .

 

C# 实现简单的甘特图控件

分类: 控件 .NET 1175人阅读 评论(3) 收藏 举报

效果图

 

 

 

日期红色的可以设置假期  也可以设置星期六星期日是否为假期

 

例子

 

 ProjectViewBox.ProjectNode _Node1 = new ProjectViewBox.ProjectNode(DateTime.Parse("2009-08-01"), 2, "新任务1");
            ProjectViewBox.ProjectNode _Node2 = new ProjectViewBox.ProjectNode(DateTime.Parse("2009-08-02"), 3, "新任务2");
            _Node1.Complete = 10;
            _Node2.Complete = 80;

            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2009-08-03"));
            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2009-08-04"));
            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2009-08-05"));
            projectViewBox1.ProjectSelectData.HolidayList.Add(DateTime.Parse("2009-08-10"));

            projectViewBox1.ProjectSelectData.Add(_Node1);
            projectViewBox1.ProjectSelectData.Add(_Node2);

 

 

下面是全部代码..根据自己的需要去改把... 代码不说其实很简单的 不到730行...

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Drawing;  
  5. using System.Windows.Forms;  
  6. using System.Drawing.Drawing2D;  
  7. using System.ComponentModel;  
  8.   
  9. namespace Zgke.WindowFrom.Window.Controls.UserControls  
  10. {  
  11.   
  12.     /// <summary>   
  13.     /// 甘特图控件   
  14.     /// zgke@sina.com   
  15.     /// qq:116149   
  16.     /// </summary>   
  17.     public class ProjectViewBox : UserControl  
  18.     {  
  19.         #region 容器  
  20.         #region 设计器代码   
  21.         /// <summary>    
  22.         /// 必需的设计器变量。   
  23.         /// </summary>   
  24.         private System.ComponentModel.IContainer components = null;  
  25.   
  26.         /// <summary>    
  27.         /// 清理所有正在使用的资源。   
  28.         /// </summary>   
  29.         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>   
  30.         protected override void Dispose(bool disposing)  
  31.         {  
  32.             if (disposing && (components != null))  
  33.             {  
  34.                 components.Dispose();  
  35.             }  
  36.             base.Dispose(disposing);  
  37.         }  
  38.  
  39.         #region 组件设计器生成的代码   
  40.   
  41.         /// <summary>    
  42.         /// 设计器支持所需的方法 - 不要   
  43.         /// 使用代码编辑器修改此方法的内容。   
  44.         /// </summary>   
  45.         private void InitializeComponent()  
  46.         {  
  47.             this.hScrollBar1 = new System.Windows.Forms.HScrollBar();  
  48.             this.vScrollBar1 = new System.Windows.Forms.VScrollBar();  
  49.             this.MainPictureBox = new System.Windows.Forms.PictureBox();  
  50.             ((System.ComponentModel.ISupportInitialize)(this.MainPictureBox)).BeginInit();  
  51.             this.SuspendLayout();  
  52.             //    
  53.             // hScrollBar1   
  54.             //    
  55.             this.hScrollBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)  
  56.                         | System.Windows.Forms.AnchorStyles.Right)));  
  57.             this.hScrollBar1.LargeChange = 1;  
  58.             this.hScrollBar1.Location = new System.Drawing.Point(1, 111);  
  59.             this.hScrollBar1.Maximum = 60;  
  60.             this.hScrollBar1.Name = "hScrollBar1";  
  61.             this.hScrollBar1.Size = new System.Drawing.Size(120, 16);  
  62.             this.hScrollBar1.TabIndex = 0;  
  63.             //    
  64.             // vScrollBar1   
  65.             //    
  66.             this.vScrollBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)  
  67.                         | System.Windows.Forms.AnchorStyles.Right)));  
  68.             this.vScrollBar1.LargeChange = 1;  
  69.             this.vScrollBar1.Location = new System.Drawing.Point(121, 0);  
  70.             this.vScrollBar1.Maximum = 60;  
  71.             this.vScrollBar1.Name = "vScrollBar1";  
  72.             this.vScrollBar1.Size = new System.Drawing.Size(16, 111);  
  73.             this.vScrollBar1.TabIndex = 1;  
  74.             //    
  75.             // MainPictureBox   
  76.             //    
  77.             this.MainPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)  
  78.                         | System.Windows.Forms.AnchorStyles.Left)  
  79.                         | System.Windows.Forms.AnchorStyles.Right)));  
  80.             this.MainPictureBox.Location = new System.Drawing.Point(0, 0);  
  81.             this.MainPictureBox.Name = "MainPictureBox";  
  82.             this.MainPictureBox.Size = new System.Drawing.Size(120, 109);  
  83.             this.MainPictureBox.TabIndex = 2;  
  84.             this.MainPictureBox.TabStop = false;  
  85.             //    
  86.             // ProjectBox   
  87.             //    
  88.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);  
  89.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;  
  90.             this.BackColor = System.Drawing.SystemColors.Control;  
  91.             this.Controls.Add(this.vScrollBar1);  
  92.             this.Controls.Add(this.hScrollBar1);  
  93.             this.Controls.Add(this.MainPictureBox);  
  94.             this.Name = "ProjectBox";  
  95.             this.Size = new System.Drawing.Size(139, 129);  
  96.             this.Load += new System.EventHandler(this.ProjectBox_Load);  
  97.             this.SizeChanged += new System.EventHandler(this.ProjectBox_SizeChanged);  
  98.             ((System.ComponentModel.ISupportInitialize)(this.MainPictureBox)).EndInit();  
  99.             this.ResumeLayout(false);  
  100.   
  101.         }  
  102.  
  103.         #endregion   
  104.   
  105.         private System.Windows.Forms.HScrollBar hScrollBar1;  
  106.         private System.Windows.Forms.VScrollBar vScrollBar1;  
  107.         private System.Windows.Forms.PictureBox MainPictureBox;  
  108.         #endregion   
  109.   
  110.         public ProjectViewBox()  
  111.         {  
  112.             InitializeComponent();  
  113.         }  
  114.  
  115.         #region 私有成员   
  116.         /// <summary>   
  117.         /// 最小单元格   
  118.         /// </summary>   
  119.         private int m_Size = 18;  
  120.         /// <summary>   
  121.         /// 日期索引 记录当前绘制的位置   
  122.         /// </summary>   
  123.         private int m_DayIndex = 0;  
  124.         /// <summary>   
  125.         /// 开始绘制位置   
  126.         /// </summary>   
  127.         private int m_JobIndex = 0;  
  128.         #endregion   
  129.   
  130.         /// <summary>   
  131.         /// 大小改变   
  132.         /// </summary>   
  133.         /// <param name="sender"></param>   
  134.         /// <param name="e"></param>   
  135.         private void ProjectBox_SizeChanged(object sender, EventArgs e)  
  136.         {  
  137.             if (MainPictureBox.Image != null) PaintProjectImage();  
  138.         }  
  139.   
  140.         private MyScroll Hscroll;  
  141.         private MyScroll Vscroll;  
  142.   
  143.         private void ProjectBox_Load(object sender, EventArgs e)  
  144.         {  
  145.             MainPictureBox.Image = new Bitmap(1, 1);  
  146.             PaintProjectImage();  
  147.             Hscroll = new MyScroll();  
  148.             Hscroll.Click += new MyScroll.ScrollClick(Hscroll_Click);  
  149.             Hscroll.AssignHandle(hScrollBar1.Handle);  
  150.   
  151.             Vscroll = new MyScroll();  
  152.             Vscroll.Click += new MyScroll.ScrollClick(Vscroll_Click);  
  153.             Vscroll.AssignHandle(vScrollBar1.Handle);  
  154.   
  155.             m_ProjectSelect.ProjectBox = this;  
  156.         }  
  157.  
  158.         #region 滚动条   
  159.         void Vscroll_Click(int p_Value)  
  160.         {  
  161.             switch (p_Value)  
  162.             {  
  163.                 case 0:  
  164.                     m_JobIndex = vScrollBar1.Value;  
  165.                     break;  
  166.                 case 1:  
  167.                     m_JobIndex--;  
  168.                     if (m_JobIndex < 0) m_JobIndex = 0;  
  169.                     break;  
  170.                 case 2:  
  171.                     m_JobIndex++;  
  172.                     break;  
  173.   
  174.             }  
  175.             if (m_JobIndex <= 0) vScrollBar1.Value = 0;  
  176.             if (m_JobIndex >= 60) vScrollBar1.Value = 60;  
  177.             PaintProjectImage();  
  178.         }  
  179.   
  180.         void Hscroll_Click(int p_Value)  
  181.         {  
  182.             switch (p_Value)  
  183.             {  
  184.                 case 0:  
  185.                     m_DayIndex = hScrollBar1.Value;  
  186.                     break;  
  187.                 case 1:  
  188.                     m_DayIndex--;  
  189.                     break;  
  190.                 case 2:  
  191.                     m_DayIndex++;  
  192.                     break;  
  193.   
  194.             }  
  195.             if (m_DayIndex <= 0) hScrollBar1.Value = 0;  
  196.             if (m_DayIndex >= 60) hScrollBar1.Value = 60;  
  197.             PaintProjectImage();  
  198.         }  
  199.         #endregion   
  200.   
  201.         /// <summary>   
  202.         /// 刷新   
  203.         /// </summary>   
  204.         public override void Refresh()  
  205.         {  
  206.             PaintProjectImage();  
  207.         }  
  208.   
  209.         /// <summary>   
  210.         /// 开始绘制   
  211.         /// </summary>   
  212.         private void PaintProjectImage()  
  213.         {  
  214.             MainPictureBox.Image.Dispose();  
  215.             if (MainPictureBox.Width == 0 || MainPictureBox.Height == 0) return;  
  216.             Bitmap _NewBitmap = new Bitmap(MainPictureBox.Width, MainPictureBox.Height);  
  217.             Graphics _Graphics = Graphics.FromImage(_NewBitmap);  
  218.             Point _DrawPoint = new Point(0, 0);  
  219.             DateTime _DrawDate = DateTime.Now.AddDays(m_DayIndex);  
  220.             while (true)  
  221.             {  
  222.                 _DrawPoint = GraphicsWeekHead(_Graphics, ref _DrawDate, _DrawPoint);  
  223.   
  224.                 if (_DrawPoint.X > MainPictureBox.Width) break;  
  225.             }  
  226.   
  227.             DateTime _NodeStarDate = DateTime.Now.AddDays(m_DayIndex);  
  228.             int _Hight = m_Size * 2;  
  229.             for (int i = m_JobIndex; i < m_ProjectSelect.Count; i++)  
  230.             {  
  231.                 m_ProjectSelect[i].GraphisDraw(_Graphics, _NodeStarDate, m_Size, ref _Hight, MainPictureBox.Width, MainPictureBox.Height);  
  232.             }  
  233.   
  234.             MainPictureBox.Image = _NewBitmap;  
  235.         }  
  236.   
  237.         /// <summary>   
  238.         /// 绘制日期头和星期几   
  239.         /// </summary>   
  240.         /// <param name="p_Graphics">刷子</param>   
  241.         /// <param name="p_StarDate">开始日期 ref类型 返回日期的下周一</param>   
  242.         /// <param name="p_StarPoint">开始位置</param>   
  243.         /// <returns>结束节点</returns>   
  244.         private Point GraphicsWeekHead(Graphics p_Graphics, ref DateTime p_StarDate, Point p_StarPoint)  
  245.         {  
  246.             int _Date = (int)p_StarDate.DayOfWeek;  
  247.             if (_Date != 0) p_StarDate = p_StarDate.AddDays(-_Date);  
  248.             int _DrawDateX = p_StarPoint.X - (_Date * m_Size);  
  249.             Pen _LinePen = new Pen(Brushes.Black, 1);  
  250.             Rectangle _RectangleHead = new Rectangle(_DrawDateX, 0, m_Size * 7, m_Size);  
  251.             StringFormat _StringFormat = new StringFormat();  
  252.             _StringFormat.LineAlignment = StringAlignment.Far;  
  253.   
  254.             p_Graphics.DrawRectangle(_LinePen, _RectangleHead);  
  255.             p_Graphics.DrawString(p_StarDate.ToString("yyyy年MM月dd日"), this.Font, Brushes.Black, _RectangleHead, _StringFormat);  
  256.   
  257.             _RectangleHead = new Rectangle(p_StarPoint.X, m_Size, p_StarPoint.X + m_Size, m_Size);  
  258.             Rectangle _BlackRect = new Rectangle(0, m_Size * 2, m_Size, this.Height - (m_Size * 2));  
  259.   
  260.             Color _BlackColor = m_ProjectSelect.BackColor;  
  261.   
  262.             for (int i = _Date; i != 7; i++)  
  263.             {  
  264.                 string _WeekText = string.Empty;  
  265.                 switch (i)  
  266.                 {  
  267.                     case 0:  
  268.                         _WeekText = "日";  
  269.                         _BlackColor = m_ProjectSelect.WeekBackColor;  
  270.                         break;  
  271.                     case 1:  
  272.                         _WeekText = "一";  
  273.                         _BlackColor = m_ProjectSelect.BackColor;  
  274.                         break;  
  275.                     case 2:  
  276.                         _WeekText = "二";  
  277.                         _BlackColor = m_ProjectSelect.BackColor;  
  278.                         break;  
  279.                     case 3:  
  280.                         _WeekText = "三";  
  281.                         _BlackColor = m_ProjectSelect.BackColor;  
  282.                         break;  
  283.                     case 4:  
  284.                         _WeekText = "四";  
  285.                         _BlackColor = m_ProjectSelect.BackColor;  
  286.                         break;  
  287.                     case 5:  
  288.                         _WeekText = "五";  
  289.                         _BlackColor = m_ProjectSelect.BackColor;  
  290.                         break;  
  291.                     case 6:  
  292.                         _WeekText = "六";  
  293.                         _BlackColor = m_ProjectSelect.WeekBackColor;  
  294.                         break;  
  295.                 }  
  296.                 HatchBrush _BlackBrush = new HatchBrush(HatchStyle.Percent50, _BlackColor, Color.White);  
  297.                 _BlackRect.X = _RectangleHead.X;  
  298.                 p_Graphics.FillRectangle(_BlackBrush, _BlackRect);  
  299.   
  300.                 p_Graphics.DrawRectangle(_LinePen, _RectangleHead);  
  301.                 p_Graphics.DrawString(_WeekText, new Font("宋体", 9.0f), GetWorkColumneColor(p_StarDate, i), _RectangleHead, _StringFormat);  
  302.                 _RectangleHead.X += m_Size;  
  303.             }  
  304.             p_StarDate = p_StarDate.AddDays(7);  
  305.             return new Point(_RectangleHead.X, m_Size * 2);  
  306.         }  
  307.   
  308.         /// <summary>   
  309.         /// 获取日期的标题色   
  310.         /// </summary>   
  311.         /// <param name="p_Date">日期</param>   
  312.         /// <param name="p_Day">1-7</param>   
  313.         /// <returns></returns>   
  314.         public SolidBrush GetWorkColumneColor(DateTime p_Date, int p_Day)  
  315.         {  
  316.             DateTime _ValueDate = p_Date.AddDays(p_Day);  
  317.   
  318.             if (_ValueDate.DayOfWeek == DayOfWeek.Saturday && !m_ProjectSelect.SaturdayOfWork)  
  319.             {  
  320.                 return new SolidBrush(m_ProjectSelect.ColumnHolidayColor);  
  321.             }  
  322.             if (_ValueDate.DayOfWeek == DayOfWeek.Sunday && !m_ProjectSelect.SundayOfWork)  
  323.             {  
  324.                 return new SolidBrush(m_ProjectSelect.ColumnHolidayColor);  
  325.             }  
  326.   
  327.             for (int z = 0; z != m_ProjectSelect.HolidayList.Count; z++)  
  328.             {  
  329.                 bool _Year = m_ProjectSelect.HolidayList[z].Year == _ValueDate.Year;  
  330.                 bool _Month = m_ProjectSelect.HolidayList[z].Month == _ValueDate.Month;  
  331.                 bool _Day = m_ProjectSelect.HolidayList[z].Day == _ValueDate.Day;  
  332.   
  333.                 if (_Year && _Month && _Day)  
  334.                 {  
  335.                     return new SolidBrush(m_ProjectSelect.ColumnHolidayColor);  
  336.                 }  
  337.             }  
  338.   
  339.             return new SolidBrush(m_ProjectSelect.ColumnWorkDayColor);  
  340.         }  
  341.  
  342.         #region 公用属性   
  343.         private ProjectSelect m_ProjectSelect = new ProjectSelect();  
  344.         /// <summary>   
  345.         /// 基本设置   
  346.         /// </summary>        
  347.         [Browsable(false)]  
  348.         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]  
  349.         public ProjectSelect ProjectSelectData  
  350.         {  
  351.             get { return m_ProjectSelect; }  
  352.             set { m_ProjectSelect = value; m_ProjectSelect.ProjectBox = this; }  
  353.         }  
  354.         #endregion   
  355.   
  356.         /// <summary>   
  357.         /// 实在写不好Scroll 判断消息了   
  358.         /// </summary>   
  359.         private class MyScroll : NativeWindow  
  360.         {  
  361.             public delegate void ScrollClick(int p_Value);  
  362.             public event ScrollClick Click;  
  363.   
  364.             protected override void WndProc(ref Message m)  
  365.             {  
  366.                 base.WndProc(ref m);  
  367.                 int _ClickType = -1;  
  368.                 switch (m.Msg)  
  369.                 {  
  370.                     case 0xEa:  
  371.                         _ClickType = 0;  
  372.                         break;  
  373.                     case 0x2114:  
  374.                         switch (m.WParam.ToInt32())  
  375.                         {  
  376.                             case 0:  
  377.                                 _ClickType = 1;  
  378.                                 break;  
  379.                             case 1:  
  380.                                 _ClickType = 2;  
  381.                                 break;  
  382.                             case 3:  
  383.                                 _ClickType = 0;  
  384.                                 break;  
  385.                             case 2:  
  386.                                 _ClickType = 0;  
  387.                                 break;  
  388.                         }  
  389.                         break;  
  390.                     case 0x2115:  
  391.                         switch (m.WParam.ToInt32())  
  392.                         {  
  393.                             case 0:  
  394.                                 _ClickType = 1;  
  395.                                 break;  
  396.                             case 1:  
  397.                                 _ClickType = 2;  
  398.                                 break;  
  399.                             case 3:  
  400.                                 _ClickType = 0;  
  401.                                 break;  
  402.                             case 2:  
  403.                                 _ClickType = 0;  
  404.                                 break;  
  405.                         }  
  406.                         break;  
  407.                     default:  
  408.                         break;  
  409.                 }  
  410.                 if (Click != null && _ClickType != -1) Click(_ClickType);  
  411.   
  412.             }  
  413.         }  
  414.         #endregion   
  415.   
  416.         /// <summary>   
  417.         /// 数据类   
  418.         /// </summary>   
  419.         [Serializable]  
  420.         public class ProjectSelect  
  421.         {  
  422.             private IList<DateTime> m_HolidayList = new List<DateTime>();  
  423.             private bool m_SundayOfWork = false;  
  424.             private bool m_SaturdayOfWork = false;  
  425.             private ProjectViewBox m_ProjectBox;  
  426.             private Color m_BackColor = Color.White;  
  427.             private Color m_WeekBackColor = Color.FromArgb(255, 212, 208, 200);  
  428.             private IList<ProjectNode> m_Nodes = new List<ProjectNode>();  
  429.             private Color m_ColumnWorkDayColor = Color.Black;  
  430.             private Color m_ColumnHolidayColor = Color.Red;  
  431.   
  432.   
  433.             public ProjectNode this[int p_Index]  
  434.             {  
  435.                 get  
  436.                 {  
  437.                     return m_Nodes[p_Index];  
  438.                 }  
  439.             }  
  440.   
  441.             /// <summary>   
  442.             /// 工作日背景颜色   
  443.             /// </summary>   
  444.             public Color BackColor { get { return m_BackColor; } set { m_BackColor = value; } }  
  445.             /// <summary>   
  446.             /// 假期颜色   
  447.             /// </summary>   
  448.             public Color WeekBackColor { get { return m_WeekBackColor; } set { m_WeekBackColor = value; } }  
  449.             /// <summary>   
  450.             /// 星期六是否工作 false为放假   
  451.             /// </summary>   
  452.             public bool SaturdayOfWork { get { return m_SaturdayOfWork; } set { m_SaturdayOfWork = value; } }  
  453.             /// <summary>   
  454.             /// 星期日是否工作 false为放假   
  455.             /// </summary>   
  456.             public bool SundayOfWork { get { return m_SundayOfWork; } set { m_SundayOfWork = value; } }  
  457.             /// <summary>   
  458.             /// 假期设置   
  459.             /// </summary>   
  460.             public IList<DateTime> HolidayList { get { return m_HolidayList; } set { m_HolidayList = value; } }  
  461.             /// <summary>   
  462.             /// 该设置的显示控件   
  463.             /// </summary>   
  464.             public ProjectViewBox ProjectBox { get { return m_ProjectBox; } set { m_ProjectBox = value; } }  
  465.             /// <summary>   
  466.             /// 数量   
  467.             /// </summary>   
  468.             public int Count { get { return m_Nodes.Count; } }  
  469.             /// <summary>   
  470.             /// 假期颜色(标题)   
  471.             /// </summary>   
  472.             public Color ColumnHolidayColor { get { return m_ColumnHolidayColor; } set { m_ColumnHolidayColor = value; } }  
  473.             /// <summary>   
  474.             /// 工作日颜色(标题)   
  475.             /// </summary>   
  476.             public Color ColumnWorkDayColor { get { return m_ColumnWorkDayColor; } set { m_ColumnWorkDayColor = value; } }  
  477.   
  478.   
  479.             /// <summary>   
  480.             /// 添加   
  481.             /// </summary>   
  482.             /// <param name="p_NodeList">内容</param>   
  483.             public void Add(ProjectNode p_NodeList)  
  484.             {  
  485.                 p_NodeList.ProjectSelect = this;  
  486.                 m_Nodes.Add(p_NodeList);  
  487.                 Refresh();  
  488.             }  
  489.             /// <summary>   
  490.             /// 清除   
  491.             /// </summary>   
  492.             public void Clear()  
  493.             {  
  494.                 m_Nodes.Clear();  
  495.                 Refresh();  
  496.             }  
  497.             /// <summary>   
  498.             /// 插入   
  499.             /// </summary>   
  500.             /// <param name="p_Index"></param>   
  501.             /// <param name="p_NodeList"></param>   
  502.             public void Insert(int p_Index, ProjectNode p_NodeList)  
  503.             {  
  504.                 m_Nodes.Insert(p_Index, p_NodeList);  
  505.                 Refresh();  
  506.             }  
  507.             /// <summary>   
  508.             /// 删除   
  509.             /// </summary>   
  510.             /// <param name="p_Index"></param>   
  511.             public void RemoveAt(int p_Index)  
  512.             {  
  513.                 m_Nodes.RemoveAt(p_Index);  
  514.                 Refresh();  
  515.             }  
  516.             /// <summary>   
  517.             /// 删除   
  518.             /// </summary>   
  519.             /// <param name="p_NodeList"></param>   
  520.             public void Remove(ProjectNode p_NodeList)  
  521.             {  
  522.                 m_Nodes.Remove(p_NodeList);  
  523.                 Refresh();  
  524.             }  
  525.             /// <summary>   
  526.             /// 刷新   
  527.             /// </summary>   
  528.             public void Refresh()  
  529.             {  
  530.                 m_ProjectBox.Refresh();  
  531.             }  
  532.   
  533.   
  534.         }  
  535.   
  536.         /// <summary>   
  537.         /// 节点类   
  538.         /// </summary>   
  539.         [Serializable]  
  540.         public class ProjectNode  
  541.         {  
  542.             private string m_JobName = string.Empty;  
  543.             private sbyte m_Complete = -1;  
  544.             private DateTime m_StartDate = DateTime.Now;  
  545.             private uint m_WorkDay = 0;  
  546.             private HatchStyle m_Style = HatchStyle.Percent50;  
  547.             private Color m_Color = Color.Blue;  
  548.             private ProjectSelect m_ProjectSelect;  
  549.   
  550.             public ProjectNode(DateTime p_StarTime, uint p_WorkDay)  
  551.             {  
  552.                 m_StartDate = p_StarTime;  
  553.                 m_WorkDay = p_WorkDay;  
  554.             }  
  555.   
  556.             public ProjectNode(DateTime p_StarTime, uint p_WorkDay, string p_JobName)  
  557.             {  
  558.                 m_StartDate = p_StarTime;  
  559.                 m_WorkDay = p_WorkDay;  
  560.                 m_JobName = p_JobName;  
  561.             }  
  562.   
  563.             /// <summary>   
  564.             /// 节点设置   
  565.             /// </summary>   
  566.             public ProjectSelect ProjectSelect  
  567.             {  
  568.                 get { return m_ProjectSelect; }  
  569.                 set { m_ProjectSelect = value; }  
  570.             }  
  571.             /// <summary>   
  572.             /// 显示样式   
  573.             /// </summary>   
  574.             public HatchStyle Style { get { return m_Style; } set { m_Style = value; Refresh(); } }  
  575.             /// <summary>   
  576.             /// 显示颜色   
  577.             /// </summary>   
  578.             public Color Color { get { return m_Color; } set { m_Color = value; Refresh(); } }  
  579.             /// <summary>   
  580.             /// 任务名称   
  581.             /// </summary>   
  582.             public string JobName { get { return m_JobName; } set { m_JobName = value; Refresh(); } }  
  583.             /// <summary>   
  584.             /// 任务开始日期   
  585.             /// </summary>   
  586.             public DateTime StartDate { get { return m_StartDate; } set { m_StartDate = value; Refresh(); } }  
  587.             /// <summary>   
  588.             /// 工作天数   
  589.             /// </summary>   
  590.             public uint WorkDay { get { return m_WorkDay; } set { m_WorkDay = value; Refresh(); } }  
  591.             /// <summary>   
  592.             /// 资源名称   
  593.             /// </summary>   
  594.             public sbyte Complete { get { return m_Complete; } set { m_Complete = value; } }  
  595.   
  596.             /// <summary>   
  597.             /// 根据开始时间获取显示的区域   
  598.             /// </summary>   
  599.             /// <param name="p_StarDate"></param>   
  600.             /// <param name="p_DrawSize"></param>   
  601.             /// <param name="p_Height"></param>   
  602.             /// <returns></returns>   
  603.             public Rectangle GetRectangle(DateTime p_StarDate, int p_DrawSize, int p_Height)  
  604.             {  
  605.                 DateTime _TimeStar = StartDate;  
  606.                 GetWorkDay(ref _TimeStar);  
  607.                 TimeSpan _Span = _TimeStar - p_StarDate;  
  608.                 int _Day = 0;  
  609.                 if (_Span.Days >= 0)  
  610.                 {  
  611.                     _Day = (int)(_Span.TotalDays + 0.999999999999999);  
  612.                 }  
  613.                 else  
  614.                 {  
  615.                     _Day = (int)_Span.TotalDays;  
  616.                 }  
  617.   
  618.                 int _Width = _Day * p_DrawSize;  
  619.                 int _WorkDay = (int)WorkDay;  
  620.   
  621.                 GetWorkDayCount(_TimeStar, ref _WorkDay);  
  622.                 return new Rectangle(_Width, p_Height, _WorkDay * p_DrawSize, p_DrawSize);  
  623.             }  
  624.   
  625.             public void GraphisDraw(Graphics p_Graphics, DateTime p_StarDate, int p_DrawSize, ref int p_Height, int p_MaxWidth, int p_MaxHeight)  
  626.             {  
  627.                 if (p_Height > p_MaxHeight) return;  
  628.                 Rectangle _Rectangle = GetRectangle(p_StarDate, p_DrawSize, p_Height);  
  629.                 if (_Rectangle.X > p_MaxWidth) return;  
  630.                 _Rectangle.Y += 5;  
  631.                 _Rectangle.Height -= 5;  
  632.                 HatchBrush _BlackBrush = new HatchBrush(m_Style, m_Color, Color.White);  
  633.                 p_Graphics.FillRectangle(_BlackBrush, _Rectangle);  
  634.                 p_Graphics.DrawRectangle(new Pen(Brushes.Black, 1), _Rectangle);  
  635.                 if (m_Complete >= 0)  
  636.                 {  
  637.                     StringFormat _StringFormt = new StringFormat();  
  638.                     _StringFormt.Alignment = StringAlignment.Center;  
  639.                     _StringFormt.LineAlignment = StringAlignment.Center;  
  640.                     p_Graphics.DrawString(m_Complete.ToString() + "%"new Font("宋体", 12, FontStyle.Bold), Brushes.Black, _Rectangle, _StringFormt);  
  641.                 }  
  642.                 p_Graphics.DrawString(m_JobName, new Font("宋体", 9), Brushes.Black, _Rectangle.X + _Rectangle.Width, _Rectangle.Y + 1);  
  643.                 p_Height += p_DrawSize;  
  644.             }  
  645.   
  646.             /// <summary>   
  647.             /// 刷新   
  648.             /// </summary>   
  649.             private void Refresh()  
  650.             {  
  651.                 if (m_ProjectSelect != null) m_ProjectSelect.Refresh();  
  652.             }  
  653.   
  654.             /// <summary>   
  655.             /// 获取工作结束日期   
  656.             /// </summary>   
  657.             private void GetWorkDayCount(DateTime p_StarTime, ref int p_WorkDay)  
  658.             {  
  659.                 DateTime _StarTime = p_StarTime;  
  660.                 for (int i = 0; i != p_WorkDay; i++)  
  661.                 {  
  662.                     _StarTime = p_StarTime.AddDays(i);  
  663.                     if (_StarTime.DayOfWeek == DayOfWeek.Saturday && !m_ProjectSelect.SaturdayOfWork)  
  664.                     {  
  665.                         p_WorkDay++;  
  666.                         continue;  
  667.                     }  
  668.                     if (_StarTime.DayOfWeek == DayOfWeek.Sunday && !m_ProjectSelect.SundayOfWork)  
  669.                     {  
  670.                         p_WorkDay++;  
  671.                         continue;  
  672.                     }  
  673.   
  674.                     for (int z = 0; z != m_ProjectSelect.HolidayList.Count; z++)  
  675.                     {  
  676.                         bool _Year = m_ProjectSelect.HolidayList[z].Year == _StarTime.Year;  
  677.                         bool _Month = m_ProjectSelect.HolidayList[z].Month == _StarTime.Month;  
  678.                         bool _Day = m_ProjectSelect.HolidayList[z].Day == _StarTime.Day;  
  679.   
  680.                         if (_Year && _Month && _Day)  
  681.                         {  
  682.                             p_WorkDay++;  
  683.                             break;  
  684.                         }  
  685.                     }  
  686.                 }  
  687.             }  
  688.   
  689.             /// <summary>   
  690.             /// 获取开始日期   
  691.             /// </summary>   
  692.             /// <param name="p_Value">数据</param>   
  693.             /// <returns>日期</returns>   
  694.             private void GetWorkDay(ref DateTime p_Value)  
  695.             {  
  696.                 bool _Set = false;  
  697.                 if (p_Value.DayOfWeek == DayOfWeek.Saturday && !m_ProjectSelect.SaturdayOfWork) p_Value = p_Value.AddDays(1);  
  698.                 if (p_Value.DayOfWeek == DayOfWeek.Sunday && !m_ProjectSelect.SundayOfWork) p_Value = p_Value.AddDays(1);  
  699.   
  700.                 for (int i = 0; i != m_ProjectSelect.HolidayList.Count; i++)  
  701.                 {  
  702.                     bool _Year = m_ProjectSelect.HolidayList[i].Year == p_Value.Year;  
  703.                     bool _Month = m_ProjectSelect.HolidayList[i].Month == p_Value.Month;  
  704.                     bool _Day = m_ProjectSelect.HolidayList[i].Day == p_Value.Day;  
  705.   
  706.                     if (_Year && _Month && _Day)  
  707.                     {  
  708.                         p_Value = p_Value.AddDays(1);  
  709.                         _Set = true;  
  710.                         break;  
  711.                     }  
  712.                 }  
  713.                 if (_Set) GetWorkDay(ref p_Value);  
  714.             }  
  715.   
  716.   
  717.         }  
  718.     }  
  719.   
  720. }  

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值