GMenuItem.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:14k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: GMenuItem.cs,v 1.2 2005/04/20 08:45:46 okajima Exp $
  4. *
  5. *  this source code originats in OfficeMenu component by Mohammed Halabi
  6. */
  7. using System;
  8. using System.Windows.Forms;
  9. using System.Drawing;
  10. using System.Drawing.Text;
  11. using System.Drawing.Drawing2D;
  12. using System.Drawing.Imaging;
  13. using System.Diagnostics;
  14. using System.Text;
  15. namespace Poderosa.UI
  16. {
  17. public abstract class GMenuItemBase : MenuItem {
  18. protected int _id;
  19. protected Keys _shortcut;
  20. public GMenuItemBase() {
  21. _shortcut = Keys.None;
  22. base.OwnerDraw = true;
  23. }
  24. public GMenuItemBase(GMenuItemBase mi) {
  25. CloneMenu(mi);
  26. _shortcut = Keys.None;
  27. base.OwnerDraw = true;
  28. }
  29. public Keys ShortcutKey {
  30. get {
  31. return _shortcut;
  32. }
  33. set {
  34. _shortcut = value;
  35. }
  36. }
  37. public int CID {
  38. get {
  39. return _id;
  40. }
  41. set {
  42. _id = value;
  43. }
  44. }
  45. protected class Consts {
  46. public static int PIC_AREA_SIZE = 24;
  47. public static int MIN_MENU_HEIGHT = 22;
  48. public static Font menuFont = System.Windows.Forms.SystemInformation.MenuFont; 
  49. public static Color CheckBoxColor = Color.FromArgb(255, 192, 111);
  50. public static Color DarkCheckBoxColor = Color.FromArgb(254, 128, 62);
  51. public static Color SelectionColor = Color.FromArgb(255,238,194);
  52. public static Color TextColor = Color.FromKnownColor(KnownColor.MenuText);
  53. public static Color TextDisabledColor = Color.FromKnownColor(KnownColor.GrayText);
  54. public static Color MenuBgColor = Color.White;
  55. public static Color MainColor = Color.FromKnownColor(KnownColor.Control);
  56. public static Color MenuDarkColor = Color.FromKnownColor(KnownColor.ActiveCaption);
  57. public static Color MenuLightColor = Color.FromKnownColor(KnownColor.ControlDark); //InactiveCaption
  58. public static Color MenuDarkColor2 = Color.FromArgb(160, Color.FromKnownColor(KnownColor.ActiveCaption));
  59. public static Color MenuLightColor2 = Color.FromArgb(40, Color.FromKnownColor(KnownColor.InactiveCaption));
  60. }
  61. }
  62. public class GMainMenuItem : GMenuItemBase {
  63. private static SolidBrush _mainBrush = new SolidBrush(Consts.MainColor);
  64. private static Pen        _mainPen   = new Pen(Consts.MainColor);
  65. private static SolidBrush _textBrush = new SolidBrush(Consts.TextColor);
  66. protected override void OnMeasureItem(MeasureItemEventArgs e) {
  67. string miText = this.Text.Replace("&","");
  68. SizeF miSize = e.Graphics.MeasureString(miText, Consts.menuFont);
  69. e.ItemWidth = Convert.ToInt32(miSize.Width);
  70. }
  71. protected override void OnDrawItem(DrawItemEventArgs e) {
  72. base.OnDrawItem(e);
  73. // Draw the main menu item
  74. DrawMenuItem(e);
  75. }
  76. public void DrawMenuItem(DrawItemEventArgs e) {
  77. // Check the state of the menuItem
  78. if ( (e.State & DrawItemState.HotLight) == DrawItemState.HotLight ) {
  79. // Draw Hover rectangle
  80. DrawHoverRect(e);
  81. else if ( (e.State & DrawItemState.Selected) == DrawItemState.Selected ) {
  82. // Draw selection rectangle
  83. DrawSelectionRect(e);
  84. } else {
  85. // if no selection, just draw space
  86. Rectangle rect = new Rectangle(e.Bounds.X, 
  87. e.Bounds.Y, 
  88. e.Bounds.Width, 
  89. e.Bounds.Height -1);
  90. e.Graphics.FillRectangle(_mainBrush, rect);
  91. e.Graphics.DrawRectangle(_mainPen, rect);
  92. }
  93. // Create stringFormat object
  94. StringFormat sf = new StringFormat();
  95. // set the Alignment to center
  96. sf.LineAlignment = StringAlignment.Center;
  97. sf.Alignment = StringAlignment.Center;
  98. sf.HotkeyPrefix = HotkeyPrefix.Show;
  99. // Draw the text
  100. e.Graphics.DrawString(this.Text, 
  101. Consts.menuFont, 
  102. _textBrush, 
  103. e.Bounds, 
  104. sf);
  105. }
  106. private void DrawHoverRect(DrawItemEventArgs e) {
  107. // Create the hover rectangle
  108. Rectangle rect = new Rectangle(e.Bounds.X, 
  109. e.Bounds.Y + 1, 
  110. e.Bounds.Width, 
  111. e.Bounds.Height - 2);
  112. // Create the hover brush
  113. Brush b = new LinearGradientBrush(rect, 
  114. Color.White, 
  115. Consts.CheckBoxColor,
  116. 90f, false);
  117. // Fill the rectangle
  118. e.Graphics.FillRectangle(b, rect);
  119. // Draw borders
  120. e.Graphics.DrawRectangle(new Pen(Color.Black), rect);
  121. }
  122. private void DrawSelectionRect(DrawItemEventArgs e) {
  123. // Create the selection rectangle
  124. Rectangle rect = new Rectangle(e.Bounds.X, 
  125. e.Bounds.Y + 1, 
  126. e.Bounds.Width, 
  127. e.Bounds.Height - 2);
  128. // Create the selectino brush
  129. Brush b = new LinearGradientBrush(rect, 
  130. Consts.MenuBgColor, 
  131. Consts.MenuDarkColor2,
  132. 90f, false);
  133. // fill the rectangle
  134. e.Graphics.FillRectangle(b, rect);
  135. // Draw borders
  136. e.Graphics.DrawRectangle(new Pen(Color.Black), rect);
  137. }
  138. }
  139. public class GMenuItem : GMenuItemBase {
  140. protected static SolidBrush _menuBgBrush = new SolidBrush(Consts.MenuBgColor);
  141. protected static SolidBrush _textBrush   = new SolidBrush(Consts.TextColor);
  142. protected static SolidBrush _textDisabledBrush = new SolidBrush(Consts.TextDisabledColor);
  143. protected static SolidBrush _selectionBrush = new SolidBrush(Consts.SelectionColor);
  144. protected static Pen _menuDarkPen = new Pen(Consts.MenuDarkColor);
  145. protected static Pen _menuLightPen = new Pen(Consts.MenuLightColor);
  146. public GMenuItem() {
  147. }
  148. public GMenuItem(GMenuItem mi) : base(mi) {
  149. }
  150. public override MenuItem CloneMenu() {
  151. GMenuItem mi = new GMenuItem(this);
  152. mi._shortcut = _shortcut;
  153. mi.Visible = this.Visible;
  154. mi.Enabled = this.Enabled;
  155. mi.CID = this.CID;
  156. return mi;
  157. }
  158. protected override void OnMeasureItem(MeasureItemEventArgs e) {
  159. // if the item is a seperator
  160. if ( this.Text == "-" ) {
  161. e.ItemHeight = 7;
  162. e.ItemWidth = 16;
  163. Debug.Assert(this.OwnerDraw);
  164. } else {
  165. string miText = this.Text.Replace("&","");
  166. // get the item's text size
  167. SizeF miSize = e.Graphics.MeasureString(miText, Consts.menuFont);
  168. int scWidth = 0;
  169. // get the short cut width
  170. if (_shortcut != Keys.None ) {
  171. SizeF scSize = e.Graphics.MeasureString(FormatShortcut(_shortcut), Consts.menuFont);
  172. scWidth = Convert.ToInt32(scSize.Width);
  173. }
  174. // set the bounds
  175. int miHeight = Convert.ToInt32(miSize.Height) + 7;
  176. if (miHeight < 25) miHeight = Consts.MIN_MENU_HEIGHT;
  177. e.ItemHeight = miHeight;
  178. e.ItemWidth = Convert.ToInt32(miSize.Width) + scWidth + (Consts.PIC_AREA_SIZE * 2);
  179. }
  180. }
  181. protected override void OnDrawItem(DrawItemEventArgs e) {
  182. // Draw Menu Item
  183. DrawMenuItem(e);
  184. }
  185. public void DrawMenuItem(DrawItemEventArgs e) {
  186. // check to see if the menu item is selected
  187. if ( (e.State & DrawItemState.Selected) == DrawItemState.Selected ) {
  188. // Draw selection rectangle
  189. DrawSelectionRect(e);
  190. } else {
  191. // if no selection, just draw white space
  192. e.Graphics.FillRectangle(_menuBgBrush, e.Bounds);
  193. // Draw the picture area
  194. DrawPictureArea(e);
  195. }
  196. // Draw check box if the menu item is checked
  197. if ( (e.State & DrawItemState.Checked) == DrawItemState.Checked ) {
  198. DrawCheckBox(e);
  199. }
  200. // Draw the menuitem text
  201. DrawMenuText(e);
  202. // Draw the item's picture
  203. DrawItemPicture(e);
  204. }
  205. protected virtual void DrawMenuText(DrawItemEventArgs e) {
  206. Brush textBrush = _textBrush;
  207. // Draw the menu text
  208. // if the menu item is a seperator
  209. if ( this.Text == "-" ) {
  210. // draw seperator line
  211. e.Graphics.DrawLine(_menuLightPen, e.Bounds.X + Consts.PIC_AREA_SIZE + 6, e.Bounds.Y + 2, e.Bounds.Width, e.Bounds.Y + 2);
  212. } else {
  213. // create StringFormat object and set the alignment to center
  214. StringFormat sf = new StringFormat();
  215. sf.LineAlignment = StringAlignment.Center;
  216. sf.HotkeyPrefix = HotkeyPrefix.Show;
  217. // create the rectangle that will hold the text
  218. RectangleF rect = new Rectangle(Consts.PIC_AREA_SIZE + 4, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);
  219. // check the menuitem status
  220. if ( this.Enabled )
  221. textBrush = _textBrush;
  222. else
  223. textBrush = _textDisabledBrush;
  224. // Draw the text
  225. e.Graphics.DrawString(this.Text, Consts.menuFont, textBrush, rect, sf);
  226. // Draw the shortcut text
  227. DrawShortCutText(e);
  228. }
  229. }
  230. private void DrawShortCutText(DrawItemEventArgs e) {
  231. // check to see if there is a short cut for this item
  232. if ( this.ShortcutKey != Keys.None) {
  233. string shortcut_text = FormatShortcut(this.ShortcutKey);
  234. // get the shortcut text size
  235. SizeF scSize = 
  236. e.Graphics.MeasureString(shortcut_text, 
  237. Consts.menuFont);
  238. // Create the text rectangle
  239. Rectangle rect = 
  240. new Rectangle(e.Bounds.Width - Convert.ToInt32(scSize.Width) - 3,
  241. e.Bounds.Y,
  242. Convert.ToInt32(scSize.Width) + 3,
  243. e.Bounds.Height);
  244. // set it to right-to-left, and center it
  245. StringFormat sf = new StringFormat();
  246. //sf.FormatFlags = StringFormatFlags.DirectionRightToLeft;
  247. sf.LineAlignment = StringAlignment.Center;
  248. // draw the text
  249. if ( this.Enabled )
  250. e.Graphics.DrawString(shortcut_text, 
  251. Consts.menuFont, 
  252. _textBrush, 
  253. rect, sf);
  254. else {
  255. // if menuItem is disabled
  256. e.Graphics.DrawString(shortcut_text, 
  257. Consts.menuFont, 
  258. _textDisabledBrush, 
  259. rect, sf);
  260. }
  261. }
  262. }
  263. private void DrawPictureArea(DrawItemEventArgs e) {
  264. // the picture area rectangle
  265. Rectangle rect = new Rectangle(e.Bounds.X - 1, 
  266. e.Bounds.Y, 
  267. Consts.PIC_AREA_SIZE, 
  268. e.Bounds.Height);
  269. // Create Gradient brush, using system colors
  270. Brush b = new LinearGradientBrush(rect, 
  271. Consts.MenuDarkColor2, 
  272. Consts.MenuLightColor2,
  273. 180f, 
  274. false);
  275. // Draw the rect
  276. e.Graphics.FillRectangle(b, rect);
  277. b.Dispose();
  278. }
  279. private void DrawItemPicture(DrawItemEventArgs e) {
  280. const int MAX_PIC_SIZE = 16;
  281. // Get the Item's picture
  282. Image img = null; //OfficeMenus.GetItemPicture(mi);
  283. // check to see if the Item has a picture, if none, Ignore
  284. if ( img != null ) {
  285. // if the size exceeds the maximum picture's size, fix it
  286. int width = img.Width > MAX_PIC_SIZE ? MAX_PIC_SIZE : img.Width;
  287. int height = img.Height > MAX_PIC_SIZE ? MAX_PIC_SIZE : img.Height;
  288. // set the picture coordinates
  289. int x = e.Bounds.X + 2;
  290. int y = e.Bounds.Y + ((e.Bounds.Height - height) / 2);
  291. // create the picture rectangle
  292. Rectangle rect = new Rectangle(x, y, width, height);
  293. // Now check the items state, if enabled just draw the picture
  294. // if not enabled, make a water mark and draw it.
  295. if ( this.Enabled ) {
  296. // draw the image
  297. e.Graphics.DrawImage(img, x, y, width, height);
  298. } else {
  299. // make water mark of the picture
  300. ColorMatrix myColorMatrix = new ColorMatrix();
  301. myColorMatrix.Matrix00 = 1.00f; // Red
  302. myColorMatrix.Matrix11 = 1.00f; // Green
  303. myColorMatrix.Matrix22 = 1.00f; // Blue
  304. myColorMatrix.Matrix33 = 1.30f; // alpha
  305. myColorMatrix.Matrix44 = 1.00f; // w
  306. // Create an ImageAttributes object and set the color matrix.
  307. ImageAttributes imageAttr = new ImageAttributes();
  308. imageAttr.SetColorMatrix(myColorMatrix);
  309. // draw the image
  310. e.Graphics.DrawImage(img,
  311. rect,
  312. 0, 
  313. 0, 
  314. width, 
  315. height, 
  316. GraphicsUnit.Pixel, 
  317. imageAttr);
  318. }
  319. }
  320. }
  321. private void DrawSelectionRect(DrawItemEventArgs e) {
  322. // if the item is not enabled, then do not draw the selection rect
  323. if ( this.Enabled ) {
  324. // fill selection rectangle
  325. e.Graphics.FillRectangle(_selectionBrush, 
  326. e.Bounds);
  327. // Draw borders
  328. e.Graphics.DrawRectangle(_menuDarkPen, 
  329. e.Bounds.X, 
  330. e.Bounds.Y, 
  331. e.Bounds.Width - 1, 
  332. e.Bounds.Height - 1);
  333. }
  334. }
  335. private void DrawCheckBox(DrawItemEventArgs e) {
  336. // Define the CheckBox size
  337. int cbSize = Consts.PIC_AREA_SIZE - 5;
  338. // set the smoothing mode to anti alias
  339. e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
  340. // the main rectangle
  341. Rectangle rect = new Rectangle(e.Bounds.X + 1, 
  342. e.Bounds.Y + ((e.Bounds.Height - cbSize) / 2), 
  343. cbSize, 
  344. cbSize);
  345. // construct the drawing pen
  346. Pen pen = new Pen(Color.Black,1.7f);
  347. // fill the rectangle
  348. if ( (e.State & DrawItemState.Selected) == DrawItemState.Selected )
  349. e.Graphics.FillRectangle(new SolidBrush(Consts.DarkCheckBoxColor), rect);
  350. else
  351. e.Graphics.FillRectangle(new SolidBrush(Consts.CheckBoxColor), rect);
  352. // draw borders
  353. e.Graphics.DrawRectangle(_menuDarkPen, rect);
  354. // Check to see if the menuItem has a picture
  355. // if Yes, Do not draw the check mark; else, Draw it
  356. Bitmap img = null; //OfficeMenus.GetItemPicture(mi);
  357. if ( img == null ) {
  358. // Draw the check mark
  359. e.Graphics.DrawLine(pen, e.Bounds.X + 7, 
  360. e.Bounds.Y + 10, 
  361. e.Bounds.X + 10, 
  362. e.Bounds.Y + 14);
  363. e.Graphics.DrawLine(pen, 
  364. e.Bounds.X + 10, 
  365. e.Bounds.Y + 14, 
  366. e.Bounds.X + 15, 
  367. e.Bounds.Y + 9);
  368. }
  369. }
  370. public static string FormatShortcut(Keys key) {
  371. Keys modifiers = key & Keys.Modifiers;
  372. StringBuilder b = new StringBuilder();
  373. if((modifiers & Keys.Control)!=Keys.None) {
  374. b.Append("Ctrl");
  375. }
  376. if((modifiers & Keys.Shift)!=Keys.None) {
  377. if(b.Length>0) b.Append('+');
  378. b.Append("Shift");
  379. }
  380. if((modifiers & Keys.Alt)!=Keys.None) {
  381. if(b.Length>0) b.Append('+');
  382. b.Append("Alt");
  383. }
  384. if(b.Length>0)
  385. b.Append('+');
  386. b.Append(UILibUtil.KeyString(key & Keys.KeyCode));
  387. return b.ToString();
  388. }
  389. }
  390. }