Example #1
0
        public override bool MouseDown(System.Windows.Forms.MouseEventArgs e)
        {
            //return base.MouseDown(e);

            this.Active = HC.PtInRect(new RECT(0, 0, Width, Height), new POINT(e.X, e.Y));

            DateTimeArea vArea = GetAreaAt(e.X, e.Y);

            if (vArea != FActiveArea)
            {
                if (FActiveArea == DateTimeArea.dtaYear)
                {
                    SetInputYear();
                }

                FActiveArea = vArea;
                if (FActiveArea != DateTimeArea.dtaNone)
                {
                    FAreaRect = GetAreaRect(FActiveArea);
                }

                this.OwnerData.Style.UpdateInfoRePaint();
            }

            DoPopup();
            return(true);
        }
Example #2
0
        private RECT GetAreaRect(DateTimeArea aArea)
        {
            RECT Result = new RECT(0, 0, 0, 0);

            if (aArea == DateTimeArea.dtaNone)
            {
                return(Result);
            }

            //int vCharOffset = 0;
            //int vAppendLevel = 0;

            HCCanvas vCanvas = HCStyle.CreateStyleCanvas();

            try
            {
                this.OwnerData.Style.TextStyles[this.TextStyleNo].ApplyStyle(vCanvas);
                if (FFormat != "")
                {
                    AppendFormat(vCanvas, aArea, ref Result);
                }
                //else
                //    AppendFormat(ref Result, "C");  // 用短格式显示日期与时间
            }
            finally
            {
                HCStyle.DestroyStyleCanvas(vCanvas);
            }

            return(Result);
        }
Example #3
0
 public HCDateTimePicker(HCCustomData aOwnerData, DateTime aDateTime)
     : base(aOwnerData, string.Format("{0:yyyy-MM-dd HH:mm:ss}", aDateTime))
 {
     FFormat           = "yyyy-MM-dd HH:mm:ss";
     FDateTime         = aDateTime;
     this.StyleNo      = HCStyle.DateTimePicker;
     Width             = 80;
     this.FPaddingLeft = 2;
     FActiveArea       = DateTimeArea.dtaNone;
 }
 public HCDateTimePicker(HCCustomData aOwnerData, DateTime aDateTime)
     : base(aOwnerData, string.Format("YYYY-MM-DD HH:mm:SS", aDateTime))
 {
     FFormat      = "YYYY-MM-DD HH:mm:SS";
     FDateTime    = aDateTime;
     this.StyleNo = HCStyle.DateTimePicker;
     Width        = 80;
     this.FMargin = 2;
     FActiveArea  = DateTimeArea.dtaNone;
 }
Example #5
0
        public override void KeyDown(System.Windows.Forms.KeyEventArgs e)
        {
            if (!this.Enabled || this.ReadOnly)
            {
                return;
            }

            //base.KeyDown(e);
            switch (e.KeyValue)
            {
            case User.VK_ESCAPE:
                if (FNewYear != "")
                {
                    FNewYear = "";
                    this.OwnerData.Style.UpdateInfoRePaint();
                }
                break;

            case User.VK_RETURN:
                if (FActiveArea == DateTimeArea.dtaYear)
                {
                    SetInputYear();
                    this.OwnerData.Style.UpdateInfoRePaint();
                }
                break;

            case User.VK_LEFT:
                if ((byte)FActiveArea > (byte)DateTimeArea.dtaNone)
                {
                    if (FActiveArea == DateTimeArea.dtaYear)
                    {
                        SetInputYear();
                    }

                    FActiveArea = (DateTimeArea)(((byte)FActiveArea) >> 1);
                    FAreaRect   = GetAreaRect(FActiveArea);
                    this.OwnerData.Style.UpdateInfoRePaint();
                }
                break;

            case User.VK_RIGHT:
                if ((byte)FActiveArea < (byte)DateTimeArea.dtaMillisecond)
                {
                    if (FActiveArea == DateTimeArea.dtaYear)
                    {
                        SetInputYear();
                    }

                    FActiveArea = (DateTimeArea)(((byte)FActiveArea) << 1);
                    FAreaRect   = GetAreaRect(FActiveArea);
                    this.OwnerData.Style.UpdateInfoRePaint();
                }
                break;
            }
        }
Example #6
0
        private void AppendFormat(HCCanvas aCanvas, DateTimeArea aArea, ref RECT aRect)
        {
            aRect.SetEmpty();

            int vIndex = 0, vCount = -1;

            switch (aArea)
            {
            case DateTimeArea.dtaYear:
                GetAreaPosition("y", false, ref vIndex, ref vCount);
                break;

            case DateTimeArea.dtaMonth:
                GetAreaPosition("M", true, ref vIndex, ref vCount);
                break;

            case DateTimeArea.dtaDay:
                GetAreaPosition("d", false, ref vIndex, ref vCount);
                break;

            case DateTimeArea.dtaHour:
                GetAreaPosition("H", true, ref vIndex, ref vCount);      // 12、24小时制
                break;

            case DateTimeArea.dtaMinute:
                GetAreaPosition("m", false, ref vIndex, ref vCount);
                break;

            case DateTimeArea.dtaSecond:
                GetAreaPosition("s", false, ref vIndex, ref vCount);
                break;
            }

            if (vCount > 0)
            {
                string vs = "";
                if (vIndex > 0)
                {
                    vs = FFormat.Substring(0, vIndex);
                }

                aRect.Left = FPaddingLeft;
                if (vs != "")
                {
                    aRect.Left += aCanvas.TextExtent(vs).cx;
                }

                SIZE vSize = aCanvas.TextExtent(FFormat.Substring(vIndex, vCount));

                aRect.Top    = (Height - vSize.cy) / 2;
                aRect.Right  = aRect.Left + vSize.cx;
                aRect.Bottom = aRect.Top + vSize.cy;
            }
        }
Example #7
0
        protected override void SetActive(bool Value)
        {
            base.SetActive(Value);
            if (!this.Active)
            {
                if (FActiveArea == DateTimeArea.dtaYear)
                {
                    SetInputYear();
                }

                FActiveArea = DateTimeArea.dtaNone;
            }
        }
Example #8
0
        public override void KeyPress(ref char key)
        {
            //base.KeyPress(ref key);
            if (!this.Enabled || this.ReadOnly)
            {
                return;
            }

            int      vNumber   = 0;
            DateTime vDateTime = FDateTime;

            if (FActiveArea != DateTimeArea.dtaNone)
            {
                if ("0123456789".IndexOf(key) >= 0)
                {
                    switch (FActiveArea)
                    {
                    case DateTimeArea.dtaYear:
                        if (FNewYear.Length > 3)
                        {
                            FNewYear.Remove(0, 1);
                        }
                        FNewYear = FNewYear + key;
                        break;

                    case DateTimeArea.dtaMonth:
                        vNumber = vDateTime.Month; // 当前月份
                        if (vNumber > 9)           // 当前月份已经是2位数了
                        {
                            if (key == '0')        // 2位月份再输入0不处理
                            {
                                return;
                            }

                            vDateTime = new DateTime(vDateTime.Year, int.Parse(key.ToString()), vDateTime.Day,
                                                     vDateTime.Hour, vDateTime.Minute, vDateTime.Second);
                        }
                        else                             // 当前月份是1位数字
                        if ((vNumber == 1) && FJoinKey)  // 当前月份是1月且是连续输入
                        {
                            if ("012".IndexOf(key) >= 0) // 10, 11, 12
                            {
                                vNumber   = vNumber * 10 + int.Parse(key.ToString());
                                vDateTime = new DateTime(vDateTime.Year, vNumber, vDateTime.Day,
                                                         vDateTime.Hour, vDateTime.Minute, vDateTime.Second); // 直接修改为新键入
                            }
                            else
                            {
                                vDateTime = new DateTime(vDateTime.Year, int.Parse(key.ToString()), vDateTime.Day,
                                                         vDateTime.Hour, vDateTime.Minute, vDateTime.Second);
                            }
                        }
                        else                // 不是连续输入,是第1次输入
                        {
                            if (key == '0') // 月份第1位是0不处理
                            {
                                return;
                            }

                            vDateTime = new DateTime(vDateTime.Year, int.Parse(key.ToString()), vDateTime.Day,
                                                     vDateTime.Hour, vDateTime.Minute, vDateTime.Second); // 直接修改为新键入
                        }
                        break;

                    case DateTimeArea.dtaDay:
                        vNumber = vDateTime.Day; // 当前日期
                        if (vNumber > 9)         // 当前日期已经是2位数了
                        {
                            if (key == '0')      // 2位日期再输入0不处理
                            {
                                return;
                            }

                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, int.Parse(key.ToString()),
                                                     vDateTime.Hour, vDateTime.Minute, vDateTime.Second); // 直接修改为新键入
                        }
                        else                                                                              // 当前日期是1位数字
                        if (FJoinKey)                                                                     // 是连续输入
                        {
                            vNumber = vNumber * 10 + int.Parse(key.ToString());
                            if (vNumber > DateTime.DaysInMonth(vDateTime.Year, vDateTime.Month))
                            {
                                vNumber = int.Parse(key.ToString());
                            }

                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vNumber,
                                                     vDateTime.Hour, vDateTime.Minute, vDateTime.Second); // 直接修改为新键入
                        }
                        break;

                    case DateTimeArea.dtaHour:
                        vNumber = vDateTime.Hour; // 当前时
                        if (vNumber > 9)          // 当前时已经2位数了
                        {
                            if (key == '0')
                            {
                                return;      // 2位时再输入0不处理
                            }
                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vDateTime.Day,
                                                     int.Parse(key.ToString()), vDateTime.Minute, vDateTime.Second);
                        }
                        else          // 当前时是1位数字
                        if (FJoinKey) // 当前时是连续输入
                        {
                            vNumber = vNumber * 10 + int.Parse(key.ToString());
                            if (vNumber > 23)
                            {
                                vNumber = int.Parse(key.ToString());
                            }

                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vDateTime.Day,
                                                     vNumber, vDateTime.Minute, vDateTime.Second);
                        }
                        else      // 不是连续输入,是第1次输入
                        {
                            if (key == '0')
                            {
                                return;
                            }

                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vDateTime.Day,
                                                     int.Parse(key.ToString()), vDateTime.Minute, vDateTime.Second);
                        }
                        break;

                    case DateTimeArea.dtaMinute:
                        vNumber = vDateTime.Minute;
                        if (vNumber > 9)      // 当前分已经是2位数了
                        {
                            if (key == '0')
                            {
                                return;      // 2位时再输入0不处理
                            }
                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vDateTime.Day,
                                                     vDateTime.Hour, int.Parse(key.ToString()), vDateTime.Second);
                        }
                        else          // 当前分是1位数字
                        if (FJoinKey) // 当前分是连续输入
                        {
                            vNumber = vNumber * 10 + int.Parse(key.ToString());
                            if (vNumber > 59)
                            {
                                vNumber = int.Parse(key.ToString());
                            }

                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vDateTime.Day,
                                                     vDateTime.Hour, vNumber, vDateTime.Second);
                        }
                        else      // 不是连续输入,是第1次输入
                        {
                            if (key == '0')
                            {
                                return;      // 分第1位是0不处理
                            }
                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vDateTime.Day,
                                                     vDateTime.Minute, int.Parse(key.ToString()), vDateTime.Second);
                        }
                        break;

                    case DateTimeArea.dtaSecond:
                    {
                        vNumber = vDateTime.Second; // 当前秒
                        if (vNumber > 9)            // 当前秒已经是2位数了
                        {
                            if (key == '0')
                            {
                                return;          // 2位时再输入0不处理
                            }
                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vDateTime.Day,
                                                     vDateTime.Hour, vDateTime.Minute, int.Parse(key.ToString()));
                        }
                        else          // 当前秒是1位数字
                        if (FJoinKey) // 当前秒是连续输入
                        {
                            vNumber = vNumber * 10 + int.Parse(key.ToString());
                            if (vNumber > 59)
                            {
                                vNumber = int.Parse(key.ToString());
                            }

                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vDateTime.Day,
                                                     vDateTime.Hour, vDateTime.Minute, vNumber);
                        }
                        else          // 不是连续输入,是第1次输入
                        {
                            if (key == '0')
                            {
                                return;          // 秒第1位是0不处理
                            }
                            vDateTime = new DateTime(vDateTime.Year, vDateTime.Month, vDateTime.Day,
                                                     vDateTime.Hour, vDateTime.Minute, int.Parse(key.ToString()));
                        }
                    }
                    break;

                    case DateTimeArea.dtaMillisecond:
                        break;
                    }
                }

                if (FActiveArea != DateTimeArea.dtaYear)  // 除年外,其他的需要实时更新
                {
                    FActiveArea = GetAreaAt(FAreaRect.Left, FAreaRect.Top);
                    if (FActiveArea != DateTimeArea.dtaNone)
                    {
                        FAreaRect = GetAreaRect(FActiveArea);
                    }

                    FJoinKey = true;
                    SetDateTime(vDateTime);
                }

                this.OwnerData.Style.UpdateInfoRePaint();
            }
        }