You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

344 lines
11 KiB

  1. #if NETFX || NETCORE
  2. using System;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. namespace Apewer.Surface
  6. {
  7. /// <summary></summary>
  8. public class BlockButton : BaseControl
  9. {
  10. #region definition
  11. private BlockBox _border = new BlockBox();
  12. private BlockLabel _caption = new BlockLabel();
  13. private Color _normaltext = FormsUtility.Black;
  14. private Color _hovertext = FormsUtility.Black;
  15. private Color _lockedtext = FormsUtility.GraceLocked;
  16. #endregion
  17. #region this
  18. private void VarInit(string caption)
  19. {
  20. this.Controls.Add(_border);
  21. _border.Controls.Add(_caption);
  22. this.Size = new Size(120, 40);
  23. _border.Dock = DockStyle.Fill;
  24. _border.Padding = new Padding(1, 1, 1, 1);
  25. _border.HaveBorder = true;
  26. _caption.Dock = DockStyle.Fill;
  27. _caption.TextAlign = ContentAlignment.MiddleCenter;
  28. _caption.Caption = string.IsNullOrEmpty(caption) ? "" : caption;
  29. UpdateColor();
  30. EventInit();
  31. }
  32. /// <summary>
  33. ///
  34. /// </summary>
  35. public BlockButton()
  36. {
  37. VarInit(this.Name);
  38. }
  39. /// <summary>
  40. ///
  41. /// </summary>
  42. /// <param name="caption"></param>
  43. public BlockButton(string caption)
  44. {
  45. VarInit(caption);
  46. }
  47. #endregion
  48. #region event
  49. private void EventInit()
  50. {
  51. this.LockedChanged += Event_LockedChanged;
  52. this.MouseMove += Event_This_MouseMove;
  53. this.MouseLeave += Event_This_MouseLeave;
  54. {
  55. _border.MouseClick += Event_Caption_MouseClick;
  56. _border.MouseDoubleClick += Event_Caption_MouseDoubleClick;
  57. _border.MouseDown += Event_Caption_MouseDown;
  58. _border.MouseUp += Event_Caption_MouseUp;
  59. _border.MouseMove += Event_Border_MouseMove;
  60. _border.MouseWheel += Event_Caption_MouseWheel;
  61. _border.Click += Event_Caption_Click;
  62. _border.DoubleClick += Event_Caption_DoubleClick;
  63. _border.MouseCaptureChanged += Event_Caption_MouseCaptureChanged;
  64. _border.MouseEnter += Event_Caption_MouseEnter;
  65. _border.MouseHover += Event_Caption_MouseHover;
  66. _border.MouseLeave += Event_Caption_MouseLeave;
  67. _border.PreviewKeyDown += Event_Caption_PreviewKeyDown;
  68. }
  69. {
  70. _caption.MouseClick += Event_Caption_MouseClick;
  71. _caption.MouseDoubleClick += Event_Caption_MouseDoubleClick;
  72. _caption.MouseDown += Event_Caption_MouseDown;
  73. _caption.MouseUp += Event_Caption_MouseUp;
  74. _caption.MouseMove += Event_Caption_MouseMove;
  75. _caption.MouseWheel += Event_Caption_MouseWheel;
  76. _caption.Click += Event_Caption_Click;
  77. _caption.DoubleClick += Event_Caption_DoubleClick;
  78. _caption.MouseCaptureChanged += Event_Caption_MouseCaptureChanged;
  79. _caption.MouseEnter += Event_Caption_MouseEnter;
  80. _caption.MouseHover += Event_Caption_MouseHover;
  81. _caption.MouseLeave += Event_Caption_MouseLeave;
  82. _caption.PreviewKeyDown += Event_Caption_PreviewKeyDown;
  83. }
  84. }
  85. private void Event_Border_MouseMove(object sender, MouseEventArgs e)
  86. {
  87. this.OnMouseMove(e);
  88. }
  89. private void Event_This_MouseMove(object sender, EventArgs e)
  90. {
  91. Hover = true;
  92. }
  93. private void Event_This_MouseLeave(object sender, EventArgs e)
  94. {
  95. Hover = false;
  96. }
  97. private void Event_LockedChanged(object sender, EventArgs e)
  98. {
  99. _caption.ForeColor = Locked ? Color.Gray : NormalText;
  100. UpdateColor();
  101. }
  102. private void Event_Caption_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
  103. {
  104. if (!Locked) this.OnPreviewKeyDown(e);
  105. }
  106. private void Event_Caption_DoubleClick(object sender, EventArgs e)
  107. {
  108. if (!Locked) this.OnDoubleClick(e);
  109. }
  110. private void Event_Caption_Click(object sender, EventArgs e)
  111. {
  112. if (!Locked) this.OnClick(e);
  113. }
  114. private void Event_Caption_MouseWheel(object sender, MouseEventArgs e)
  115. {
  116. if (!Locked)
  117. {
  118. int voffset = HaveBorder ? 1 : 0;
  119. this.OnMouseWheel(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
  120. }
  121. }
  122. private void Event_Caption_MouseMove(object sender, MouseEventArgs e)
  123. {
  124. if (!Locked)
  125. {
  126. int voffset = HaveBorder ? 1 : 0;
  127. this.OnMouseMove(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
  128. }
  129. }
  130. private void Event_Caption_MouseLeave(object sender, EventArgs e)
  131. {
  132. if (!Locked)
  133. {
  134. if (!Locked) this.OnMouseLeave(e);
  135. }
  136. }
  137. private void Event_Caption_MouseHover(object sender, EventArgs e)
  138. {
  139. if (!Locked) this.OnMouseHover(e);
  140. }
  141. private void Event_Caption_MouseEnter(object sender, EventArgs e)
  142. {
  143. if (!Locked) this.OnMouseEnter(e);
  144. }
  145. private void Event_Caption_MouseDoubleClick(object sender, MouseEventArgs e)
  146. {
  147. if (!Locked)
  148. {
  149. int voffset = HaveBorder ? 1 : 0;
  150. this.OnMouseDoubleClick(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
  151. }
  152. }
  153. private void Event_Caption_MouseCaptureChanged(object sender, EventArgs e)
  154. {
  155. if (!Locked) this.OnMouseCaptureChanged(e);
  156. }
  157. private void Event_Caption_MouseUp(object sender, MouseEventArgs e)
  158. {
  159. if (!Locked)
  160. {
  161. int voffset = HaveBorder ? 1 : 0;
  162. this.OnMouseUp(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
  163. }
  164. }
  165. private void Event_Caption_MouseClick(object sender, MouseEventArgs e)
  166. {
  167. if (!Locked)
  168. {
  169. int voffset = HaveBorder ? 1 : 0;
  170. this.OnMouseClick(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
  171. }
  172. }
  173. private void Event_Caption_MouseDown(object sender, MouseEventArgs e)
  174. {
  175. if (!Locked)
  176. {
  177. int voffset = HaveBorder ? 1 : 0;
  178. this.OnMouseDown(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
  179. }
  180. }
  181. #endregion
  182. #region accessor
  183. /// <summary>
  184. ///
  185. /// </summary>
  186. public string Caption { get { return _caption.Text; } set { _caption.Text = string.IsNullOrEmpty(value) ? "" : value; } }
  187. /// <summary>鼠标悬停时的背景颜色。</summary>
  188. public Color HoverWall { get { return _border.HoverWall; } set { _border.HoverWall = value; UpdateColor(); } }
  189. /// <summary>鼠标悬停时的文本颜色。</summary>
  190. public Color HoverText { get { return _hovertext; } set { _hovertext = value; UpdateColor(); } }
  191. /// <summary>鼠标悬停时的边框颜色。</summary>
  192. public Color HoverBorder { get { return _border.HoverBorder; } set { _border.HoverBorder = value; UpdateColor(); } }
  193. /// <summary>默认背景颜色。</summary>
  194. public Color NormalWall { get { return _border.NormalWall; } set { _border.NormalWall = value; UpdateColor(); } }
  195. /// <summary>默认文本颜色。</summary>
  196. public Color NormalText { get { return _normaltext; } set { _normaltext = value; UpdateColor(); } }
  197. /// <summary>默认边框颜色。</summary>
  198. public Color NormalBorder { get { return _border.NormalBorder; } set { _border.NormalBorder = value; UpdateColor(); } }
  199. /// <summary>锁定时的背景颜色。</summary>
  200. public Color LockedWall { get { return _border.LostWall; } set { _border.LostWall = value; UpdateColor(); } }
  201. /// <summary>锁定时的文本颜色。</summary>
  202. public Color LockedText { get { return _lockedtext; } set { _lockedtext = value; UpdateColor(); } }
  203. /// <summary>锁定时的边框颜色。</summary>
  204. public Color LockedlBorder { get { return _border.LostBorder; } set { _border.LostBorder = value; UpdateColor(); } }
  205. /// <summary>包含边框。</summary>
  206. public bool HaveBorder { get { return _border.HaveBorder; } set { _border.HaveBorder = value; UpdateColor(); } }
  207. /// <summary>获取 Label 控件。</summary>
  208. public Label Label { get { return _caption; } }
  209. /// <summary>文本的对齐方式。</summary>
  210. public ContentAlignment TextAlign { get { return _caption.TextAlign; } set { _caption.TextAlign = value; } }
  211. /// <summary>锁定按钮,禁止点击。</summary>
  212. public new bool Locked
  213. {
  214. get { return base.Locked; }
  215. set { base.Locked = value; if (value) _hover = false; UpdateColor(); }
  216. }
  217. /// <summary>文本的外边距。</summary>
  218. public Padding BodyMargin
  219. {
  220. get
  221. {
  222. var vmargin = new Padding(_border.Padding.Left + 1, _border.Padding.Top + 1, _border.Padding.Right + 1, _border.Padding.Bottom + 1);
  223. return vmargin;
  224. }
  225. set
  226. {
  227. if (value == null) return;
  228. _border.Padding = new Padding(value.Left - 1, value.Top - 1, value.Right - 1, value.Bottom - 1);
  229. }
  230. }
  231. #endregion
  232. #region private
  233. private bool _hover = false;
  234. private bool Hover
  235. {
  236. get { return _hover; }
  237. set
  238. {
  239. if (Locked) return;
  240. if (_hover != value)
  241. {
  242. _hover = value;
  243. UpdateColor();
  244. }
  245. }
  246. }
  247. private void UpdateColor()
  248. {
  249. if (Locked)
  250. {
  251. _border.GoLost();
  252. _caption.ForeColor = _lockedtext;
  253. _caption.BackColor = _border.LostWall;
  254. }
  255. else
  256. {
  257. if (_hover)
  258. {
  259. _border.GoHover();
  260. _caption.ForeColor = HoverText;
  261. _caption.BackColor = _border.HoverWall;
  262. }
  263. else
  264. {
  265. _border.GoNormal();
  266. _caption.ForeColor = NormalText;
  267. _caption.BackColor = _border.NormalWall;
  268. }
  269. }
  270. }
  271. #endregion
  272. }
  273. }
  274. #endif