From 882dbb3f4033e41bf98e28782baed8a0adbeafce Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 25 Jan 2024 22:43:00 +0800 Subject: [PATCH] =?UTF-8?q?*=20UIForm2:=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SunnyUI/Forms/UIForm.cs | 16 - SunnyUI/Forms/UIForm2.Designer.cs | 11 + SunnyUI/Forms/UIForm2.cs | 953 +++++++++++++++++++++-- SunnyUI/Properties/Resources.Designer.cs | 10 + SunnyUI/Properties/Resources.resx | 3 + SunnyUI/Resources/SunnyUI.ico | Bin 0 -> 44142 bytes SunnyUI/Style/UIStyle.cs | 48 -- SunnyUI/Style/UIStyles.cs | 26 + 8 files changed, 944 insertions(+), 123 deletions(-) create mode 100644 SunnyUI/Resources/SunnyUI.ico diff --git a/SunnyUI/Forms/UIForm.cs b/SunnyUI/Forms/UIForm.cs index 34dc174e..828a422d 100644 --- a/SunnyUI/Forms/UIForm.cs +++ b/SunnyUI/Forms/UIForm.cs @@ -946,22 +946,6 @@ namespace Sunny.UI get; set; } - protected override void OnActivated(EventArgs e) - { - base.OnActivated(e); - IsActive = true; - Invalidate(); - } - - protected override void OnDeactivate(EventArgs e) - { - base.OnDeactivate(e); - IsActive = false; - Invalidate(); - } - - protected bool IsActive; - /// /// 重载绘图 /// diff --git a/SunnyUI/Forms/UIForm2.Designer.cs b/SunnyUI/Forms/UIForm2.Designer.cs index 24cc63bd..7b86b68e 100644 --- a/SunnyUI/Forms/UIForm2.Designer.cs +++ b/SunnyUI/Forms/UIForm2.Designer.cs @@ -13,6 +13,16 @@ /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { + this.UnRegister(); + + if (hotKeys != null) + { + foreach (var hotKey in hotKeys.Values) + { + Win32.User.UnregisterHotKey(System.IntPtr.Zero, hotKey.id); + } + } + if (disposing && (components != null)) { components.Dispose(); @@ -35,6 +45,7 @@ AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; ClientSize = new System.Drawing.Size(800, 450); + Icon = Sunny.UI.Properties.Resources.SunnyUI; Name = "UIForm2"; Padding = new System.Windows.Forms.Padding(0, 35, 0, 0); Text = "UIForm2"; diff --git a/SunnyUI/Forms/UIForm2.cs b/SunnyUI/Forms/UIForm2.cs index d725f30d..1ca1a39a 100644 --- a/SunnyUI/Forms/UIForm2.cs +++ b/SunnyUI/Forms/UIForm2.cs @@ -1,5 +1,28 @@ -using Sunny.UI.Win32; +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2023 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@QQ.Com + * + * Blog: https://www.cnblogs.com/yhuse + * Gitee: https://gitee.com/yhuse/SunnyUI + * GitHub: https://github.com/yhuse/SunnyUI + * + * SunnyUI.dll can be used for free under the GPL-3.0 license. + * If you use this code, please keep this note. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIForm2.cs + * 文件说明: 窗体基类 + * 当前版本: V3.6 + * 创建日期: 2024-01-20 + * + * 2024-01-20: V3.6.3 增加文件说明 + * 2024-01-25: V3.6.3 增加主题等 +******************************************************************************/ + using System; +using System.Collections.Concurrent; +using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; using System.Drawing; @@ -11,13 +34,18 @@ using System.Windows.Forms; namespace Sunny.UI { - public partial class UIForm2 : Form + public partial class UIForm2 : Form, IStyleInterface, ITranslate, IFrame { public UIForm2() { InitializeComponent(); - SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer, true); + this.Register(); + + SetStyle(ControlStyles.UserPaint | + ControlStyles.DoubleBuffer | + ControlStyles.OptimizedDoubleBuffer | + ControlStyles.AllPaintingInWmPaint, true); UpdateStyles(); Version = UIGlobal.Version; @@ -33,6 +61,203 @@ namespace Sunny.UI titleForeColor = UIStyles.Blue.FormTitleForeColor; } + public readonly Guid Guid = Guid.NewGuid(); + + public void Translate() + { + List controls = this.GetInterfaceControls("ITranslate"); + foreach (var control in controls) + { + if (control is ITranslate item) + { + item.Translate(); + } + } + } + + protected override void OnControlAdded(ControlEventArgs e) + { + base.OnControlAdded(e); + + if (ShowTitle && !AllowAddControlOnTitle && e.Control.Top < TitleHeight) + { + e.Control.Top = Padding.Top; + } + } + + protected override void OnTextChanged(EventArgs e) + { + base.OnTextChanged(e); + Invalidate(); + } + + protected override void OnLocationChanged(EventArgs e) + { + base.OnLocationChanged(e); + List pages = this.GetControls(true); + foreach (var page in pages) + { + page.ParentLocation = Location; + } + } + + protected override void OnMouseDoubleClick(MouseEventArgs e) + { + if (InControlBox || InMaxBox || InMinBox || InExtendBox) return; + if (!ShowTitle || e.Y > Padding.Top) + base.OnMouseDoubleClick(e); + } + + /// + /// 是否屏蔽Alt+F4 + /// + [Description("是否屏蔽Alt+F4"), Category("Key")] + [DefaultValue(false)] + public bool IsForbidAltF4 + { + get; set; + } + + [Description("使用Esc键关闭窗口"), Category("SunnyUI")] + [DefaultValue(false)] + public bool EscClose { get; set; } = false; + + protected override void OnClick(EventArgs e) + { + base.OnClick(e); + this.HideComboDropDown(); + } + + /// + /// Does the escape. + /// + protected virtual void DoEsc() + { + if (EscClose) + Close(); + } + + protected virtual void DoEnter() + { + } + + /// + /// 快捷键 + /// + /// 通过引用传递的 ,它表示要处理的 Win32 消息。 + /// 值之一,它表示要处理的键。 + /// 如果控件处理并使用击键,则为 true;否则为 false,以允许进一步处理。 + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) + { + int num = 256; + int num2 = 260; + if (msg.Msg == num | msg.Msg == num2) + { + if (keyData == (Keys.Alt | Keys.F4) && IsForbidAltF4) + { + //屏蔽Alt+F4 + return true; + } + + if (keyData == Keys.Escape) + { + DoEsc(); + } + + if (keyData == Keys.Enter) + { + DoEnter(); + } + } + + return base.ProcessCmdKey(ref msg, keyData); //其他键按默认处理 + } + + /// + /// 通过Windows的API控制窗体的拖动 + /// + public static void MousePressMove(IntPtr handle) + { + Win32.User.ReleaseCapture(); + Win32.User.SendMessage(handle, Win32.User.WM_SYSCOMMAND, Win32.User.SC_MOVE + Win32.User.HTCAPTION, 0); + } + + /// + /// 在构造函数中调用设置窗体移动 + /// + /// The cs. + protected void AddMousePressMove(params Control[] cs) + { + foreach (Control ctrl in cs) + { + if (ctrl != null && !ctrl.IsDisposed) + { + ctrl.MouseDown += CtrlMouseDown; + } + } + } + + /// + /// Handles the MouseDown event of the c control. + /// + /// The source of the event. + /// The instance containing the event data. + private void CtrlMouseDown(object sender, MouseEventArgs e) + { + if (WindowState == FormWindowState.Maximized) + { + return; + } + + if (sender == this) + { + if (FormBorderStyle == FormBorderStyle.None && e.Y <= titleHeight && e.X < ControlBoxLeft) + { + MousePressMove(Handle); + } + } + else + { + MousePressMove(Handle); + } + } + + [Description("窗体关闭时提示文字,为空则不提示"), Category("SunnyUI"), DefaultValue(null)] + public string CloseAskString + { + get; set; + } + + protected override void OnFormClosing(FormClosingEventArgs e) + { + if (CloseAskString.IsValid()) + { + if (!this.ShowAskDialog(CloseAskString, false)) + { + e.Cancel = true; + } + } + else + { + base.OnFormClosing(e); + } + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + + if (MainTabControl != null) + { + foreach (var item in MainTabControl.GetControls(true)) + { + item.Final(); + item.Close(); + item.Dispose(); + } + } + } + [Browsable(false)] public new bool IsMdiContainer { @@ -403,6 +628,7 @@ namespace Sunny.UI { base.OnSizeChanged(e); CalcSystemBoxPos(); + Invalidate(); } /// @@ -481,7 +707,7 @@ namespace Sunny.UI } /// - /// 重载鼠标按下事件f + /// 重载鼠标按下事件 /// /// 鼠标参数 protected override void OnMouseDown(MouseEventArgs e) @@ -625,26 +851,6 @@ namespace Sunny.UI public event EventHandler RectColorChanged; - /// - /// 是否重绘边框样式 - /// - private bool _showRect = true; - - /// - /// 是否显示边框 - /// - [Description("是否显示边框"), Category("SunnyUI")] - [DefaultValue(true)] - public bool ShowRect - { - get => _showRect; - set - { - _showRect = value; - Invalidate(); - } - } - /// /// 重载绘图 /// @@ -664,24 +870,6 @@ namespace Sunny.UI e.Graphics.DrawLine(RectColor, 0, titleHeight, Width, titleHeight); } - if (ShowRect) - { - Point[] points = new[] - { - new Point(0, 0), - new Point(Width - 1, 0), - new Point(Width - 1, Height - 1), - new Point(0, Height - 1), - new Point(0, 0) - }; - - e.Graphics.DrawLines(rectColor, points); - e.Graphics.DrawLine(Color.FromArgb(120, rectColor), new Point(2, 1), new Point(1, 2)); - e.Graphics.DrawLine(Color.FromArgb(120, rectColor), new Point(2, Height - 1 - 1), new Point(1, Height - 1 - 2)); - e.Graphics.DrawLine(Color.FromArgb(120, rectColor), new Point(Width - 1 - 2, 1), new Point(Width - 1 - 1, 2)); - e.Graphics.DrawLine(Color.FromArgb(120, rectColor), new Point(Width - 1 - 2, Height - 1 - 1), new Point(Width - 1 - 1, Height - 1 - 2)); - } - if (!ShowTitle) { return; @@ -844,7 +1032,7 @@ namespace Sunny.UI return image; } - private bool showTitleIcon; + private bool showTitleIcon = false; [Description("显示标题栏图标"), Category("SunnyUI")] [DefaultValue(false)] @@ -883,7 +1071,7 @@ namespace Sunny.UI { var screenRect = ClientRectangle; screenRect.Offset(-Bounds.Left, -Bounds.Top); - var rect = new RECT(screenRect.Left, screenRect.Top, screenRect.Right, screenRect.Bottom); + var rect = new Win32.RECT(screenRect.Left, screenRect.Top, screenRect.Right, screenRect.Bottom); Win32.User.AdjustWindowRectEx(ref rect, (int)CreateParams.Style, false, (int)CreateParams.ExStyle); return new Padding { @@ -949,18 +1137,59 @@ namespace Sunny.UI case Win32.User.WM_NCCALCSIZE when m.WParam != IntPtr.Zero: if (CalcSize(ref m)) return; break; + case Win32.User.WM_HOTKEY: + int hotKeyId = (int)(m.WParam); + if (hotKeys != null && hotKeys.ContainsKey(hotKeyId)) + { + HotKeyEventHandler?.Invoke(this, new HotKeyEventArgs(hotKeys[hotKeyId], DateTime.Now)); + } + break; } base.WndProc(ref m); + + if (m.Msg == Win32.User.WM_NCHITTEST && ShowDragStretch && WindowState == FormWindowState.Normal) + { + //Point vPoint = new Point((int)m.LParam & 0xFFFF, (int)m.LParam >> 16 & 0xFFFF); + Point vPoint = new Point(MousePosition.X, MousePosition.Y);//修正有分屏后,调整窗体大小时鼠标显示左右箭头问题 + vPoint = PointToClient(vPoint); + int dragSize = 5; + if (vPoint.X <= dragSize) + { + if (vPoint.Y <= dragSize) + m.Result = (IntPtr)Win32.User.HTTOPLEFT; + else if (vPoint.Y >= ClientSize.Height - dragSize) + m.Result = (IntPtr)Win32.User.HTBOTTOMLEFT; + else + m.Result = (IntPtr)Win32.User.HTLEFT; + } + else if (vPoint.X >= ClientSize.Width - dragSize) + { + if (vPoint.Y <= dragSize) + m.Result = (IntPtr)Win32.User.HTTOPRIGHT; + else if (vPoint.Y >= ClientSize.Height - dragSize) + m.Result = (IntPtr)Win32.User.HTBOTTOMRIGHT; + else + m.Result = (IntPtr)Win32.User.HTRIGHT; + } + else if (vPoint.Y <= dragSize) + { + m.Result = (IntPtr)Win32.User.HTTOP; + } + else if (vPoint.Y >= ClientSize.Height - dragSize) + { + m.Result = (IntPtr)Win32.User.HTBOTTOM; + } + } } private bool CalcSize(ref Message m) { if (FormBorderStyle == FormBorderStyle.None) return false; #if NET40 - var sizeParams = (NCCALCSIZE_PARAMS)Marshal.PtrToStructure(m.LParam, typeof(NCCALCSIZE_PARAMS)); + var sizeParams = (Win32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(m.LParam, typeof(Win32.NCCALCSIZE_PARAMS)); #else - var sizeParams = Marshal.PtrToStructure(m.LParam); + var sizeParams = Marshal.PtrToStructure(m.LParam); #endif var borders = GetNonClientMetrics(); @@ -984,21 +1213,627 @@ namespace Sunny.UI { base.OnShown(e); - //if (AutoScaleMode == AutoScaleMode.Font) AutoScaleMode = AutoScaleMode.None; - //if (base.BackColor == SystemColors.Control) base.BackColor = UIStyles.Blue.PageBackColor; + if (AutoScaleMode == AutoScaleMode.Font) AutoScaleMode = AutoScaleMode.None; + if (base.BackColor == SystemColors.Control) base.BackColor = UIStyles.Blue.PageBackColor; - //Render(); + Render(); CalcSystemBoxPos(); - //IsShown = true; - //SetDPIScale(); - //SetZoomScaleRect(); - // - //if (AfterShown != null) - //{ - // AfterShownTimer = new System.Windows.Forms.Timer(); - // AfterShownTimer.Tick += AfterShownTimer_Tick; - // AfterShownTimer.Start(); - //} + SetDPIScale(); + + if (AfterShown != null) + { + AfterShownTimer = new System.Windows.Forms.Timer(); + AfterShownTimer.Tick += AfterShownTimer_Tick; + AfterShownTimer.Start(); + } } + + private void AfterShownTimer_Tick(object sender, EventArgs e) + { + AfterShownTimer.Stop(); + AfterShownTimer.Tick -= AfterShownTimer_Tick; + AfterShownTimer?.Dispose(); + AfterShownTimer = null; + + AfterShown?.Invoke(this, EventArgs.Empty); + AfterShown = null; + } + + public void Render() + { + if (!DesignMode && UIStyles.Style.IsValid()) + { + SetInheritedStyle(UIStyles.Style); + } + } + + private System.Windows.Forms.Timer AfterShownTimer; + public event EventHandler AfterShown; + + #region IFrame实现 + + private UITabControl mainTabControl; + + [DefaultValue(null)] + public UITabControl MainTabControl + { + get => mainTabControl; + set + { + mainTabControl = value; + mainTabControl.Frame = this; + + mainTabControl.PageAdded += DealPageAdded; + mainTabControl.PageRemoved += DealPageRemoved; + mainTabControl.Selected += MainTabControl_Selected; + mainTabControl.Deselected += MainTabControl_Deselected; + mainTabControl.TabPageAndUIPageChanged += MainTabControl_TabPageAndUIPageChanged; + } + } + + private void MainTabControl_TabPageAndUIPageChanged(object sender, TabPageAndUIPageArgs e) + { + List pages = e.TabPage.GetControls(); + SelectedPage = pages.Count == 1 ? pages[0] : null; + } + + private void MainTabControl_Deselected(object sender, TabControlEventArgs e) + { + List pages = e.TabPage.GetControls(); + if (pages.Count == 1) pages[0].Final(); + } + + private void MainTabControl_Selected(object sender, TabControlEventArgs e) + { + List pages = e.TabPage.GetControls(); + SelectedPage = pages.Count == 1 ? pages[0] : null; + } + + private UIPage selectedPage = null; + [Browsable(false)] + public UIPage SelectedPage + { + get => selectedPage; + private set + { + if (selectedPage != value) + { + selectedPage = value; + PageSelected?.Invoke(this, new UIPageEventArgs(SelectedPage)); + } + } + } + + public event OnUIPageChanged PageSelected; + + public UIPage AddPage(UIPage page, int pageIndex) + { + page.PageIndex = pageIndex; + return AddPage(page); + } + + public UIPage AddPage(UIPage page, Guid pageGuid) + { + page.PageGuid = pageGuid; + return AddPage(page); + } + + public UIPage AddPage(UIPage page) + { + SetDefaultTabControl(); + + if (MainTabControl == null) + { + throw (new ApplicationException("未指定MainTabControl,无法承载多页面。")); + } + + page.Frame = this; + page.OnFrameDealPageParams += Page_OnFrameDealPageParams; + MainTabControl?.AddPage(page); + return page; + } + + private UIForm2 SetDefaultTabControl() + { + List ctrls = this.GetControls(); + if (ctrls.Count == 1) + { + if (MainTabControl == null) + { + MainTabControl = ctrls[0]; + } + + List Menus = this.GetControls(); + if (Menus.Count == 1 && Menus[0].TabControl == null) + { + Menus[0].TabControl = ctrls[0]; + } + + List Bars = this.GetControls(); + if (Bars.Count == 1 && Bars[0].TabControl == null) + { + Bars[0].TabControl = ctrls[0]; + } + } + + return this; + } + + public virtual bool SelectPage(int pageIndex) + { + SetDefaultTabControl(); + if (MainTabControl == null) return false; + return MainTabControl.SelectPage(pageIndex); + } + + public virtual bool SelectPage(Guid pageGuid) + { + SetDefaultTabControl(); + if (MainTabControl == null) return false; + return MainTabControl.SelectPage(pageGuid); + } + + public bool RemovePage(int pageIndex) => MainTabControl?.RemovePage(pageIndex) ?? false; + + public bool RemovePage(Guid pageGuid) => MainTabControl?.RemovePage(pageGuid) ?? false; + + public void RemoveAllPages(bool keepMainPage = true) => MainTabControl?.RemoveAllPages(keepMainPage); + + public UIPage GetPage(int pageIndex) => SetDefaultTabControl().MainTabControl?.GetPage(pageIndex); + + public UIPage GetPage(Guid pageGuid) => SetDefaultTabControl().MainTabControl?.GetPage(pageGuid); + + public bool ExistPage(int pageIndex) => GetPage(pageIndex) != null; + + public bool ExistPage(Guid pageGuid) => GetPage(pageGuid) != null; + + public bool SendParamToPage(int pageIndex, object value) + { + SetDefaultTabControl(); + UIPage page = GetPage(pageIndex); + if (page == null) + { + throw new NullReferenceException("未能查找到页面的索引为: " + pageIndex); + } + + var args = new UIPageParamsArgs(null, page, value); + page?.DealReceiveParams(args); + return args.Handled; + } + + public bool SendParamToPage(Guid pageGuid, object value) + { + SetDefaultTabControl(); + UIPage page = GetPage(pageGuid); + if (page == null) + { + throw new NullReferenceException("未能查找到页面的索引为: " + pageGuid); + } + + var args = new UIPageParamsArgs(null, page, value); + page?.DealReceiveParams(args); + return args.Handled; + } + + private void Page_OnFrameDealPageParams(object sender, UIPageParamsArgs e) + { + if (e == null) return; + if (e.DestPage == null) + { + ReceiveParams?.Invoke(this, e); + } + else + { + e.DestPage?.DealReceiveParams(e); + } + } + + public event OnReceiveParams ReceiveParams; + + public T GetPage() where T : UIPage => SetDefaultTabControl().MainTabControl?.GetPage(); + + public List GetPages() where T : UIPage => SetDefaultTabControl().MainTabControl?.GetPages(); + + public event OnUIPageChanged PageAdded; + + internal void DealPageAdded(object sender, UIPageEventArgs e) + { + PageAdded?.Invoke(this, e); + } + + public event OnUIPageChanged PageRemoved; + internal void DealPageRemoved(object sender, UIPageEventArgs e) + { + PageRemoved?.Invoke(this, e); + } + + /// + /// 初始化 + /// + public virtual void Init() + { + } + + /// + /// 结束 + /// + public virtual void Final() + { + } + + #endregion IFrame实现 + + #region IStyleInterface + protected UIStyle _style = UIStyle.Inherited; + + /// + /// 配色主题 + /// + [Description("配色主题"), Category("SunnyUI")] + [DefaultValue(UIStyle.Inherited)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + public virtual void SetInheritedStyle(UIStyle style) + { + if (!DesignMode) + { + this.SuspendLayout(); + UIStyleHelper.SetChildUIStyle(this, style); + + if (_style == UIStyle.Inherited && style.IsValid()) + { + SetStyleColor(style.Colors()); + Invalidate(); + _style = UIStyle.Inherited; + } + + UIStyleChanged?.Invoke(this, new EventArgs()); + this.ResumeLayout(); + } + } + + protected virtual void SetStyle(UIStyle style) + { + this.SuspendLayout(); + + if (!style.IsCustom()) + { + SetStyleColor(style.Colors()); + Invalidate(); + } + + _style = style == UIStyle.Inherited ? UIStyle.Inherited : UIStyle.Custom; + UIStyleChanged?.Invoke(this, new EventArgs()); + this.ResumeLayout(); + } + + public event EventHandler UIStyleChanged; + + public virtual void SetStyleColor(UIBaseStyle uiColor) + { + controlBoxForeColor = uiColor.FormControlBoxForeColor; + controlBoxFillHoverColor = uiColor.FormControlBoxFillHoverColor; + ControlBoxCloseFillHoverColor = uiColor.FormControlBoxCloseFillHoverColor; + rectColor = uiColor.FormRectColor; + ForeColor = uiColor.FormForeColor; + BackColor = uiColor.FormBackColor; + titleColor = uiColor.FormTitleColor; + titleForeColor = uiColor.FormTitleForeColor; + } + + /// + /// Tag字符串 + /// + [DefaultValue(null)] + [Description("获取或设置包含有关控件的数据的对象字符串"), Category("SunnyUI")] + public string TagString + { + get; set; + } + + private float DefaultFontSize = -1; + private float TitleFontSize = -1; + + public void SetDPIScale() + { + if (DesignMode) return; + if (!UIDPIScale.NeedSetDPIFont()) return; + + if (DefaultFontSize < 0) DefaultFontSize = this.Font.Size; + if (TitleFontSize < 0) TitleFontSize = this.TitleFont.Size; + + this.SetDPIScaleFont(DefaultFontSize); + TitleFont = TitleFont.DPIScaleFont(TitleFontSize); + foreach (var control in this.GetAllDPIScaleControls()) + { + control.SetDPIScale(); + } + } + #endregion + + #region 一些辅助窗口 + + /// + /// 正确信息提示框 + /// + /// 信息 + /// 显示遮罩层 + public void ShowSuccessDialog(string msg, bool showMask = false) + { + UIMessageDialog.ShowMessageDialog(msg, UILocalize.SuccessTitle, false, UIStyle.Green, showMask, true); + } + + /// + /// 信息提示框 + /// + /// 信息 + /// 显示遮罩层 + public void ShowInfoDialog(string msg, bool showMask = false) + { + UIMessageDialog.ShowMessageDialog(msg, UILocalize.InfoTitle, false, UIStyle.Gray, showMask, true); + } + + /// + /// 警告信息提示框 + /// + /// 信息 + /// 显示遮罩层 + public void ShowWarningDialog(string msg, bool showMask = false) + { + UIMessageDialog.ShowMessageDialog(msg, UILocalize.WarningTitle, false, UIStyle.Orange, showMask, true); + } + + /// + /// 错误信息提示框 + /// + /// 信息 + /// 显示遮罩层 + public void ShowErrorDialog(string msg, bool showMask = false) + { + UIMessageDialog.ShowMessageDialog(msg, UILocalize.ErrorTitle, false, UIStyle.Red, showMask, true); + } + + /// + /// 确认信息提示框 + /// + /// 信息 + /// 显示遮罩层 + /// 结果 + public bool ShowAskDialog(string msg, bool showMask = false, UIMessageDialogButtons defaultButton = UIMessageDialogButtons.Ok) + { + return UIMessageDialog.ShowMessageDialog(msg, UILocalize.AskTitle, true, UIStyle.Blue, showMask, true, defaultButton); + } + + /// + /// 正确信息提示框 + /// + /// 标题 + /// 信息 + /// 主题 + /// 显示遮罩层 + public void ShowSuccessDialog(string title, string msg, UIStyle style = UIStyle.Green, bool showMask = false) + { + UIMessageDialog.ShowMessageDialog(msg, title, false, style, showMask, true); + } + + /// + /// 信息提示框 + /// + /// 标题 + /// 信息 + /// 主题 + /// 显示遮罩层 + public void ShowInfoDialog(string title, string msg, UIStyle style = UIStyle.Gray, bool showMask = false) + { + UIMessageDialog.ShowMessageDialog(msg, title, false, style, showMask, true); + } + + /// + /// 警告信息提示框 + /// + /// 标题 + /// 信息 + /// 主题 + /// 显示遮罩层 + public void ShowWarningDialog(string title, string msg, UIStyle style = UIStyle.Orange, bool showMask = false) + { + UIMessageDialog.ShowMessageDialog(msg, title, false, style, showMask, true); + } + + /// + /// 错误信息提示框 + /// + /// 标题 + /// 信息 + /// 主题 + /// 显示遮罩层 + public void ShowErrorDialog(string title, string msg, UIStyle style = UIStyle.Red, bool showMask = false) + { + UIMessageDialog.ShowMessageDialog(msg, title, false, style, showMask, true); + } + + /// + /// 确认信息提示框 + /// + /// 标题 + /// 信息 + /// 主题 + /// 显示遮罩层 + /// 结果 + public bool ShowAskDialog(string title, string msg, UIStyle style = UIStyle.Blue, bool showMask = false, UIMessageDialogButtons defaultButton = UIMessageDialogButtons.Ok) + { + return UIMessageDialog.ShowMessageDialog(msg, title, true, style, showMask, true, defaultButton); + } + + /// + /// 显示消息 + /// + /// 消息文本 + /// 消息停留时长(ms)。默认1秒 + /// 是否漂浮 + public void ShowInfoTip(string text, int delay = 1000, bool floating = true) + => UIMessageTip.Show(text, null, delay, floating); + + /// + /// 显示成功消息 + /// + /// 消息文本 + /// 消息停留时长(ms)。默认1秒 + /// 是否漂浮 + public void ShowSuccessTip(string text, int delay = 1000, bool floating = true) + => UIMessageTip.ShowOk(text, delay, floating); + + /// + /// 显示警告消息 + /// + /// 消息文本 + /// 消息停留时长(ms)。默认1秒 + /// 是否漂浮 + public void ShowWarningTip(string text, int delay = 1000, bool floating = true) + => UIMessageTip.ShowWarning(text, delay, floating); + + /// + /// 显示出错消息 + /// + /// 消息文本 + /// 消息停留时长(ms)。默认1秒 + /// 是否漂浮 + public void ShowErrorTip(string text, int delay = 1000, bool floating = true) + => UIMessageTip.ShowError(text, delay, floating); + + /// + /// 在指定控件附近显示消息 + /// + /// 控件或工具栏项 + /// 消息文本 + /// 消息停留时长(ms)。默认1秒 + /// 是否漂浮 + public void ShowInfoTip(Component controlOrItem, string text, int delay = 1000, bool floating = true) + => UIMessageTip.Show(controlOrItem, text, null, delay, floating); + + /// + /// 在指定控件附近显示良好消息 + /// + /// 控件或工具栏项 + /// 消息文本 + /// 消息停留时长(ms)。默认1秒 + /// 是否漂浮 + public void ShowSuccessTip(Component controlOrItem, string text, int delay = 1000, bool floating = true) + => UIMessageTip.ShowOk(controlOrItem, text, delay, floating); + + /// + /// 在指定控件附近显示出错消息 + /// + /// 控件或工具栏项 + /// 消息文本 + /// 消息停留时长(ms)。默认1秒 + /// 是否漂浮 + public void ShowErrorTip(Component controlOrItem, string text, int delay = 1000, bool floating = true) + => UIMessageTip.ShowError(controlOrItem, text, delay, floating); + + /// + /// 在指定控件附近显示警告消息 + /// + /// 控件或工具栏项 + /// 消息文本 + /// 消息停留时长(ms)。默认1秒 + /// 是否漂浮 + public void ShowWarningTip(Component controlOrItem, string text, int delay = 1000, bool floating = true) + => UIMessageTip.ShowWarning(controlOrItem, text, delay, floating, false); + + public void ShowInfoNotifier(string desc, bool isDialog = false, int timeout = 2000) + { + UINotifierHelper.ShowNotifier(desc, UINotifierType.INFO, UILocalize.InfoTitle, isDialog, timeout); + } + + public void ShowSuccessNotifier(string desc, bool isDialog = false, int timeout = 2000) + { + UINotifierHelper.ShowNotifier(desc, UINotifierType.OK, UILocalize.SuccessTitle, isDialog, timeout); + } + + public void ShowWarningNotifier(string desc, bool isDialog = false, int timeout = 2000) + { + UINotifierHelper.ShowNotifier(desc, UINotifierType.WARNING, UILocalize.WarningTitle, isDialog, timeout); + } + + public void ShowErrorNotifier(string desc, bool isDialog = false, int timeout = 2000) + { + UINotifierHelper.ShowNotifier(desc, UINotifierType.ERROR, UILocalize.ErrorTitle, isDialog, timeout); + } + + public void ShowInfoNotifier(string desc, EventHandler clickEvent, int timeout = 2000) + { + UINotifierHelper.ShowNotifier(desc, clickEvent, UINotifierType.INFO, UILocalize.InfoTitle, timeout); + } + + public void ShowSuccessNotifier(string desc, EventHandler clickEvent, int timeout = 2000) + { + UINotifierHelper.ShowNotifier(desc, clickEvent, UINotifierType.OK, UILocalize.SuccessTitle, timeout); + } + + public void ShowWarningNotifier(string desc, EventHandler clickEvent, int timeout = 2000) + { + UINotifierHelper.ShowNotifier(desc, clickEvent, UINotifierType.WARNING, UILocalize.WarningTitle, timeout); + } + + public void ShowErrorNotifier(string desc, EventHandler clickEvent, int timeout = 2000) + { + UINotifierHelper.ShowNotifier(desc, clickEvent, UINotifierType.ERROR, UILocalize.ErrorTitle, timeout); + } + + #endregion 一些辅助窗口 + + private bool showDragStretch; + + [Description("显示边框可拖拽调整窗体大小"), Category("SunnyUI"), DefaultValue(false)] + public bool ShowDragStretch + { + get => showDragStretch; + set + { + showDragStretch = value; + if (value) + { + Padding = new Padding(Math.Max(Padding.Left, 2), showTitle ? TitleHeight + 1 : 2, Math.Max(Padding.Right, 2), Math.Max(Padding.Bottom, 2)); + } + else + { + Padding = new Padding(0, showTitle ? TitleHeight : 0, 0, 0); + } + } + } + + public void RegisterHotKey(Sunny.UI.ModifierKeys modifierKey, Keys key) + { + if (hotKeys == null) hotKeys = new ConcurrentDictionary(); + + int id = HotKey.CalculateID(modifierKey, key); + if (!hotKeys.ContainsKey(id)) + { + HotKey newHotkey = new HotKey(modifierKey, key); + hotKeys.TryAdd(id, newHotkey); + Win32.User.RegisterHotKey(Handle, id, (int)newHotkey.ModifierKey, (int)newHotkey.Key); + } + } + + public void UnRegisterHotKey(Sunny.UI.ModifierKeys modifierKey, Keys key) + { + if (hotKeys == null) return; + + int id = HotKey.CalculateID(modifierKey, key); + if (hotKeys.ContainsKey(id)) + { + hotKeys.TryRemove(id, out _); + Win32.User.UnregisterHotKey(Handle, id); + } + } + + public event HotKeyEventHandler HotKeyEventHandler; + + private ConcurrentDictionary hotKeys; } } diff --git a/SunnyUI/Properties/Resources.Designer.cs b/SunnyUI/Properties/Resources.Designer.cs index a9115aa9..389fd1db 100644 --- a/SunnyUI/Properties/Resources.Designer.cs +++ b/SunnyUI/Properties/Resources.Designer.cs @@ -190,6 +190,16 @@ namespace Sunny.UI.Properties { } } + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon SunnyUI { + get { + object obj = ResourceManager.GetObject("SunnyUI", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// diff --git a/SunnyUI/Properties/Resources.resx b/SunnyUI/Properties/Resources.resx index 08535611..bf0287c2 100644 --- a/SunnyUI/Properties/Resources.resx +++ b/SunnyUI/Properties/Resources.resx @@ -157,6 +157,9 @@ ..\Resources\notifier.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\SunnyUI.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\wind.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/SunnyUI/Resources/SunnyUI.ico b/SunnyUI/Resources/SunnyUI.ico new file mode 100644 index 0000000000000000000000000000000000000000..826f617742c85e9f2bcd951a2f11420dc3796b7c GIT binary patch literal 44142 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 literal 0 HcmV?d00001 diff --git a/SunnyUI/Style/UIStyle.cs b/SunnyUI/Style/UIStyle.cs index e97723dd..1907c104 100644 --- a/SunnyUI/Style/UIStyle.cs +++ b/SunnyUI/Style/UIStyle.cs @@ -35,8 +35,6 @@ namespace Sunny.UI { UIStyle Style { get; set; } - bool StyleCustomMode { get; set; } - string Version { get; } string TagString { get; set; } @@ -483,51 +481,5 @@ namespace Sunny.UI return values; } - - public static void SetRawControlStyle(ControlEventArgs e, UIStyle style) - { - if (e.Control is TableLayoutPanel) - { - List controls = e.Control.GetUIStyleControls("IStyleInterface"); - foreach (var control in controls) - { - if (control is IStyleInterface item) - { - if (!item.StyleCustomMode) - item.Style = style; - } - } - - return; - } - - if (e.Control is FlowLayoutPanel) - { - List controls = e.Control.GetUIStyleControls("IStyleInterface"); - foreach (var control in controls) - { - if (control is IStyleInterface item) - { - if (!item.StyleCustomMode) - item.Style = style; - } - } - - return; - } - - if (e.Control is Panel) - { - List controls = e.Control.GetUIStyleControls("IStyleInterface"); - foreach (var control in controls) - { - if (control is IStyleInterface item) - { - if (!item.StyleCustomMode) - item.Style = style; - } - } - } - } } } \ No newline at end of file diff --git a/SunnyUI/Style/UIStyles.cs b/SunnyUI/Style/UIStyles.cs index 57fd1cdc..cfa8e075 100644 --- a/SunnyUI/Style/UIStyles.cs +++ b/SunnyUI/Style/UIStyles.cs @@ -207,6 +207,8 @@ namespace Sunny.UI private static readonly ConcurrentDictionary Styles = new ConcurrentDictionary(); private static readonly ConcurrentDictionary Forms = new ConcurrentDictionary(); private static readonly ConcurrentDictionary Pages = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary Forms2 = new ConcurrentDictionary(); + /// /// 菜单颜色集合 @@ -295,6 +297,21 @@ namespace Sunny.UI return false; } + /// + /// 注册窗体 + /// + /// 窗体 + public static bool Register(this UIForm2 form) + { + if (!Forms2.ContainsKey(form.Guid)) + { + Forms2.Upsert(form.Guid, form); + return true; + } + + return false; + } + /// /// 注册页面 /// @@ -331,6 +348,15 @@ namespace Sunny.UI Forms.TryRemove(form.Guid, out _); } + /// + /// 反注册窗体 + /// + /// 窗体 + public static void UnRegister(this UIForm2 form) + { + Forms2.TryRemove(form.Guid, out _); + } + /// /// 反注册页面 ///