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); }
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); }
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; }
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; } }
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; } }
protected override void SetActive(bool Value) { base.SetActive(Value); if (!this.Active) { if (FActiveArea == DateTimeArea.dtaYear) { SetInputYear(); } FActiveArea = DateTimeArea.dtaNone; } }
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(); } }