This repository was archived by the owner on Feb 9, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHelperWin32Menu.cs
More file actions
157 lines (139 loc) · 5.41 KB
/
HelperWin32Menu.cs
File metadata and controls
157 lines (139 loc) · 5.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
using LeafFallEngine.Forms;
using ScnScript;
using System.Runtime.InteropServices;
using static LeafFallEngine.Helper.HelperWin32Menu;
namespace LeafFallEngine.Helper
{
/// <summary>
/// 包含创建和管理菜单的Win32 API函数声明的辅助类。
/// </summary>
public static class HelperWin32Menu
{
// 定义Win32 API函数
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr CreateMenu();
[DllImport("user32.dll", SetLastError = true)]
public static extern bool AppendMenu(IntPtr hMenu, uint uFlags, uint uIDNewItem, string lpNewItem);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool TrackPopupMenu(IntPtr hMenu, uint uFlags, int x, int y, int nReserved, IntPtr hWnd, IntPtr prcRect);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool SetMenu(IntPtr hWnd, IntPtr hMenu);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool ModifyMenu(IntPtr hMnu, uint uPosition, uint uFlags, IntPtr uIDNewItem, string lpNewItem);
// 定义菜单项标识符(样式)
public enum MenuItemFlags : uint
{
MF_BYCOMMAND = 0x00000000,
MF_POPUP = 0x00000010,
MF_SEPARATOR = 0x00000800,
MF_STRING = 0x00000000,
MIIM_FTYPE = 0x00000100,
MF_RIGHTJUSTIFY = 0x00004000,
MF_CHECKED = 0x00000008,
MF_RADIOCHECK= 0x00000200,
MF_MENUBREAK= 0x00000040,
MF_MENUBARBREAK= 0x00000020,
MF_RIGHTORDER=0x00002000,
MFS_DISABLED=0x00000003,
MFS_DEFAULT=0x00001000,
MFS_ENABLED=0x00000000,
MFS_HILITE=0x00000080
}
}
/// <summary>
/// 使用Win32 API创建和管理菜单的测试类。
/// </summary>
public static class Win32MenuTest
{
/// <summary>
/// 为给定窗体创建菜单和子菜单。
/// </summary>
/// <param name="form">将添加菜单的窗体。</param>
/// 使用示例:
/// <code>
/// Form form = new Form();
/// Win32MenuTest.TestMenu(form);
/// </code>
public static void TestMenu(Form form)
{
WindowsPlus.EnableDarkModeForWindow(form.Handle, true);
FlowLayoutPanel panel = new FlowLayoutPanel() { Dock=DockStyle.Fill};
Button bt = new Button() { Text = "Logger" };
Button bt2 = new Button() { Text = "Scn" };
ScnLexer lexer = new ScnLexer();
lexer.InputData(Resources.test);
bt.Click += (obj, e) =>
{
new LoggerUI().Show();
};
bt2.Click += (obj, e) =>
{
lexer.LexerAllString();
};
panel.Controls.Add(bt);
panel.Controls.Add(bt2);
form.Controls.Add(panel);
Win32Menu MainMenu = new("MainMenu");
Win32Menu FileMenu = new("Sample");
MainMenu.AddSubMenu(FileMenu, 0);
Win32Menu hMenu = new("Checked");
FileMenu.AddMenuItem(hMenu, MenuItemFlags.MF_CHECKED);
Win32Menu CMenu = new("-");
FileMenu.AddMenuItem(CMenu, MenuItemFlags.MF_SEPARATOR);
Win32Menu RMenu = new("Radio Checked!");
FileMenu.AddMenuItem(RMenu, MenuItemFlags.MF_RADIOCHECK | MenuItemFlags.MF_CHECKED | MenuItemFlags.MFS_DISABLED);
Win32Menu ExitMenu = new("Exit");
FileMenu.AddMenuItem(ExitMenu, 0);
Win32Menu XMenu = new("x");
MainMenu.AddSubMenu(XMenu, MenuItemFlags.MF_RIGHTJUSTIFY);
MainMenu.SetMenuForWindow(form);
Application.Run(form);
}
}
/// <summary>
/// 表示菜单或菜单项的类。
/// </summary>
public class Win32Menu
{
private List<Win32Menu> _SubMenus = new();
private List<Win32Menu> _MenuItems = new();
private string _MenuText = "Menu";
private IntPtr _Id = CreateMenu();
/// <summary>
/// 初始化Win32Menu类的新实例。
/// </summary>
/// <param name="MenuText">此菜单显示的文本。</param>
public Win32Menu(string MenuText)
{
_MenuText = MenuText;
}
/// <summary>
/// 向此菜单添加子菜单。
/// </summary>
/// <param name="menu">要添加的子菜单。</param>
/// <param name="style">子菜单的样式。</param>
public void AddSubMenu(Win32Menu menu, MenuItemFlags style)
{
AppendMenu(_Id, (uint)MenuItemFlags.MF_POPUP | (uint)style, (uint)menu._Id, menu._MenuText);
_SubMenus.Add(menu);
}
/// <summary>
/// 向此菜单添加菜单项。
/// </summary>
/// <param name="menu">要添加的菜单项。</param>
/// <param name="style">菜单项的样式。</param>
public void AddMenuItem(Win32Menu menu, MenuItemFlags style)
{
AppendMenu(_Id, 0 | (uint)style, (uint)menu._Id, menu._MenuText);
_MenuItems.Add(menu);
}
/// <summary>
/// 为给定窗体设置此菜单。
/// </summary>
/// <param name="form">将设置菜单的窗体。</param>
public void SetMenuForWindow(Form form)
{
SetMenu(form.Handle, _Id);
}
}
}