革博士V2程序
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

285 wiersze
10 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Drawing.Drawing2D;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. namespace GeBoShi.UIKits.MaiMuMenu
  11. {
  12. #region 色彩定义
  13. public class ColorConfig
  14. {
  15. #region 字体
  16. /// <summary>
  17. /// 默认白字
  18. /// </summary>
  19. private Color _fontcolor = Color.White;
  20. /// <summary>
  21. /// 菜单字体颜色
  22. /// </summary>
  23. public Color FontColor
  24. {
  25. get { return this._fontcolor; }
  26. set { this._fontcolor = value; }
  27. }
  28. #endregion
  29. private Color _marginstartcolor = Color.FromArgb(72, 92, 172);
  30. /// <summary>
  31. /// 下拉菜单坐标图标区域开始颜色
  32. /// </summary>
  33. public Color MarginStartColor
  34. {
  35. get { return this._marginstartcolor; }
  36. set { this._marginstartcolor = value; }
  37. }
  38. private Color _marginendcolor = Color.FromArgb(72, 92, 172);
  39. /// <summary>
  40. /// 下拉菜单坐标图标区域结束颜色
  41. /// </summary>
  42. public Color MarginEndColor
  43. {
  44. get { return this._marginendcolor; }
  45. set { this._marginendcolor = value; }
  46. }
  47. #region 下拉项背景
  48. private Color _dropdownitembackcolor = Color.FromArgb(33, 51, 122);
  49. /// <summary>
  50. /// 下拉项背景颜色
  51. /// </summary>
  52. public Color DropDownItemBackColor
  53. {
  54. get { return this._dropdownitembackcolor; }
  55. set { this._dropdownitembackcolor = value; }
  56. }
  57. #endregion
  58. private Color _dropdownitemstartcolor = Color.BlueViolet;
  59. /// <summary>
  60. /// 下拉项选中时开始颜色
  61. /// </summary>
  62. public Color DropDownItemStartColor
  63. {
  64. get { return this._dropdownitemstartcolor; }
  65. set { this._dropdownitemstartcolor = value; }
  66. }
  67. private Color _dorpdownitemendcolor = Color.DarkViolet;
  68. /// <summary>
  69. /// 下拉项选中时结束颜色
  70. /// </summary>
  71. public Color DropDownItemEndColor
  72. {
  73. get { return this._dorpdownitemendcolor; }
  74. set { this._dorpdownitemendcolor = value; }
  75. }
  76. #region 主菜单选中颜色
  77. private Color _menuitemstartcolor = Color.FromArgb(72, 92, 172);
  78. /// <summary>
  79. /// 主菜单项选中时的开始颜色
  80. /// </summary>
  81. public Color MenuItemStartColor
  82. {
  83. get { return this._menuitemstartcolor; }
  84. set { this._menuitemstartcolor = value; }
  85. }
  86. private Color _menuitemendcolor = Color.FromArgb(72, 92, 172);
  87. /// <summary>
  88. /// 主菜单项选中时的结束颜色
  89. /// </summary>
  90. public Color MenuItemEndColor
  91. {
  92. get { return this._menuitemendcolor; }
  93. set { this._menuitemendcolor = value; }
  94. }
  95. #endregion
  96. #region 分割线
  97. private Color _separatorcolor = Color.Gray;
  98. /// <summary>
  99. /// 分割线颜色
  100. /// </summary>
  101. public Color SeparatorColor
  102. {
  103. get { return this._separatorcolor; }
  104. set { this._separatorcolor = value; }
  105. }
  106. #endregion
  107. #region 菜单主背景
  108. private Color _mainmenubackcolor = Color.FromArgb(141, 161, 241);
  109. /// <summary>
  110. /// 主菜单背景色
  111. /// </summary>
  112. public Color MainMenuBackColor
  113. {
  114. get { return this._mainmenubackcolor; }
  115. set { this._mainmenubackcolor = value; }
  116. }
  117. private Color _mainmenustartcolor = Color.FromArgb(141, 161, 241);
  118. /// <summary>
  119. /// 主菜单背景开始颜色
  120. /// </summary>
  121. public Color MainMenuStartColor
  122. {
  123. get { return this._mainmenustartcolor; }
  124. set { this._mainmenustartcolor = value; }
  125. }
  126. private Color _mainmenuendcolor = Color.FromArgb(141, 161, 241);
  127. /// <summary>
  128. /// 主菜单背景结束颜色
  129. /// </summary>
  130. public Color MainMenuEndColor
  131. {
  132. get { return this._mainmenuendcolor; }
  133. set { this._mainmenuendcolor = value; }
  134. }
  135. #endregion
  136. private Color _dropdownborder = Color.FromArgb(40, 96, 151);
  137. /// <summary>
  138. /// 下拉区域边框颜色
  139. /// </summary>
  140. public Color DropDownBorder
  141. {
  142. get { return this._dropdownborder; }
  143. set { this._dropdownborder = value; }
  144. }
  145. }
  146. #endregion
  147. #region ToolStripProfessionalRenderer
  148. public class MaiMuMenuRender : ToolStripProfessionalRenderer
  149. {
  150. ColorConfig colorconfig = new ColorConfig();//创建颜色配置类
  151. /// <summary>
  152. /// 渲染整个背景
  153. /// </summary>
  154. /// <param name="e"></param>
  155. protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
  156. {
  157. e.ToolStrip.ForeColor = colorconfig.FontColor;
  158. //如果是下拉
  159. if (e.ToolStrip is ToolStripDropDown)
  160. {
  161. e.Graphics.FillRectangle(new SolidBrush(colorconfig.DropDownItemBackColor), e.AffectedBounds);
  162. }
  163. //如果是菜单项
  164. else if (e.ToolStrip is MenuStrip)
  165. {
  166. Blend blend = new Blend();
  167. float[] fs = new float[5] { 0f, 0.3f, 0.5f, 0.8f, 1f };
  168. float[] f = new float[5] { 0f, 0.5f, 0.9f, 0.5f, 0f };
  169. blend.Positions = fs;
  170. blend.Factors = f;
  171. FillLineGradient(e.Graphics, e.AffectedBounds, colorconfig.MainMenuStartColor, colorconfig.MainMenuEndColor, 90f, blend);
  172. }
  173. else
  174. {
  175. base.OnRenderToolStripBackground(e);
  176. }
  177. }
  178. /// <summary>
  179. /// 渲染下拉左侧图标区域
  180. /// </summary>
  181. /// <param name="e"></param>
  182. protected override void OnRenderImageMargin(ToolStripRenderEventArgs e)
  183. {
  184. FillLineGradient(e.Graphics, e.AffectedBounds, colorconfig.MarginStartColor, colorconfig.MarginEndColor, 0f, null);
  185. }
  186. /// <summary>
  187. /// 渲染菜单项的背景
  188. /// </summary>
  189. /// <param name="e"></param>
  190. protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
  191. {
  192. if (e.ToolStrip is MenuStrip)
  193. {
  194. //如果被选中或被按下
  195. if (e.Item.Selected || e.Item.Pressed)
  196. {
  197. Blend blend = new Blend();
  198. float[] fs = new float[5] { 0f, 0.3f, 0.5f, 0.8f, 1f };
  199. float[] f = new float[5] { 0f, 0.5f, 1f, 0.5f, 0f };
  200. blend.Positions = fs;
  201. blend.Factors = f;
  202. FillLineGradient(e.Graphics, new Rectangle(0, 0, e.Item.Size.Width, e.Item.Size.Height), colorconfig.MenuItemStartColor, colorconfig.MenuItemEndColor, 90f, blend);
  203. }
  204. else
  205. base.OnRenderMenuItemBackground(e);
  206. }
  207. else if (e.ToolStrip is ToolStripDropDown)
  208. {
  209. if (e.Item.Selected)
  210. {
  211. FillLineGradient(e.Graphics, new Rectangle(0, 0, e.Item.Size.Width, e.Item.Size.Height), colorconfig.DropDownItemStartColor, colorconfig.DropDownItemEndColor, 90f, null);
  212. }
  213. }
  214. else
  215. {
  216. base.OnRenderMenuItemBackground(e);
  217. }
  218. }
  219. /// <summary>
  220. /// 渲染菜单项的分隔线
  221. /// </summary>
  222. /// <param name="e"></param>
  223. protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
  224. {
  225. e.Graphics.DrawLine(new Pen(colorconfig.SeparatorColor), 0, 2, e.Item.Width, 2);
  226. }
  227. /// <summary>
  228. /// 渲染边框
  229. /// </summary>
  230. /// <param name="e"></param>
  231. protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
  232. {
  233. if (e.ToolStrip is ToolStripDropDown)
  234. {
  235. e.Graphics.DrawRectangle(new Pen(colorconfig.DropDownBorder), new Rectangle(0, 0, e.AffectedBounds.Width - 1, e.AffectedBounds.Height - 1));
  236. }
  237. else
  238. {
  239. base.OnRenderToolStripBorder(e);
  240. }
  241. }
  242. /// <summary>
  243. /// 渲染箭头
  244. /// </summary>
  245. /// <param name="e"></param>
  246. protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
  247. {
  248. e.ArrowColor = Color.Red;//设置为红色,当然还可以 画出各种形状
  249. base.OnRenderArrow(e);
  250. }
  251. /// <summary>
  252. /// 填充线性渐变
  253. /// </summary>
  254. /// <param name="g">画布</param>
  255. /// <param name="rect">填充区域</param>
  256. /// <param name="startcolor">开始颜色</param>
  257. /// <param name="endcolor">结束颜色</param>
  258. /// <param name="angle">角度</param>
  259. /// <param name="blend">对象的混合图案</param>
  260. private void FillLineGradient(Graphics g, Rectangle rect, Color startcolor, Color endcolor, float angle, Blend blend)
  261. {
  262. LinearGradientBrush linebrush = new LinearGradientBrush(rect, startcolor, endcolor, angle);
  263. if (blend != null)
  264. {
  265. linebrush.Blend = blend;
  266. }
  267. GraphicsPath path = new GraphicsPath();
  268. path.AddRectangle(rect);
  269. g.SmoothingMode = SmoothingMode.AntiAlias;
  270. g.FillPath(linebrush, path);
  271. }
  272. }
  273. #endregion
  274. }