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

Telnet服务器

开发平台:

C#

  1. /*
  2.  * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3.  * $Id: GButton.cs,v 1.2 2005/04/20 08:45:46 okajima Exp $
  4.  */
  5. using System;
  6. using System.Collections;
  7. using System.ComponentModel;
  8. using System.Drawing;
  9. using System.Windows.Forms;
  10. using System.Diagnostics;
  11. namespace Poderosa.UI
  12. {
  13.     public enum DrawState {
  14.         Normal,
  15.         Disabled,
  16.         Hover,
  17.         Focused
  18.     }
  19.    
  20.     public class GButton : UserControl {
  21. protected bool _mouseDown;
  22. protected bool _mouseEnter;
  23. protected bool _showComboStyle;
  24. protected bool _checked;
  25. protected Image _image;
  26. private const int COMBOAREA_WIDTH = 8;
  27. private BorderStyle _borderstyle;
  28. public new BorderStyle BorderStyle {
  29. get {
  30. return _borderstyle;
  31. }
  32. set {
  33. _borderstyle = value;
  34. }
  35. }
  36. public bool Checked {
  37. get {
  38. return _checked;
  39. }
  40. set {
  41. _checked = value;
  42. }
  43. }
  44. public Image Image {
  45. get {
  46. return _image;
  47. }
  48. set {
  49. _image = value;
  50. }
  51. }
  52. public bool ShowComboStyle {
  53. get {
  54. return _showComboStyle;
  55. }
  56. set {
  57. _showComboStyle = value;
  58. }
  59. }
  60. public GButton() {
  61. SetStyle(ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint|ControlStyles.DoubleBuffer, true);
  62. _borderstyle = BorderStyle.None;
  63. Debug.Assert(!this.InvokeRequired);
  64. }
  65. public void Reset() {
  66. _mouseDown = false;
  67. _mouseEnter = false;
  68. this.Cursor = Cursors.Default;
  69. Debug.Assert(!this.InvokeRequired);
  70. Invalidate();
  71. }
  72. public int BodyWidth {
  73. get {
  74. int w = this.Width;
  75. if(_showComboStyle) w -= COMBOAREA_WIDTH;
  76. return w;
  77. }
  78. }
  79. protected override void OnPaint(PaintEventArgs pe) {
  80. base.OnPaint(pe);
  81. DrawState st;
  82. if(_mouseDown)
  83. st = DrawState.Focused;
  84. else if(_mouseEnter)
  85. st = DrawState.Hover;
  86. else if(this.Enabled)
  87. st = DrawState.Normal;
  88. else
  89. st = DrawState.Disabled;
  90. DrawButtonState(pe.Graphics, st);
  91. }
  92. protected override void OnMouseEnter(EventArgs e) {
  93. try {
  94. base.OnMouseEnter(e);
  95. _mouseEnter = true;
  96. this.Cursor = Cursors.Hand;
  97. Invalidate();
  98. }
  99. catch(Exception ex) {
  100. Debug.WriteLine(ex.StackTrace);
  101. Debugger.Break();
  102. }
  103. }
  104. protected override void OnMouseLeave(EventArgs e) {
  105. try {
  106. base.OnMouseLeave(e);
  107. _mouseEnter = false;
  108. this.Cursor = Cursors.Default;
  109. Invalidate();
  110. }
  111. catch(Exception ex) {
  112. Debug.WriteLine(ex.StackTrace);
  113. Debugger.Break();
  114. }
  115. }
  116. protected override void OnMouseDown(MouseEventArgs e) {
  117. try {
  118. base.OnMouseDown(e);
  119. _mouseDown = true;
  120. Invalidate();
  121. }
  122. catch(Exception ex) {
  123. Debug.WriteLine(ex.StackTrace);
  124. Debugger.Break();
  125. }
  126. }
  127. protected override void OnMouseUp(MouseEventArgs e) {
  128. try {
  129. base.OnMouseUp(e);
  130. _mouseDown = false;
  131. Invalidate();
  132. }
  133. catch(Exception ex) {
  134. Debug.WriteLine(ex.StackTrace);
  135. Debugger.Break();
  136. }
  137. }
  138. protected virtual void DrawButtonState(Graphics g, DrawState state) {
  139. DrawBackground(g, state);
  140. bool has_text = false;
  141. bool has_image = this.Image != null;
  142. int x, y;
  143. if (has_text && !has_image) {
  144. x = BodyWidth / 2;
  145. y = Height / 2;
  146. DrawText(g, Text, state, x, y);
  147. }
  148. else if (has_image && !has_text ) {
  149. x = (BodyWidth - this.Image.Width)/2;
  150. y = (Height - this.Image.Height)/2;
  151. if(_checked) {
  152. x++; y++;
  153. }
  154. DrawImage(g, state, this.Image, x, y);
  155. }
  156. else if(has_image && has_text) {
  157. x = 1;
  158. y = (Height - this.Image.Height)/2;
  159. if(_checked) {
  160. x++; y++;
  161. }
  162. DrawImage(g, state, this.Image, x, y);
  163. x += this.Image.Width + 2;
  164. DrawText(g, this.Text, state, x, y);
  165. }
  166. if(_showComboStyle) {
  167. DrawComboStyleTriangle(g, state);
  168. }
  169. }
  170. protected void DrawBackground(Graphics g, DrawState state) {
  171. Rectangle rc = this.ClientRectangle;
  172. if(_focusedBackgroundBrush==null) CreateBrushes();
  173. if (state == DrawState.Normal || state == DrawState.Disabled) {
  174. g.FillRectangle(_checked? SystemBrushes.ControlLight : SystemBrushes.Control, rc);
  175. if(_checked) {
  176. ControlPaint.DrawBorder3D(g, rc, Border3DStyle.Sunken);
  177. }
  178. else if(_borderstyle!=BorderStyle.None) {
  179. //!!g.FillRectangle(new SolidBrush(this.BackColor), rc);
  180. g.DrawRectangle(state==DrawState.Disabled? SystemPens.ControlDark : SystemPens.ControlDarkDark , rc.Left, rc.Top, rc.Width-1, rc.Height-1);
  181. }
  182. }
  183. else if (state==DrawState.Hover || state==DrawState.Focused) {
  184. if (state==DrawState.Hover)
  185. g.FillRectangle(_hoverBackgroundBrush, rc);
  186. else
  187. g.FillRectangle(_focusedBackgroundBrush, rc);
  188. g.DrawRectangle(SystemPens.Highlight, rc.Left, rc.Top, rc.Width-1, rc.Height-1);
  189. }
  190. }
  191. protected static void DrawImage(Graphics g, DrawState state, Image image, int x, int y) {
  192. if (state == DrawState.Normal)
  193. g.DrawImage(image, x, y, image.Width, image.Height);
  194. else if (state == DrawState.Disabled)
  195. ControlPaint.DrawImageDisabled(g, image, x, y, SystemColors.Control);
  196. else if (state == DrawState.Focused || state == DrawState.Hover) {
  197. ControlPaint.DrawImageDisabled(g, image, x+1, y, SystemColors.Control);
  198. g.DrawImage(image, x-1, y-1, image.Width, image.Height);        
  199. }
  200. }
  201. protected void DrawText(Graphics g, string text, DrawState state, int x, int y) {
  202. if (state==DrawState.Disabled)
  203. g.DrawString(text, this.Font, SystemBrushes.ControlDark, new Point(x, y));
  204. else
  205.           g.DrawString(text, this.Font, SystemBrushes.ControlText, new Point(x, y));
  206. }
  207. protected void DrawComboStyleTriangle(Graphics g, DrawState state) {
  208. Pen p = state==DrawState.Disabled? SystemPens.ControlDark : SystemPens.ControlText;
  209. int x = this.Width - COMBOAREA_WIDTH;
  210. int y = this.Height / 2;
  211. g.DrawLine(p, x,   y-1, x+5, y-1);
  212. g.DrawLine(p, x+1, y  , x+4, y  );
  213. g.DrawLine(p, x+2, y+1, x+3, y+1);
  214. }
  215. private static Brush _focusedBackgroundBrush;
  216. private static Brush _hoverBackgroundBrush;
  217. private static void CreateBrushes() {
  218. _focusedBackgroundBrush = new SolidBrush(ColorUtil.VSNetPressedColor);
  219. _hoverBackgroundBrush = new SolidBrush(ColorUtil.VSNetSelectionColor);
  220. }
  221. }
  222. public class ToggleButton : GButton {
  223. private bool _autoToggle;
  224. public bool AutoToggle {
  225. get {
  226. return _autoToggle;
  227. }
  228. set {
  229. _autoToggle = value;
  230. }
  231. }
  232. protected override void OnMouseUp(MouseEventArgs e) {
  233. base.OnMouseUp(e);
  234. if(_autoToggle)
  235. _checked = !_checked;
  236. }
  237. }
  238. public class TabBarButton : GButton {
  239. private string _headText;
  240. private bool _selected;
  241. private static DrawUtil.RoundRectColors _selectedColors;
  242. private static DrawUtil.RoundRectColors _hoverColors;
  243. public string HeadText {
  244. get {
  245. return _headText;
  246. }
  247. set {
  248. _headText = value;
  249. }
  250. }
  251. public bool Selected {
  252. get {
  253. return _selected;
  254. }
  255. set {
  256. _selected = value;
  257. }
  258. }
  259. public TabBarButton() {
  260. this.BorderStyle = BorderStyle.None;
  261. }
  262. protected override void OnPaint(PaintEventArgs e) {
  263. Graphics g = e.Graphics;
  264. if(_selectedColors==null) CreateColor();
  265. //border
  266. if(_selected)
  267. DrawUtil.DrawRoundRect(g, 0, 0, this.Width-1, this.Height-1, _selectedColors);
  268. else if(_mouseEnter)
  269. DrawUtil.DrawRoundRect(g, 0, 0, this.Width-1, this.Height-1, _hoverColors);
  270. DrawButtonState(g);
  271. }
  272. private void DrawButtonState(Graphics g) {
  273. int x, y;
  274. x = 2;
  275. y = (this.Height - this.Image.Height) / 2;
  276. DrawImage(g, DrawState.Normal, this.Image, x, y);
  277. x += this.Image.Width + 2;
  278. if(_headText!=null) {
  279. g.DrawString(_headText, Font, SystemBrushes.ControlDark, x, y+2);
  280. x += 11; //Should it be configurable?
  281. }
  282. DrawText(g, this.Text, _selected? DrawState.Focused : DrawState.Normal , x, y+2);
  283. }
  284. private static void CreateColor() {
  285. Color c = SystemColors.Control;
  286. c = Color.FromArgb((c.R+255)/2, (c.G+255)/2, (c.B+255)/2); //敀偲偺拞娫傪偲傞
  287. _selectedColors = new DrawUtil.RoundRectColors();
  288. _selectedColors.border_color = DrawUtil.ToCOLORREF(SystemColors.ControlDarkDark);
  289. _selectedColors.inner_color = DrawUtil.ToCOLORREF(c);
  290. _selectedColors.outer_color = DrawUtil.ToCOLORREF(SystemColors.Control);
  291. _selectedColors.lightlight_color = DrawUtil.MergeColor(_selectedColors.border_color, _selectedColors.outer_color);
  292. _selectedColors.light_color = DrawUtil.MergeColor(_selectedColors.lightlight_color, _selectedColors.border_color);
  293. _hoverColors = new DrawUtil.RoundRectColors();
  294. _hoverColors.border_color = DrawUtil.ToCOLORREF(DrawUtil.DarkColor(Color.Orange));
  295. _hoverColors.inner_color = DrawUtil.ToCOLORREF(SystemColors.Control);
  296. _hoverColors.outer_color = DrawUtil.ToCOLORREF(SystemColors.Control);
  297. _hoverColors.lightlight_color = DrawUtil.MergeColor(_hoverColors.border_color, _hoverColors.outer_color);
  298. _hoverColors.light_color = DrawUtil.MergeColor(_hoverColors.lightlight_color, _hoverColors.border_color);
  299. }
  300. }
  301. }