diff --git a/SunnyUI/Controls/UINavMenu.cs b/SunnyUI/Controls/UINavMenu.cs index 9d93ac35..5f58c207 100644 --- a/SunnyUI/Controls/UINavMenu.cs +++ b/SunnyUI/Controls/UINavMenu.cs @@ -103,9 +103,6 @@ namespace Sunny.UI selectedForeColor = UIStyles.Blue.NavMenuMenuSelectedColor; selectedHighColor = UIStyles.Blue.NavMenuMenuSelectedColor; - - _timer = new System.Windows.Forms.Timer(); - _timer.Tick += Timer_Tick; } protected override void OnHandleCreated(EventArgs e) @@ -116,12 +113,6 @@ namespace Sunny.UI if (Style != 0) Win32.User.SendMessage(Handle, 0x112C, new IntPtr(0x0004), new IntPtr(Style)); } - protected override void Dispose(bool disposing) - { - _timer.Dispose(); - base.Dispose(disposing); - } - private int scrollBarWidth = 0; [DefaultValue(0), Category("SunnyUI"), Description("垂直滚动条宽度,最小为原生滚动条宽度")] @@ -663,152 +654,143 @@ namespace Sunny.UI protected override void OnDrawNode(DrawTreeNodeEventArgs e) { if (e.Bounds.IsEmpty) return; + if (BorderStyle != BorderStyle.None) BorderStyle = BorderStyle.None; + if (checkBoxes != false) CheckBoxes = false; - if (_resizing) + SetScrollInfo(); + + if (e.Node == null || (e.Node.Bounds.Width <= 0 && e.Node.Bounds.Height <= 0 && e.Node.Bounds.X <= 0 && e.Node.Bounds.Y <= 0)) { - return; - //e.DrawDefault = true; + e.DrawDefault = true; } else { - if (BorderStyle != BorderStyle.None) BorderStyle = BorderStyle.None; - if (checkBoxes != false) CheckBoxes = false; + int drawLeft = e.Node.Level * 16 + 16 + 4; + int imageLeft = drawLeft; + bool haveImage = false; - SetScrollInfo(); - - if (e.Node == null || (e.Node.Bounds.Width <= 0 && e.Node.Bounds.Height <= 0 && e.Node.Bounds.X <= 0 && e.Node.Bounds.Y <= 0)) + if (MenuHelper.GetSymbol(e.Node) > 0) { - e.DrawDefault = true; + haveImage = true; + drawLeft += MenuHelper.GetSymbolSize(e.Node) + 6; } else { - int drawLeft = e.Node.Level * 16 + 16 + 4; - int imageLeft = drawLeft; - bool haveImage = false; - - if (MenuHelper.GetSymbol(e.Node) > 0) + if (ImageList != null && ImageList.Images.Count > 0 && e.Node.ImageIndex >= 0 && e.Node.ImageIndex < ImageList.Images.Count) { haveImage = true; - drawLeft += MenuHelper.GetSymbolSize(e.Node) + 6; - } - else - { - if (ImageList != null && ImageList.Images.Count > 0 && e.Node.ImageIndex >= 0 && e.Node.ImageIndex < ImageList.Images.Count) - { - haveImage = true; - drawLeft += ImageList.ImageSize.Width + 6; - } - } - - if (e.Node == SelectedNode) - { - if (SelectedColorGradient) - { - using LinearGradientBrush br = new LinearGradientBrush(new Point(0, 0), new Point(0, e.Node.Bounds.Height), SelectedColor, SelectedColor2); - br.GammaCorrection = true; - e.Graphics.FillRectangle(br, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); - } - else - { - e.Graphics.FillRectangle(SelectedColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); - } - - e.Graphics.DrawString(e.Node.Text, Font, SelectedForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width - drawLeft, ItemHeight), ContentAlignment.MiddleLeft); - e.Graphics.FillRectangle(SelectedHighColor, new Rectangle(0, e.Bounds.Y, 4, e.Bounds.Height)); - } - else if (e.Node == CurrentNode && (e.State & TreeNodeStates.Hot) != 0) - { - e.Graphics.FillRectangle(HoverColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); - e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width - drawLeft, ItemHeight), ContentAlignment.MiddleLeft); - } - else - { - Color color = fillColor; - if (showSecondBackColor && e.Node.Level > 0) - { - color = SecondBackColor; - } - - e.Graphics.FillRectangle(color, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); - e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width - drawLeft, ItemHeight), ContentAlignment.MiddleLeft); - } - - //画右侧图标 - Color rightSymbolColor = ForeColor; - if (e.Node == SelectedNode) rightSymbolColor = SelectedForeColor; - if (TreeNodeSymbols.ContainsKey(e.Node) && TreeNodeSymbols[e.Node].Count > 0) - { - int size = e.Node.Nodes.Count > 0 ? 24 : 0; - int left = Width - size - 6; - if (Bar.Visible) left -= Bar.Width; - - int firstLeft = left - TreeNodeSymbols[e.Node].Count * 30; - for (int i = 0; i < TreeNodeSymbols[e.Node].Count; i++) - { - e.Graphics.DrawFontImage(TreeNodeSymbols[e.Node][i], 24, rightSymbolColor, new Rectangle(firstLeft + i * 30, e.Bounds.Top, 30, e.Bounds.Height)); - } - } - - //画图片 - if (haveImage) - { - if (MenuHelper.GetSymbol(e.Node) > 0) - { - Color color = e.Node == SelectedNode ? SelectedForeColor : ForeColor; - Point offset = MenuHelper.GetSymbolOffset(e.Node); - e.Graphics.DrawFontImage(MenuHelper.GetSymbol(e.Node), MenuHelper.GetSymbolSize(e.Node), color, new Rectangle(imageLeft, e.Bounds.Y, MenuHelper.GetSymbolSize(e.Node), e.Bounds.Height), offset.X, offset.Y, MenuHelper.GetSymbolRotate(e.Node)); - } - else - { - if (e.Node == SelectedNode && e.Node.SelectedImageIndex >= 0 && e.Node.SelectedImageIndex < ImageList.Images.Count) - e.Graphics.DrawImage(ImageList.Images[e.Node.SelectedImageIndex], imageLeft, e.Bounds.Y + (e.Bounds.Height - ImageList.ImageSize.Height) / 2); - else - e.Graphics.DrawImage(ImageList.Images[e.Node.ImageIndex], imageLeft, e.Bounds.Y + (e.Bounds.Height - ImageList.ImageSize.Height) / 2); - } - } - - //显示右侧下拉箭头 - if (ShowItemsArrow && e.Node.Nodes.Count > 0) - { - int size = 24; - int left = Width - size - 6; - if (Bar.Visible) left -= Bar.Width; - - SizeF sf = e.Graphics.GetFontImageSize(61702, 24); - Rectangle rect = new Rectangle((int)(left + sf.Width / 2) - 12, e.Bounds.Y, 24, e.Bounds.Height); - e.Graphics.DrawFontImage(e.Node.IsExpanded ? 61702 : 61703, 24, ForeColor, rect); - } - - //显示Tips圆圈 - if (ShowTips && MenuHelper.GetTipsText(e.Node).IsValid()) - { - using var TempFont = TipsFont.DPIScaleFont(TipsFont.Size); - Size tipsSize = TextRenderer.MeasureText(MenuHelper.GetTipsText(e.Node), TempFont); - int sfMax = Math.Max(tipsSize.Width, tipsSize.Height); - int tipsLeft = Width - sfMax - 16; - if (e.Node.Nodes.Count > 0) tipsLeft -= 24; - if (Bar.Visible) tipsLeft -= Bar.Width; - if (TreeNodeSymbols.ContainsKey(e.Node)) tipsLeft -= TreeNodeSymbols[e.Node].Count * 30; - int tipsTop = e.Bounds.Y + (ItemHeight - sfMax) / 2; - - if (MenuHelper[e.Node] != null) - { - if (MenuHelper[e.Node].TipsCustom) - { - e.Graphics.FillEllipse(MenuHelper[e.Node].TipsBackColor, tipsLeft - 1, tipsTop, sfMax, sfMax); - e.Graphics.DrawString(MenuHelper.GetTipsText(e.Node), TempFont, MenuHelper[e.Node].TipsForeColor, new Rectangle(tipsLeft, tipsTop, sfMax, sfMax), ContentAlignment.MiddleCenter); - } - else - { - e.Graphics.FillEllipse(TipsColor, tipsLeft - 1, tipsTop, sfMax, sfMax); - e.Graphics.DrawString(MenuHelper.GetTipsText(e.Node), TempFont, TipsForeColor, new Rectangle(tipsLeft, tipsTop, sfMax, sfMax), ContentAlignment.MiddleCenter); - } - } + drawLeft += ImageList.ImageSize.Width + 6; } } - base.OnDrawNode(e); + if (e.Node == SelectedNode) + { + if (SelectedColorGradient) + { + using LinearGradientBrush br = new LinearGradientBrush(new Point(0, 0), new Point(0, e.Node.Bounds.Height), SelectedColor, SelectedColor2); + br.GammaCorrection = true; + e.Graphics.FillRectangle(br, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + } + else + { + e.Graphics.FillRectangle(SelectedColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + } + + e.Graphics.DrawString(e.Node.Text, Font, SelectedForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width - drawLeft, ItemHeight), ContentAlignment.MiddleLeft); + e.Graphics.FillRectangle(SelectedHighColor, new Rectangle(0, e.Bounds.Y, 4, e.Bounds.Height)); + } + else if (e.Node == CurrentNode && (e.State & TreeNodeStates.Hot) != 0) + { + e.Graphics.FillRectangle(HoverColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width - drawLeft, ItemHeight), ContentAlignment.MiddleLeft); + } + else + { + Color color = fillColor; + if (showSecondBackColor && e.Node.Level > 0) + { + color = SecondBackColor; + } + + e.Graphics.FillRectangle(color, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width - drawLeft, ItemHeight), ContentAlignment.MiddleLeft); + } + + //画右侧图标 + Color rightSymbolColor = ForeColor; + if (e.Node == SelectedNode) rightSymbolColor = SelectedForeColor; + if (TreeNodeSymbols.ContainsKey(e.Node) && TreeNodeSymbols[e.Node].Count > 0) + { + int size = e.Node.Nodes.Count > 0 ? 24 : 0; + int left = Width - size - 6; + if (Bar.Visible) left -= Bar.Width; + + int firstLeft = left - TreeNodeSymbols[e.Node].Count * 30; + for (int i = 0; i < TreeNodeSymbols[e.Node].Count; i++) + { + e.Graphics.DrawFontImage(TreeNodeSymbols[e.Node][i], 24, rightSymbolColor, new Rectangle(firstLeft + i * 30, e.Bounds.Top, 30, e.Bounds.Height)); + } + } + + //画图片 + if (haveImage) + { + if (MenuHelper.GetSymbol(e.Node) > 0) + { + Color color = e.Node == SelectedNode ? SelectedForeColor : ForeColor; + Point offset = MenuHelper.GetSymbolOffset(e.Node); + e.Graphics.DrawFontImage(MenuHelper.GetSymbol(e.Node), MenuHelper.GetSymbolSize(e.Node), color, new Rectangle(imageLeft, e.Bounds.Y, MenuHelper.GetSymbolSize(e.Node), e.Bounds.Height), offset.X, offset.Y, MenuHelper.GetSymbolRotate(e.Node)); + } + else + { + if (e.Node == SelectedNode && e.Node.SelectedImageIndex >= 0 && e.Node.SelectedImageIndex < ImageList.Images.Count) + e.Graphics.DrawImage(ImageList.Images[e.Node.SelectedImageIndex], imageLeft, e.Bounds.Y + (e.Bounds.Height - ImageList.ImageSize.Height) / 2); + else + e.Graphics.DrawImage(ImageList.Images[e.Node.ImageIndex], imageLeft, e.Bounds.Y + (e.Bounds.Height - ImageList.ImageSize.Height) / 2); + } + } + + //显示右侧下拉箭头 + if (ShowItemsArrow && e.Node.Nodes.Count > 0) + { + int size = 24; + int left = Width - size - 6; + if (Bar.Visible) left -= Bar.Width; + + SizeF sf = e.Graphics.GetFontImageSize(61702, 24); + Rectangle rect = new Rectangle((int)(left + sf.Width / 2) - 12, e.Bounds.Y, 24, e.Bounds.Height); + e.Graphics.DrawFontImage(e.Node.IsExpanded ? 61702 : 61703, 24, ForeColor, rect); + } + + //显示Tips圆圈 + if (ShowTips && MenuHelper.GetTipsText(e.Node).IsValid()) + { + using var TempFont = TipsFont.DPIScaleFont(TipsFont.Size); + Size tipsSize = TextRenderer.MeasureText(MenuHelper.GetTipsText(e.Node), TempFont); + int sfMax = Math.Max(tipsSize.Width, tipsSize.Height); + int tipsLeft = Width - sfMax - 16; + if (e.Node.Nodes.Count > 0) tipsLeft -= 24; + if (Bar.Visible) tipsLeft -= Bar.Width; + if (TreeNodeSymbols.ContainsKey(e.Node)) tipsLeft -= TreeNodeSymbols[e.Node].Count * 30; + int tipsTop = e.Bounds.Y + (ItemHeight - sfMax) / 2; + + if (MenuHelper[e.Node] != null) + { + if (MenuHelper[e.Node].TipsCustom) + { + e.Graphics.FillEllipse(MenuHelper[e.Node].TipsBackColor, tipsLeft - 1, tipsTop, sfMax, sfMax); + e.Graphics.DrawString(MenuHelper.GetTipsText(e.Node), TempFont, MenuHelper[e.Node].TipsForeColor, new Rectangle(tipsLeft, tipsTop, sfMax, sfMax), ContentAlignment.MiddleCenter); + } + else + { + e.Graphics.FillEllipse(TipsColor, tipsLeft - 1, tipsTop, sfMax, sfMax); + e.Graphics.DrawString(MenuHelper.GetTipsText(e.Node), TempFont, TipsForeColor, new Rectangle(tipsLeft, tipsTop, sfMax, sfMax), ContentAlignment.MiddleCenter); + } + } + } } + + base.OnDrawNode(e); } private Color tipsColor = Color.Red; @@ -1251,38 +1233,5 @@ namespace Sunny.UI public delegate void OnNodeRightSymbolClick(object sender, TreeNode node, int index, int symbol); public event OnNodeRightSymbolClick NodeRightSymbolClick; - - protected override void OnResize(EventArgs e) - { - //_resizing = true; - //_previousClientSize = ClientSize; - // 启动计时器 - //_timer.Start(); - } - - private bool _resizing; - private System.Windows.Forms.Timer _timer; - private Size _previousClientSize; - - private void Timer_Tick(object sender, EventArgs e) - { - // 检查控件的大小是否与前一次检查时相同 - if (ClientSize == _previousClientSize) - { - // 控件已停止调整大小 - _resizing = false; - - // 清除计时器 - _timer.Stop(); - - // 刷新 TreeView - Invalidate(); - } - else - { - // 更新前一次检查时的大小 - _previousClientSize = ClientSize; - } - } } } \ No newline at end of file diff --git a/SunnyUI/SunnyUI.csproj b/SunnyUI/SunnyUI.csproj index 9e6ef3c1..96db7ad8 100644 --- a/SunnyUI/SunnyUI.csproj +++ b/SunnyUI/SunnyUI.csproj @@ -17,10 +17,10 @@ https://gitee.com/yhuse/SunnyUI True SunnyUI.png - False + True D:\MyDocuments\Key\SunnyUI.pfx False - False + True False README.md