diff --git a/.vs/QuickLauncher/CopilotIndices/17.13.439.2385/CodeChunks.db b/.vs/QuickLauncher/CopilotIndices/17.13.439.2385/CodeChunks.db index c2b449e..1be3909 100644 Binary files a/.vs/QuickLauncher/CopilotIndices/17.13.439.2385/CodeChunks.db and b/.vs/QuickLauncher/CopilotIndices/17.13.439.2385/CodeChunks.db differ diff --git a/.vs/QuickLauncher/CopilotIndices/17.13.439.2385/SemanticSymbols.db b/.vs/QuickLauncher/CopilotIndices/17.13.439.2385/SemanticSymbols.db index 08934d9..80570e8 100644 Binary files a/.vs/QuickLauncher/CopilotIndices/17.13.439.2385/SemanticSymbols.db and b/.vs/QuickLauncher/CopilotIndices/17.13.439.2385/SemanticSymbols.db differ diff --git a/.vs/QuickLauncher/FileContentIndex/0afd8cc9-2b3f-4815-9025-1d55fc4d759c.vsidx b/.vs/QuickLauncher/FileContentIndex/0afd8cc9-2b3f-4815-9025-1d55fc4d759c.vsidx deleted file mode 100644 index f0b136c..0000000 Binary files a/.vs/QuickLauncher/FileContentIndex/0afd8cc9-2b3f-4815-9025-1d55fc4d759c.vsidx and /dev/null differ diff --git a/.vs/QuickLauncher/v17/.futdcache.v2 b/.vs/QuickLauncher/v17/.futdcache.v2 index 6489d15..9ad469b 100644 Binary files a/.vs/QuickLauncher/v17/.futdcache.v2 and b/.vs/QuickLauncher/v17/.futdcache.v2 differ diff --git a/.vs/QuickLauncher/v17/.suo b/.vs/QuickLauncher/v17/.suo index 103291c..1d085de 100644 Binary files a/.vs/QuickLauncher/v17/.suo and b/.vs/QuickLauncher/v17/.suo differ diff --git a/.vs/QuickLauncher/v17/DocumentLayout.backup.json b/.vs/QuickLauncher/v17/DocumentLayout.backup.json index 2c19a39..21764c5 100644 --- a/.vs/QuickLauncher/v17/DocumentLayout.backup.json +++ b/.vs/QuickLauncher/v17/DocumentLayout.backup.json @@ -2,6 +2,14 @@ "Version": 1, "WorkspaceRootPath": "I:\\Desktop\\CusserCore\\ToolBox\\", "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|i:\\desktop\\cussercore\\toolbox\\mainform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|solutionrelative:mainform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|i:\\desktop\\cussercore\\toolbox\\mainform.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|solutionrelative:mainform.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, { "AbsoluteMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|i:\\desktop\\cussercore\\toolbox\\mainform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form", "RelativeMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|solutionrelative:mainform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form" @@ -27,11 +35,37 @@ { "$type": "Document", "DocumentIndex": 0, + "Title": "MainForm.cs", + "DocumentMoniker": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.cs", + "RelativeDocumentMoniker": "MainForm.cs", + "ToolTip": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.cs", + "RelativeToolTip": "MainForm.cs", + "ViewState": "AgIAAKkDAAAAAAAAAAAkwLcDAABQAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-03-12T06:19:31.16Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "MainForm.Designer.cs", + "DocumentMoniker": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.Designer.cs", + "RelativeDocumentMoniker": "MainForm.Designer.cs", + "ToolTip": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.Designer.cs", + "RelativeToolTip": "MainForm.Designer.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAA0AAAA3AAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-03-12T06:57:18.744Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 2, "Title": "MainForm.cs [\u8BBE\u8BA1]", "DocumentMoniker": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.cs", "RelativeDocumentMoniker": "MainForm.cs", - "ToolTip": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.cs [\u8BBE\u8BA1]*", - "RelativeToolTip": "MainForm.cs [\u8BBE\u8BA1]*", + "ToolTip": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.cs [\u8BBE\u8BA1]", + "RelativeToolTip": "MainForm.cs [\u8BBE\u8BA1]", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "WhenOpened": "2025-03-12T06:05:42.834Z", "EditorCaption": " [\u8BBE\u8BA1]" diff --git a/.vs/QuickLauncher/v17/DocumentLayout.json b/.vs/QuickLauncher/v17/DocumentLayout.json index f73da02..5a44a5e 100644 --- a/.vs/QuickLauncher/v17/DocumentLayout.json +++ b/.vs/QuickLauncher/v17/DocumentLayout.json @@ -3,7 +3,15 @@ "WorkspaceRootPath": "I:\\Desktop\\CusserCore\\ToolBox\\", "Documents": [ { - "AbsoluteMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|i:\\desktop\\cussercore\\toolbox\\mainform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form", + "AbsoluteMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|i:\\desktop\\cussercore\\toolbox\\mainform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|solutionrelative:mainform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|i:\\desktop\\cussercore\\toolbox\\mainform.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|solutionrelative:mainform.designer.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|I:\\Desktop\\CusserCore\\ToolBox\\mainform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form", "RelativeMoniker": "D:0:0:{8E5D0C31-935F-4C3B-8A56-8E8C1F9D9F5A}|QuickLauncher.csproj|solutionrelative:mainform.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form" } ], @@ -27,14 +35,38 @@ { "$type": "Document", "DocumentIndex": 0, + "Title": "MainForm.cs", + "DocumentMoniker": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.cs", + "RelativeDocumentMoniker": "MainForm.cs", + "ToolTip": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.cs", + "RelativeToolTip": "MainForm.cs", + "ViewState": "AgIAAKkDAAAAAAAAAAAkwLcDAABQAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-03-12T06:19:31.16Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "MainForm.Designer.cs", + "DocumentMoniker": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.Designer.cs", + "RelativeDocumentMoniker": "MainForm.Designer.cs", + "ToolTip": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.Designer.cs", + "RelativeToolTip": "MainForm.Designer.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAA0AAAA3AAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-03-12T06:57:18.744Z" + }, + { + "$type": "Document", + "DocumentIndex": 2, "Title": "MainForm.cs [\u8BBE\u8BA1]", "DocumentMoniker": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.cs", "RelativeDocumentMoniker": "MainForm.cs", "ToolTip": "I:\\Desktop\\CusserCore\\ToolBox\\MainForm.cs [\u8BBE\u8BA1]", "RelativeToolTip": "MainForm.cs [\u8BBE\u8BA1]", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-03-12T06:05:42.834Z", - "EditorCaption": " [\u8BBE\u8BA1]" + "WhenOpened": "2025-03-12T06:05:42.834Z" } ] } diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 00d4507..6be3336 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -47,58 +47,59 @@ namespace QuickLauncher // leftPanel // leftPanel.AutoScroll = true; - leftPanel.BackColor = Color.FromArgb(230, 255, 230); + leftPanel.BackColor = Color.FromArgb(243, 243, 243); leftPanel.Dock = DockStyle.Left; leftPanel.Location = new Point(0, 36); - leftPanel.Margin = new Padding(6, 6, 6, 6); + leftPanel.Margin = new Padding(6); leftPanel.Name = "leftPanel"; - leftPanel.Size = new Size(275, 1164); + leftPanel.Size = new Size(300, 1164); leftPanel.TabIndex = 0; // // rightPanel // - rightPanel.BackColor = Color.White; + rightPanel.BackColor = Color.FromArgb(250, 250, 250); rightPanel.Controls.Add(shortcutsPanel); rightPanel.Controls.Add(toolPanel); rightPanel.Dock = DockStyle.Fill; - rightPanel.Location = new Point(275, 36); - rightPanel.Margin = new Padding(6, 6, 6, 6); + rightPanel.Location = new Point(300, 36); + rightPanel.Margin = new Padding(6); rightPanel.Name = "rightPanel"; - rightPanel.Size = new Size(1192, 1164); + rightPanel.Size = new Size(1167, 1164); rightPanel.TabIndex = 1; // // shortcutsPanel // shortcutsPanel.AllowDrop = true; shortcutsPanel.AutoScroll = true; - shortcutsPanel.BackColor = Color.White; + shortcutsPanel.BackColor = Color.FromArgb(250, 250, 250); shortcutsPanel.Dock = DockStyle.Fill; shortcutsPanel.Location = new Point(0, 80); - shortcutsPanel.Margin = new Padding(6, 6, 6, 6); + shortcutsPanel.Margin = new Padding(6); shortcutsPanel.Name = "shortcutsPanel"; - shortcutsPanel.Padding = new Padding(18, 20, 18, 20); - shortcutsPanel.Size = new Size(1192, 1084); + shortcutsPanel.Padding = new Padding(20); + shortcutsPanel.Size = new Size(1167, 1084); shortcutsPanel.TabIndex = 1; // // toolPanel // - toolPanel.BackColor = Color.FromArgb(240, 240, 240); + toolPanel.BackColor = Color.FromArgb(230, 230, 230); toolPanel.Controls.Add(addButton); toolPanel.Controls.Add(categoryLabel); toolPanel.Dock = DockStyle.Top; toolPanel.Location = new Point(0, 0); - toolPanel.Margin = new Padding(6, 6, 6, 6); + toolPanel.Margin = new Padding(6); toolPanel.Name = "toolPanel"; - toolPanel.Padding = new Padding(9, 10, 9, 10); - toolPanel.Size = new Size(1192, 80); + toolPanel.Padding = new Padding(15, 10, 15, 10); + toolPanel.Size = new Size(1167, 80); toolPanel.TabIndex = 0; // // addButton // - addButton.BackColor = Color.FromArgb(200, 255, 200); + addButton.BackColor = Color.FromArgb(0, 120, 212); addButton.FlatStyle = FlatStyle.Flat; - addButton.Location = new Point(18, 10); - addButton.Margin = new Padding(6, 6, 6, 6); + addButton.ForeColor = Color.White; + addButton.Location = new Point(20, 10); + addButton.Margin = new Padding(6); addButton.Name = "addButton"; addButton.Size = new Size(183, 60); addButton.TabIndex = 0; @@ -109,15 +110,16 @@ namespace QuickLauncher // categoryLabel // categoryLabel.AutoSize = true; - categoryLabel.Font = new Font("Microsoft YaHei UI", 10F, FontStyle.Regular, GraphicsUnit.Point); - categoryLabel.Location = new Point(220, 20); + categoryLabel.Font = new Font("Microsoft YaHei UI", 11F, FontStyle.Regular, GraphicsUnit.Point); + categoryLabel.Location = new Point(220, 25); categoryLabel.Margin = new Padding(6, 0, 6, 0); categoryLabel.Name = "categoryLabel"; - categoryLabel.Size = new Size(0, 27); + categoryLabel.Size = new Size(0, 30); categoryLabel.TabIndex = 1; // // menuStrip // + menuStrip.BackColor = Color.FromArgb(230, 230, 230); menuStrip.ImageScalingSize = new Size(24, 24); menuStrip.Items.AddRange(new ToolStripItem[] { fileMenu }); menuStrip.Location = new Point(0, 0); @@ -157,7 +159,7 @@ namespace QuickLauncher Controls.Add(menuStrip); Icon = (Icon)resources.GetObject("$this.Icon"); MainMenuStrip = menuStrip; - Margin = new Padding(6, 6, 6, 6); + Margin = new Padding(6); Name = "MainForm"; StartPosition = FormStartPosition.CenterScreen; Text = "快捷启动工具箱"; diff --git a/MainForm.cs b/MainForm.cs index a0b31eb..a298398 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -5,11 +5,90 @@ using System.Collections.Generic; using System.IO; using System.Text.Json; using System.Linq; +using System.Runtime.InteropServices; // 添加P/Invoke支持 +using System.Drawing.Drawing2D; // 添加GDI+支持 +using Microsoft.Win32; // 添加Registry访问支持 namespace QuickLauncher { public partial class MainForm : Form { + // Windows 11 UI相关 + private bool isDarkMode = false; + private Color accentColor = Color.FromArgb(0, 120, 212); // Windows默认蓝色 + private readonly Color lightBackColor = Color.FromArgb(243, 243, 243); + private readonly Color darkBackColor = Color.FromArgb(32, 32, 32); + private readonly Color lightTextColor = Color.FromArgb(0, 0, 0); + private readonly Color darkTextColor = Color.FromArgb(255, 255, 255); + private readonly int cornerRadius = 8; // Windows 11圆角半径 + + // P/Invoke用于实现Windows 11 Mica效果 + [DllImport("dwmapi.dll")] + private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); + + // DWM属性常量 + private const int DWMWA_USE_IMMERSIVE_DARK_MODE = 20; + private const int DWMWA_MICA_EFFECT = 1029; + + // 添加圆角支持的类 + private class RoundedPanel : Panel + { + private int _cornerRadius = 8; + + public int CornerRadius + { + get { return _cornerRadius; } + set { _cornerRadius = value; Invalidate(); } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + // 创建圆角路径 + using (GraphicsPath path = new GraphicsPath()) + { + path.AddArc(0, 0, CornerRadius, CornerRadius, 180, 90); + path.AddArc(Width - CornerRadius, 0, CornerRadius, CornerRadius, 270, 90); + path.AddArc(Width - CornerRadius, Height - CornerRadius, CornerRadius, CornerRadius, 0, 90); + path.AddArc(0, Height - CornerRadius, CornerRadius, CornerRadius, 90, 90); + path.CloseAllFigures(); + + this.Region = new Region(path); + } + } + } + + // 添加圆角按钮支持的类 + private class RoundedButton : Button + { + private int _cornerRadius = 8; + + public int CornerRadius + { + get { return _cornerRadius; } + set { _cornerRadius = value; Invalidate(); } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + // 创建圆角路径 + using (GraphicsPath path = new GraphicsPath()) + { + path.AddArc(0, 0, CornerRadius, CornerRadius, 180, 90); + path.AddArc(Width - CornerRadius, 0, CornerRadius, CornerRadius, 270, 90); + path.AddArc(Width - CornerRadius, Height - CornerRadius, CornerRadius, CornerRadius, 0, 90); + path.AddArc(0, Height - CornerRadius, CornerRadius, CornerRadius, 90, 90); + path.CloseAllFigures(); + + this.Region = new Region(path); + } + } + } + + // 原有的字段 private Dictionary> categories; private string dataFilePath = "shortcuts.json"; private string settingsFilePath = "settings.json"; @@ -22,6 +101,14 @@ namespace QuickLauncher private const int MIN_ICON_SIZE = 24; // 最小图标大小 private const int MAX_ICON_SIZE = 256; // 增加最大图标大小到256 private const int ICON_SIZE_STEP = 16; // 增加每次缩放的步长 + + // 左侧面板调整相关 + private bool isResizing = false; + private int resizingStartX = 0; + private int initialPanelWidth = 0; + private const int MIN_PANEL_WIDTH = 200; + private const int MAX_PANEL_WIDTH = 500; + private Panel resizeHandle; // 用于保存设置的类 private class AppSettings @@ -29,6 +116,7 @@ namespace QuickLauncher public string LastSelectedCategory { get; set; } = ""; public string SortMode { get; set; } = "Name"; // Name, DateAdded public int IconSize { get; set; } = 48; // 保存图标大小 + public int LeftPanelWidth { get; set; } = 300; // 左侧面板宽度 } private AppSettings settings = new AppSettings(); @@ -46,12 +134,158 @@ namespace QuickLauncher toolTip1.UseFading = true; toolTip1.IsBalloon = false; // 使用标准样式 + // 初始化数据和UI + InitializeUI(); + + // 应用Windows 11风格 + ApplyWin11Style(); + SetupContextMenus(); SetupEventHandlers(); - InitializeUI(); LoadSettings(); LoadData(); SelectDefaultCategory(); + + // 监听系统主题变化 + SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged; + } + + private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) + { + if (e.Category == UserPreferenceCategory.General) + { + // 在UI线程中更新主题 + if (this.InvokeRequired) + { + this.Invoke(new Action(() => UpdateTheme())); + } + else + { + UpdateTheme(); + } + } + } + + private void UpdateTheme() + { + // 更新深色模式状态 + isDarkMode = IsSystemUsingSysemDarkTheme(); + + // 重新应用Windows 11风格 + ApplyWin11Style(); + } + + // 应用Windows 11风格 + private void ApplyWin11Style() + { + // 检测系统主题 + isDarkMode = IsSystemUsingSysemDarkTheme(); + + // 应用Mica效果 + if (Environment.OSVersion.Version.Build >= 22000) // Windows 11 + { + try + { + // 应用深色/浅色模式 + int darkMode = isDarkMode ? 1 : 0; + DwmSetWindowAttribute(this.Handle, DWMWA_USE_IMMERSIVE_DARK_MODE, ref darkMode, sizeof(int)); + + // 应用Mica效果 + int micaEffect = 1; + DwmSetWindowAttribute(this.Handle, DWMWA_MICA_EFFECT, ref micaEffect, sizeof(int)); + } + catch (Exception) + { + // 如果不支持,则使用备用方案 + this.BackColor = isDarkMode ? darkBackColor : lightBackColor; + } + } + else + { + // 在Windows 10上使用备用方案 + this.BackColor = isDarkMode ? darkBackColor : lightBackColor; + } + + // 应用主题颜色 + ApplyThemeColors(); + } + + // 检测系统是否使用深色主题 + private bool IsSystemUsingSysemDarkTheme() + { + try + { + using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize")) + { + if (key != null) + { + var value = key.GetValue("AppsUseLightTheme"); + if (value != null && value is int) + { + return (int)value == 0; + } + } + } + } + catch { } + + return false; + } + + // 应用主题颜色 + private void ApplyThemeColors() + { + // 设置主窗体颜色 + this.ForeColor = isDarkMode ? darkTextColor : lightTextColor; + + // 设置左侧面板颜色 + leftPanel.BackColor = isDarkMode ? Color.FromArgb(40, 40, 40) : Color.FromArgb(243, 243, 243); + + // 设置右侧面板颜色 + rightPanel.BackColor = isDarkMode ? Color.FromArgb(32, 32, 32) : Color.FromArgb(250, 250, 250); + + // 设置工具面板颜色 + toolPanel.BackColor = isDarkMode ? Color.FromArgb(45, 45, 45) : Color.FromArgb(230, 230, 230); + + // 设置快捷方式面板颜色 + shortcutsPanel.BackColor = isDarkMode ? Color.FromArgb(32, 32, 32) : Color.FromArgb(250, 250, 250); + + // 设置添加按钮颜色 + addButton.BackColor = accentColor; + addButton.ForeColor = Color.White; + addButton.FlatAppearance.BorderSize = 0; + + // 设置菜单颜色 + menuStrip.BackColor = isDarkMode ? Color.FromArgb(45, 45, 45) : Color.FromArgb(230, 230, 230); + menuStrip.ForeColor = isDarkMode ? darkTextColor : lightTextColor; + + // 设置菜单项颜色 + foreach (ToolStripMenuItem item in menuStrip.Items) + { + item.ForeColor = isDarkMode ? Color.White : Color.Black; + + // 设置下拉菜单项颜色 + foreach (ToolStripItem dropItem in item.DropDownItems) + { + if (dropItem is ToolStripMenuItem menuItem) + { + menuItem.ForeColor = isDarkMode ? Color.White : Color.Black; + } + } + } + + // 设置菜单渲染器 + menuStrip.Renderer = new ModernMenuRenderer(isDarkMode); + + // 刷新分类列表和当前分类的快捷方式(仅当categories已初始化时) + if (categories != null) + { + RefreshCategoryList(); + if (!string.IsNullOrEmpty(currentCategory)) + { + ShowCategoryItems(currentCategory); + } + } } // 设置上下文菜单 @@ -62,6 +296,9 @@ namespace QuickLauncher categoryContextMenu.Items.Add("添加新分类", null, (s, e) => AddCategory_Click(s, e)); categoryContextMenu.Items.Add("删除当前分类", null, (s, e) => DeleteCategory_Click(s, e)); categoryContextMenu.Items.Add("重命名分类", null, (s, e) => RenameCategory_Click(s, e)); + + // 应用主题颜色 + categoryContextMenu.Renderer = new ModernMenuRenderer(isDarkMode); // 右侧面板右键菜单 shortcutsPanelContextMenu = new ContextMenuStrip(); @@ -82,6 +319,17 @@ namespace QuickLauncher sizeMenu.DropDownItems.Add("超大图标 (192px)", null, (s, e) => { ResizeIcons(192); }); sizeMenu.DropDownItems.Add("巨大图标 (256px)", null, (s, e) => { ResizeIcons(256); }); shortcutsPanelContextMenu.Items.Add(sizeMenu); + + // 添加主题切换选项 + shortcutsPanelContextMenu.Items.Add("-"); // 分隔线 + var themeMenu = new ToolStripMenuItem("主题设置"); + themeMenu.DropDownItems.Add("浅色主题", null, (s, e) => { ChangeTheme(false); }); + themeMenu.DropDownItems.Add("深色主题", null, (s, e) => { ChangeTheme(true); }); + themeMenu.DropDownItems.Add("跟随系统", null, (s, e) => { FollowSystemTheme(); }); + shortcutsPanelContextMenu.Items.Add(themeMenu); + + // 应用主题颜色 + shortcutsPanelContextMenu.Renderer = new ModernMenuRenderer(isDarkMode); // 快捷方式项目右键菜单 shortcutItemContextMenu = new ContextMenuStrip(); @@ -113,6 +361,123 @@ namespace QuickLauncher ShowShortcutProperties(item); } }); + + // 应用主题颜色 + shortcutItemContextMenu.Renderer = new ModernMenuRenderer(isDarkMode); + } + + // 切换主题 + private void ChangeTheme(bool darkMode) + { + isDarkMode = darkMode; + ApplyThemeColors(); + + // 更新上下文菜单渲染器 + categoryContextMenu.Renderer = new ModernMenuRenderer(isDarkMode); + shortcutsPanelContextMenu.Renderer = new ModernMenuRenderer(isDarkMode); + shortcutItemContextMenu.Renderer = new ModernMenuRenderer(isDarkMode); + } + + // 跟随系统主题 + private void FollowSystemTheme() + { + isDarkMode = IsSystemUsingSysemDarkTheme(); + ApplyThemeColors(); + + // 更新上下文菜单渲染器 + categoryContextMenu.Renderer = new ModernMenuRenderer(isDarkMode); + shortcutsPanelContextMenu.Renderer = new ModernMenuRenderer(isDarkMode); + shortcutItemContextMenu.Renderer = new ModernMenuRenderer(isDarkMode); + } + + // 现代菜单渲染器 + private class ModernMenuRenderer : ToolStripProfessionalRenderer + { + private bool _isDarkMode; + + public ModernMenuRenderer(bool isDarkMode) : base(new ModernColorTable(isDarkMode)) + { + _isDarkMode = isDarkMode; + } + + protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) + { + if (e.Item.Selected) + { + // 选中项背景 + Rectangle rect = new Rectangle(2, 0, e.Item.Width - 4, e.Item.Height); + Color highlightColor = _isDarkMode ? Color.FromArgb(70, 70, 70) : Color.FromArgb(210, 230, 250); + using (SolidBrush brush = new SolidBrush(highlightColor)) + { + e.Graphics.FillRoundedRectangle(brush, rect, 4); + } + } + else + { + // 普通项背景 + Color backColor = _isDarkMode ? Color.FromArgb(45, 45, 45) : Color.FromArgb(250, 250, 250); + using (SolidBrush brush = new SolidBrush(backColor)) + { + e.Graphics.FillRectangle(brush, e.Item.ContentRectangle); + } + } + } + + protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) + { + // 菜单背景 + Color backColor = _isDarkMode ? Color.FromArgb(45, 45, 45) : Color.FromArgb(250, 250, 250); + using (SolidBrush brush = new SolidBrush(backColor)) + { + e.Graphics.FillRectangle(brush, e.AffectedBounds); + } + } + + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) + { + // 菜单文本颜色 + e.TextColor = _isDarkMode ? Color.FromArgb(240, 240, 240) : Color.FromArgb(20, 20, 20); + base.OnRenderItemText(e); + } + + protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e) + { + // 分隔线颜色 + Color lineColor = _isDarkMode ? Color.FromArgb(80, 80, 80) : Color.FromArgb(200, 200, 200); + int y = e.Item.Height / 2; + using (Pen pen = new Pen(lineColor)) + { + e.Graphics.DrawLine(pen, 4, y, e.Item.Width - 4, y); + } + } + } + + // 现代菜单颜色表 + private class ModernColorTable : ProfessionalColorTable + { + private bool _isDarkMode; + + public ModernColorTable(bool isDarkMode) + { + _isDarkMode = isDarkMode; + } + + // 菜单项 + public override Color MenuItemSelected => _isDarkMode ? Color.FromArgb(70, 70, 70) : Color.FromArgb(210, 230, 250); + public override Color MenuItemBorder => Color.Transparent; + + // 菜单栏 + public override Color MenuBorder => Color.Transparent; + public override Color MenuItemSelectedGradientBegin => _isDarkMode ? Color.FromArgb(70, 70, 70) : Color.FromArgb(210, 230, 250); + public override Color MenuItemSelectedGradientEnd => _isDarkMode ? Color.FromArgb(70, 70, 70) : Color.FromArgb(210, 230, 250); + public override Color MenuItemPressedGradientBegin => _isDarkMode ? Color.FromArgb(80, 80, 80) : Color.FromArgb(190, 210, 240); + public override Color MenuItemPressedGradientEnd => _isDarkMode ? Color.FromArgb(80, 80, 80) : Color.FromArgb(190, 210, 240); + + // 工具栏 + public override Color ToolStripDropDownBackground => _isDarkMode ? Color.FromArgb(45, 45, 45) : Color.FromArgb(250, 250, 250); + public override Color ImageMarginGradientBegin => _isDarkMode ? Color.FromArgb(45, 45, 45) : Color.FromArgb(250, 250, 250); + public override Color ImageMarginGradientMiddle => _isDarkMode ? Color.FromArgb(45, 45, 45) : Color.FromArgb(250, 250, 250); + public override Color ImageMarginGradientEnd => _isDarkMode ? Color.FromArgb(45, 45, 45) : Color.FromArgb(250, 250, 250); } // 调整图标大小 @@ -339,6 +704,7 @@ namespace QuickLauncher { settings.LastSelectedCategory = currentCategory; settings.IconSize = iconSize; + settings.LeftPanelWidth = leftPanel.Width; var options = new JsonSerializerOptions { WriteIndented = true @@ -362,6 +728,7 @@ namespace QuickLauncher var json = File.ReadAllText(settingsFilePath); settings = JsonSerializer.Deserialize(json) ?? new AppSettings(); iconSize = settings.IconSize; // 加载保存的图标大小 + leftPanel.Width = settings.LeftPanelWidth; } catch { @@ -448,9 +815,107 @@ namespace QuickLauncher private void InitializeUI() { + // 初始化数据 categories = new Dictionary>(); + + // 设置窗体样式 + this.FormBorderStyle = FormBorderStyle.Sizable; + this.MinimumSize = new Size(800, 600); + + // 设置控件样式 + addButton.FlatStyle = FlatStyle.Flat; + addButton.FlatAppearance.BorderSize = 0; + addButton.BackColor = accentColor; + addButton.ForeColor = Color.White; + addButton.Font = new Font("Microsoft YaHei UI", 10, FontStyle.Regular); + + // 设置分类标签样式 + categoryLabel.Font = new Font("Microsoft YaHei UI", 11); + categoryLabel.ForeColor = isDarkMode ? Color.Black : Color.White; + + // 创建左侧面板调整手柄 + CreateResizeHandle(); + + // 刷新分类列表 RefreshCategoryList(); } + + // 创建左侧面板调整手柄 + private void CreateResizeHandle() + { + // 创建调整手柄 + resizeHandle = new Panel + { + Width = 5, + Dock = DockStyle.Right, + Cursor = Cursors.SizeWE, + BackColor = Color.Transparent + }; + + // 添加鼠标事件 + resizeHandle.MouseDown += ResizeHandle_MouseDown; + resizeHandle.MouseMove += ResizeHandle_MouseMove; + resizeHandle.MouseUp += ResizeHandle_MouseUp; + + // 添加到左侧面板 + leftPanel.Controls.Add(resizeHandle); + resizeHandle.BringToFront(); + } + + // 调整手柄鼠标按下事件 + private void ResizeHandle_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + isResizing = true; + resizingStartX = e.X; + initialPanelWidth = leftPanel.Width; + + // 捕获鼠标 + resizeHandle.Capture = true; + } + } + + // 调整手柄鼠标移动事件 + private void ResizeHandle_MouseMove(object sender, MouseEventArgs e) + { + if (isResizing) + { + // 计算新宽度 + int newWidth = initialPanelWidth + (e.X - resizingStartX); + + // 限制宽度范围 + if (newWidth < MIN_PANEL_WIDTH) + newWidth = MIN_PANEL_WIDTH; + else if (newWidth > MAX_PANEL_WIDTH) + newWidth = MAX_PANEL_WIDTH; + + // 设置新宽度 + leftPanel.Width = newWidth; + + // 刷新布局 + this.PerformLayout(); + + // 刷新分类列表,以适应新宽度 + RefreshCategoryList(); + } + } + + // 调整手柄鼠标释放事件 + private void ResizeHandle_MouseUp(object sender, MouseEventArgs e) + { + if (isResizing) + { + isResizing = false; + + // 释放鼠标捕获 + resizeHandle.Capture = false; + + // 保存设置 + settings.LeftPanelWidth = leftPanel.Width; + SaveSettings(); + } + } private void AddCategory_Click(object sender, EventArgs e) { @@ -462,10 +927,32 @@ namespace QuickLauncher dialog.FormBorderStyle = FormBorderStyle.FixedDialog; dialog.MaximizeBox = false; dialog.MinimizeBox = false; + dialog.BackColor = isDarkMode ? Color.FromArgb(32, 32, 32) : Color.FromArgb(243, 243, 243); + dialog.ForeColor = isDarkMode ? Color.White : Color.Black; - var label = new Label() { Text = "分类名称:", Location = new Point(10, 20) }; - var textBox = new TextBox() { Location = new Point(120, 17), Width = 180 }; - var button = new Button() { Text = "确定", DialogResult = DialogResult.OK, Location = new Point(110, 60) }; + var label = new Label() { + Text = "分类名称:", + Location = new Point(10, 20), + ForeColor = isDarkMode ? Color.White : Color.Black + }; + + var textBox = new TextBox() { + Location = new Point(120, 17), + Width = 180, + BackColor = isDarkMode ? Color.FromArgb(45, 45, 45) : Color.White, + ForeColor = isDarkMode ? Color.White : Color.Black + }; + + var button = new RoundedButton() { + Text = "确定", + DialogResult = DialogResult.OK, + Location = new Point(110, 60), + Width = 100, + Height = 30, + BackColor = Color.FromArgb(210, 210, 210, 200), // 自定义RGB颜色 + ForeColor = Color.FromArgb(40, 40, 40), + CornerRadius = cornerRadius + }; dialog.Controls.AddRange(new Control[] { label, textBox, button }); dialog.AcceptButton = button; @@ -510,38 +997,44 @@ namespace QuickLauncher currentCategory = categories.Keys.First(); ShowCategoryItems(currentCategory); } - else - { - // 如果没有分类了,清空右侧面板和标签 - shortcutsPanel.Controls.Clear(); - categoryLabel.Text = "当前分类: 无"; - } } } private void RefreshCategoryList() { + // 如果categories为空,直接返回 + if (categories == null) + return; + leftPanel.Controls.Clear(); int buttonY = 10; foreach (var category in categories.Keys) { - var categoryPanel = new Panel + var categoryPanel = new RoundedPanel { Width = leftPanel.Width - 5, Height = CATEGORY_BUTTON_HEIGHT, - Location = new Point(0, buttonY) + Location = new Point(0, buttonY), + CornerRadius = cornerRadius }; - var btn = new Button + var btn = new RoundedButton { Text = category, Width = leftPanel.Width - 20, Height = CATEGORY_BUTTON_HEIGHT, Location = new Point(10, 0), FlatStyle = FlatStyle.Flat, - BackColor = Color.FromArgb(200, 255, 200), - Tag = category + BackColor = category == currentCategory ? + accentColor : + (isDarkMode ? Color.FromArgb(60, 60, 60) : Color.FromArgb(230, 230, 230)), + ForeColor = category == currentCategory ? + Color.White : + (isDarkMode ? Color.FromArgb(240, 240, 240) : Color.FromArgb(20, 20, 20)), + Tag = category, + CornerRadius = cornerRadius, + FlatAppearance = { BorderSize = 0 } }; // 移除旧的事件处理器 @@ -622,13 +1115,14 @@ namespace QuickLauncher int panelWidth = Math.Max(80, iconSize + 10); int panelHeight = iconSize + 60; - var panel = new Panel + var panel = new RoundedPanel { Width = panelWidth, Height = panelHeight, Margin = new Padding(5), Tag = item, - BackColor = Color.Transparent // 初始背景色为透明 + BackColor = isDarkMode ? Color.FromArgb(50, 50, 50) : Color.FromArgb(245, 245, 245), + CornerRadius = cornerRadius }; var icon = new PictureBox @@ -650,7 +1144,8 @@ namespace QuickLauncher Height = 30, Location = new Point(0, iconSize + 10), Tag = item, - Cursor = Cursors.Hand // 鼠标悬停时显示手型光标 + Cursor = Cursors.Hand, // 鼠标悬停时显示手型光标 + ForeColor = isDarkMode ? Color.FromArgb(240, 240, 240) : Color.FromArgb(20, 20, 20) }; panel.Controls.Add(icon); @@ -688,11 +1183,6 @@ namespace QuickLauncher label.MouseEnter += Panel_MouseEnter; label.MouseLeave += Panel_MouseLeave; - // 移除鼠标移动事件,避免频繁触发 - // panel.MouseMove += (s, e) => Panel_MouseEnter(s, e); - // icon.MouseMove += (s, e) => Panel_MouseEnter(s, e); - // label.MouseMove += (s, e) => Panel_MouseEnter(s, e); - // 添加鼠标点击效果 panel.MouseDown += Panel_MouseDown; panel.MouseUp += Panel_MouseUp; @@ -713,104 +1203,68 @@ namespace QuickLauncher // 鼠标进入面板时的效果 private void Panel_MouseEnter(object sender, EventArgs e) { - if (sender is Control control) + if (sender is Control control && control.Parent is RoundedPanel panel) { - // 获取父面板 - Panel panel = control as Panel; - if (panel == null && control.Parent is Panel) + // 应用悬停效果 + panel.BackColor = isDarkMode ? Color.FromArgb(70, 70, 70) : Color.FromArgb(230, 230, 230); + + // 显示工具提示 + if (panel.Tag is ShortcutItem item) { - panel = control.Parent as Panel; - } - - if (panel != null) - { - // 高亮显示 - panel.BackColor = Color.FromArgb(230, 230, 255); // 浅蓝色背景 - panel.BorderStyle = BorderStyle.FixedSingle; // 显示边框 - - // 显示工具提示 - if (panel.Tag is ShortcutItem item) - { - string tipText = $"名称: {item.Name}\n路径: {item.Path}\n双击启动"; - - // 为当前控件设置工具提示 - if (control is PictureBox || control is Label) - { - toolTip1.SetToolTip(control, tipText); - } - else - { - toolTip1.SetToolTip(panel, tipText); - } - } + toolTip1.SetToolTip(panel, $"名称: {item.Name}\n路径: {item.Path}\n添加时间: {item.DateAdded.ToString("yyyy-MM-dd")}\n使用次数: {item.UsageCount}"); + toolTip1.SetToolTip(control, $"名称: {item.Name}\n路径: {item.Path}\n添加时间: {item.DateAdded.ToString("yyyy-MM-dd")}\n使用次数: {item.UsageCount}"); } } + else if (sender is RoundedPanel directPanel && directPanel.Tag is ShortcutItem directItem) + { + // 直接是面板的情况 + directPanel.BackColor = isDarkMode ? Color.FromArgb(70, 70, 70) : Color.FromArgb(230, 230, 230); + toolTip1.SetToolTip(directPanel, $"名称: {directItem.Name}\n路径: {directItem.Path}\n添加时间: {directItem.DateAdded.ToString("yyyy-MM-dd")}\n使用次数: {directItem.UsageCount}"); + } } // 鼠标离开面板时的效果 private void Panel_MouseLeave(object sender, EventArgs e) { - if (sender is Control control) + if (sender is Control control && control.Parent is RoundedPanel panel) { - // 获取父面板 - Panel panel = control as Panel; - if (panel == null && control.Parent is Panel) - { - panel = control.Parent as Panel; - } - - if (panel != null) - { - // 恢复正常显示 - panel.BackColor = Color.Transparent; - panel.BorderStyle = BorderStyle.None; - } + // 恢复正常颜色 + panel.BackColor = isDarkMode ? Color.FromArgb(50, 50, 50) : Color.FromArgb(245, 245, 245); + } + else if (sender is RoundedPanel directPanel) + { + // 直接是面板的情况 + directPanel.BackColor = isDarkMode ? Color.FromArgb(50, 50, 50) : Color.FromArgb(245, 245, 245); } } // 鼠标按下时的效果 private void Panel_MouseDown(object sender, MouseEventArgs e) { - if (e.Button == MouseButtons.Left) // 只对左键点击响应 + if (sender is Control control && control.Parent is RoundedPanel panel) { - if (sender is Control control) - { - // 获取父面板 - Panel panel = control as Panel; - if (panel == null && control.Parent is Panel) - { - panel = control.Parent as Panel; - } - - if (panel != null) - { - // 点击效果 - 深色背景 - panel.BackColor = Color.FromArgb(180, 180, 240); // 更深的蓝色 - } - } + // 应用按下效果 + panel.BackColor = isDarkMode ? Color.FromArgb(90, 90, 90) : Color.FromArgb(210, 210, 210); + } + else if (sender is RoundedPanel directPanel) + { + // 直接是面板的情况 + directPanel.BackColor = isDarkMode ? Color.FromArgb(90, 90, 90) : Color.FromArgb(210, 210, 210); } } // 鼠标释放时的效果 private void Panel_MouseUp(object sender, MouseEventArgs e) { - if (e.Button == MouseButtons.Left) // 只对左键点击响应 + if (sender is Control control && control.Parent is RoundedPanel panel) { - if (sender is Control control) - { - // 获取父面板 - Panel panel = control as Panel; - if (panel == null && control.Parent is Panel) - { - panel = control.Parent as Panel; - } - - if (panel != null) - { - // 恢复悬停效果 - panel.BackColor = Color.FromArgb(230, 230, 255); - } - } + // 恢复悬停颜色 + panel.BackColor = isDarkMode ? Color.FromArgb(70, 70, 70) : Color.FromArgb(230, 230, 230); + } + else if (sender is RoundedPanel directPanel) + { + // 直接是面板的情况 + directPanel.BackColor = isDarkMode ? Color.FromArgb(70, 70, 70) : Color.FromArgb(230, 230, 230); } } @@ -960,6 +1414,13 @@ namespace QuickLauncher public DateTime DateAdded { get; set; } = DateTime.Now; public DateTime LastUsed { get; set; } = DateTime.MinValue; public int UsageCount { get; set; } = 0; + public string Description { get; set; } = ""; // 添加描述属性 + public string Arguments { get; set; } = ""; // 添加启动参数 + public bool RunAsAdmin { get; set; } = false; // 是否以管理员身份运行 + public string Category { get; set; } = ""; // 所属分类 + public string CustomIconPath { get; set; } = ""; // 自定义图标路径 + public string BackgroundColor { get; set; } = ""; // 自定义背景色 + public int SortOrder { get; set; } = 0; // 排序顺序 // 用于序列化的构造函数 public ShortcutItem() @@ -971,6 +1432,25 @@ namespace QuickLauncher { try { + // 如果有自定义图标,优先使用自定义图标 + if (!string.IsNullOrEmpty(CustomIconPath) && File.Exists(CustomIconPath)) + { + try + { + // 尝试加载自定义图标 + using (System.Drawing.Icon customIcon = new System.Drawing.Icon(CustomIconPath)) + { + Icon = customIcon.ToBitmap(); + return; + } + } + catch + { + // 如果自定义图标加载失败,继续使用默认图标 + } + } + + // 使用关联图标 if (File.Exists(Path)) { using (System.Drawing.Icon icon = System.Drawing.Icon.ExtractAssociatedIcon(Path)) @@ -995,5 +1475,105 @@ namespace QuickLauncher Icon = SystemIcons.Application.ToBitmap(); } } + + // 获取格式化的最后使用时间 + public string GetFormattedLastUsed() + { + if (LastUsed == DateTime.MinValue) + return "从未使用"; + + TimeSpan span = DateTime.Now - LastUsed; + + if (span.TotalDays > 365) + return $"{Math.Floor(span.TotalDays / 365)}年前"; + if (span.TotalDays > 30) + return $"{Math.Floor(span.TotalDays / 30)}个月前"; + if (span.TotalDays > 1) + return $"{Math.Floor(span.TotalDays)}天前"; + if (span.TotalHours > 1) + return $"{Math.Floor(span.TotalHours)}小时前"; + if (span.TotalMinutes > 1) + return $"{Math.Floor(span.TotalMinutes)}分钟前"; + + return "刚刚"; + } + + // 获取背景颜色 + public Color GetBackgroundColor(bool isDarkMode) + { + // 如果有自定义背景色,尝试解析 + if (!string.IsNullOrEmpty(BackgroundColor)) + { + try + { + // 尝试解析颜色字符串,格式为 R,G,B + string[] parts = BackgroundColor.Split(','); + if (parts.Length == 3 && + int.TryParse(parts[0], out int r) && + int.TryParse(parts[1], out int g) && + int.TryParse(parts[2], out int b)) + { + return Color.FromArgb(r, g, b); + } + } + catch + { + // 解析失败,使用默认颜色 + } + } + + // 返回默认颜色 + return isDarkMode ? Color.FromArgb(50, 50, 50) : Color.FromArgb(245, 245, 245); + } + } + + // 添加GDI+扩展方法 + public static class GraphicsExtensions + { + public static void FillRoundedRectangle(this Graphics graphics, Brush brush, Rectangle bounds, int cornerRadius) + { + if (graphics == null) + throw new ArgumentNullException("graphics"); + if (brush == null) + throw new ArgumentNullException("brush"); + + using (GraphicsPath path = CreateRoundedRectangle(bounds, cornerRadius)) + { + graphics.FillPath(brush, path); + } + } + + public static void DrawRoundedRectangle(this Graphics graphics, Pen pen, Rectangle bounds, int cornerRadius) + { + if (graphics == null) + throw new ArgumentNullException("graphics"); + if (pen == null) + throw new ArgumentNullException("pen"); + + using (GraphicsPath path = CreateRoundedRectangle(bounds, cornerRadius)) + { + graphics.DrawPath(pen, path); + } + } + + private static GraphicsPath CreateRoundedRectangle(Rectangle bounds, int cornerRadius) + { + GraphicsPath path = new GraphicsPath(); + + if (cornerRadius > 0) + { + path.AddArc(bounds.X, bounds.Y, cornerRadius * 2, cornerRadius * 2, 180, 90); + path.AddArc(bounds.Right - cornerRadius * 2, bounds.Y, cornerRadius * 2, cornerRadius * 2, 270, 90); + path.AddArc(bounds.Right - cornerRadius * 2, bounds.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90); + path.AddArc(bounds.X, bounds.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90); + path.CloseFigure(); + } + else + { + path.AddRectangle(bounds); + } + + return path; + } } } \ No newline at end of file diff --git a/MainForm.resx b/MainForm.resx index 3fa4062..d68d9a3 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -120,6 +120,9 @@ 17, 17 + + 25 + diff --git a/Program.cs b/Program.cs index 74f1c3d..daf1359 100644 --- a/Program.cs +++ b/Program.cs @@ -1,3 +1,6 @@ +using System; +using System.Windows.Forms; + namespace QuickLauncher { internal static class Program @@ -5,6 +8,11 @@ namespace QuickLauncher [STAThread] static void Main() { + // 启用高DPI支持 + Application.SetHighDpiMode(HighDpiMode.PerMonitorV2); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + ApplicationConfiguration.Initialize(); Application.Run(new MainForm()); } diff --git a/bin/Debug/net6.0-windows/QuickLauncher.dll b/bin/Debug/net6.0-windows/QuickLauncher.dll index c20e847..b7ee2e8 100644 Binary files a/bin/Debug/net6.0-windows/QuickLauncher.dll and b/bin/Debug/net6.0-windows/QuickLauncher.dll differ diff --git a/bin/Debug/net6.0-windows/QuickLauncher.exe b/bin/Debug/net6.0-windows/QuickLauncher.exe index 53302a9..2eaffe8 100644 Binary files a/bin/Debug/net6.0-windows/QuickLauncher.exe and b/bin/Debug/net6.0-windows/QuickLauncher.exe differ diff --git a/bin/Debug/net6.0-windows/QuickLauncher.pdb b/bin/Debug/net6.0-windows/QuickLauncher.pdb index 0b20e50..436d8cf 100644 Binary files a/bin/Debug/net6.0-windows/QuickLauncher.pdb and b/bin/Debug/net6.0-windows/QuickLauncher.pdb differ diff --git a/bin/Debug/net6.0-windows/settings.json b/bin/Debug/net6.0-windows/settings.json index c88cc22..f5ad392 100644 --- a/bin/Debug/net6.0-windows/settings.json +++ b/bin/Debug/net6.0-windows/settings.json @@ -1,5 +1,6 @@ { - "LastSelectedCategory": "\u65B0AZ", + "LastSelectedCategory": "\u52A0\u5DE5\u5382\u4E8C\u7EF4\u7801", "SortMode": "UsageCount", - "IconSize": 256 + "IconSize": 192, + "LeftPanelWidth": 300 } \ No newline at end of file diff --git a/bin/Debug/net6.0-windows/shortcuts.json b/bin/Debug/net6.0-windows/shortcuts.json index ad4186c..b36fbe3 100644 --- a/bin/Debug/net6.0-windows/shortcuts.json +++ b/bin/Debug/net6.0-windows/shortcuts.json @@ -5,28 +5,72 @@ "Path": "I:\\Desktop\\Gitea\\4\u3001Game_wow335.lnk", "DateAdded": "2025-03-12T13:58:03.3149744+08:00", "LastUsed": "2025-03-12T13:58:39.6693652+08:00", - "UsageCount": 1 + "UsageCount": 1, + "Description": "", + "Arguments": "", + "RunAsAdmin": false, + "Category": "", + "CustomIconPath": "", + "BackgroundColor": "", + "SortOrder": 0 }, { "Name": "1\u3001AzerothCore.sln", "Path": "I:\\Desktop\\Gitea\\1\u3001AzerothCore.sln.lnk", "DateAdded": "2025-03-12T13:58:03.3249607+08:00", "LastUsed": "0001-01-01T00:00:00", - "UsageCount": 0 + "UsageCount": 0, + "Description": "", + "Arguments": "", + "RunAsAdmin": false, + "Category": "", + "CustomIconPath": "", + "BackgroundColor": "", + "SortOrder": 0 }, { "Name": "2\u3001\u542F\u52A8MYSQL.bat", "Path": "I:\\Desktop\\Gitea\\2\u3001\u542F\u52A8MYSQL.bat.lnk", "DateAdded": "2025-03-12T13:58:03.2453763+08:00", "LastUsed": "0001-01-01T00:00:00", - "UsageCount": 0 + "UsageCount": 0, + "Description": "", + "Arguments": "", + "RunAsAdmin": false, + "Category": "", + "CustomIconPath": "", + "BackgroundColor": "", + "SortOrder": 0 }, { "Name": "3\u3001navicat.exe", "Path": "I:\\Desktop\\Gitea\\3\u3001navicat.exe.lnk", "DateAdded": "2025-03-12T13:58:03.3022567+08:00", "LastUsed": "0001-01-01T00:00:00", - "UsageCount": 0 + "UsageCount": 0, + "Description": "", + "Arguments": "", + "RunAsAdmin": false, + "Category": "", + "CustomIconPath": "", + "BackgroundColor": "", + "SortOrder": 0 + } + ], + "\u52A0\u5DE5\u5382\u4E8C\u7EF4\u7801": [ + { + "Name": "\u4FE1\u8FBE2-\u53EF\u4FE1\u7528\u5361", + "Path": "I:\\Desktop\\\u4FE1\u8FBE2-\u53EF\u4FE1\u7528\u5361.png", + "DateAdded": "2025-03-12T15:17:11.1548557+08:00", + "LastUsed": "2025-03-12T15:17:11.792405+08:00", + "UsageCount": 1, + "Description": "", + "Arguments": "", + "RunAsAdmin": false, + "Category": "", + "CustomIconPath": "", + "BackgroundColor": "", + "SortOrder": 0 } ] } \ No newline at end of file diff --git a/obj/Debug/net6.0-windows/QuickLauncher.AssemblyInfo.cs b/obj/Debug/net6.0-windows/QuickLauncher.AssemblyInfo.cs index e924174..38c50a2 100644 --- a/obj/Debug/net6.0-windows/QuickLauncher.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/QuickLauncher.AssemblyInfo.cs @@ -14,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("QuickLauncher")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+dfabe611babba8844f162e98c8792e2a13520af3")] [assembly: System.Reflection.AssemblyProductAttribute("QuickLauncher")] [assembly: System.Reflection.AssemblyTitleAttribute("QuickLauncher")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/QuickLauncher.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/QuickLauncher.AssemblyInfoInputs.cache index ce1eb3e..c4af020 100644 --- a/obj/Debug/net6.0-windows/QuickLauncher.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/QuickLauncher.AssemblyInfoInputs.cache @@ -1 +1 @@ -c6eb8c2f43ebdcdca383a66315f5396dd3847e53f909e5e7ec32d85eac2a583a +9cb870a752e15f8ff483883e472772a888ce5f82b77ac18b8bc3f6d8ad6869c1 diff --git a/obj/Debug/net6.0-windows/QuickLauncher.csproj.GenerateResource.cache b/obj/Debug/net6.0-windows/QuickLauncher.csproj.GenerateResource.cache index c4d350e..775ee62 100644 Binary files a/obj/Debug/net6.0-windows/QuickLauncher.csproj.GenerateResource.cache and b/obj/Debug/net6.0-windows/QuickLauncher.csproj.GenerateResource.cache differ diff --git a/obj/Debug/net6.0-windows/QuickLauncher.dll b/obj/Debug/net6.0-windows/QuickLauncher.dll index c20e847..b7ee2e8 100644 Binary files a/obj/Debug/net6.0-windows/QuickLauncher.dll and b/obj/Debug/net6.0-windows/QuickLauncher.dll differ diff --git a/obj/Debug/net6.0-windows/QuickLauncher.pdb b/obj/Debug/net6.0-windows/QuickLauncher.pdb index 0b20e50..436d8cf 100644 Binary files a/obj/Debug/net6.0-windows/QuickLauncher.pdb and b/obj/Debug/net6.0-windows/QuickLauncher.pdb differ diff --git a/obj/Debug/net6.0-windows/apphost.exe b/obj/Debug/net6.0-windows/apphost.exe index 53302a9..2eaffe8 100644 Binary files a/obj/Debug/net6.0-windows/apphost.exe and b/obj/Debug/net6.0-windows/apphost.exe differ diff --git a/obj/Debug/net6.0-windows/ref/QuickLauncher.dll b/obj/Debug/net6.0-windows/ref/QuickLauncher.dll index 2b15f51..b4b6b58 100644 Binary files a/obj/Debug/net6.0-windows/ref/QuickLauncher.dll and b/obj/Debug/net6.0-windows/ref/QuickLauncher.dll differ diff --git a/obj/Debug/net6.0-windows/refint/QuickLauncher.dll b/obj/Debug/net6.0-windows/refint/QuickLauncher.dll index 2b15f51..b4b6b58 100644 Binary files a/obj/Debug/net6.0-windows/refint/QuickLauncher.dll and b/obj/Debug/net6.0-windows/refint/QuickLauncher.dll differ