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.

192 lines
5.4 KiB

  1. #if NETFX || NETCORE
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.Text;
  6. using System.Windows.Forms;
  7. namespace Apewer.Surface
  8. {
  9. /// <summary></summary>
  10. public class BlockLabel : Label
  11. {
  12. private IntPtr _formptr;
  13. private bool _movable = false;
  14. private bool _hover = false;
  15. private bool _locked = false;
  16. private bool _dynamic = false;
  17. private Color _wallnormal = FormsUtility.Transparent;
  18. private Color _wallhover = FormsUtility.Transparent;
  19. private Color _walllocked = FormsUtility.Transparent;
  20. private Color _textnormal = FormsUtility.Black;
  21. private Color _texthover = FormsUtility.Black;
  22. private Color _textlocked = FormsUtility.Black;
  23. /// <summary>界面线程调用器。</summary>
  24. protected delegate void Invoker();
  25. private void _init(string text, Form form)
  26. {
  27. AutoEllipsis = true;
  28. AutoSize = false;
  29. Font = FormsUtility.DefaultFont;
  30. TextAlign = ContentAlignment.MiddleLeft;
  31. BackColor = _wallnormal;
  32. ForeColor = FormsUtility.Black;
  33. AutoEllipsis = true;
  34. Text = string.IsNullOrEmpty(text) ? "" : text;
  35. if (form != null)
  36. {
  37. _formptr = form.Handle;
  38. _movable = true;
  39. MouseDown += Event_Caption_MouseDown;
  40. }
  41. }
  42. /// <summary></summary>
  43. public BlockLabel()
  44. {
  45. _init("", null);
  46. this.MouseMove += Event_This_MouseMove;
  47. this.MouseLeave += Event_This_MouseLeave;
  48. }
  49. private void Event_This_MouseLeave(object sender, EventArgs e)
  50. {
  51. Hover = false;
  52. }
  53. private void Event_This_MouseMove(object sender, MouseEventArgs e)
  54. {
  55. Hover = true;
  56. }
  57. /// <summary></summary>
  58. /// <param name="text"></param>
  59. public BlockLabel(string text)
  60. {
  61. _init(text, null);
  62. }
  63. /// <summary></summary>
  64. /// <param name="form"></param>
  65. public BlockLabel(Form form) => _init("", form);
  66. /// <summary></summary>
  67. /// <param name="form"></param>
  68. /// <param name="text"></param>
  69. public BlockLabel(Form form, string text) => _init(text, form);
  70. /// <summary></summary>
  71. /// <param name="text"></param>
  72. /// <param name="form"></param>
  73. public BlockLabel(string text, Form form) => _init(text, form);
  74. private void Event_Caption_MouseDown(object sender, MouseEventArgs e)
  75. {
  76. if (_movable) FormsUtility.MoveForm(_formptr);
  77. }
  78. /// <summary></summary>
  79. public string Caption
  80. {
  81. get { return Text; }
  82. set
  83. {
  84. if (this.IsHandleCreated)
  85. {
  86. try
  87. {
  88. this.Invoke(new Invoker(delegate ()
  89. {
  90. Text = string.IsNullOrEmpty(value) ? "" : value.Trim();
  91. }));
  92. }
  93. catch { }
  94. }
  95. else
  96. {
  97. try
  98. {
  99. Text = string.IsNullOrEmpty(value) ? "" : value.Trim();
  100. }
  101. catch { }
  102. }
  103. }
  104. }
  105. /// <summary></summary>
  106. public bool Locked
  107. {
  108. get { return _locked; }
  109. set
  110. {
  111. var vchanged = (value != _locked);
  112. _locked = value;
  113. if (vchanged) UpdateColor();
  114. }
  115. }
  116. private bool Hover
  117. {
  118. get { return _hover; }
  119. set
  120. {
  121. var vchanged = (value != _hover);
  122. _hover = value;
  123. if (vchanged) UpdateColor();
  124. }
  125. }
  126. private void UpdateColor()
  127. {
  128. if (!_dynamic) return;
  129. if (Locked)
  130. {
  131. BackColor = _walllocked;
  132. ForeColor = _textlocked;
  133. }
  134. else if (_hover)
  135. {
  136. BackColor = _wallhover;
  137. ForeColor = _texthover;
  138. }
  139. else
  140. {
  141. BackColor = _wallnormal;
  142. ForeColor = _textnormal;
  143. }
  144. }
  145. /// <summary>启用鼠标悬停和锁定样式。</summary>
  146. public bool DynamicStyle { get { return _dynamic; } set { _dynamic = value; } }
  147. /// <summary></summary>
  148. public Color WallNormal { get { return _wallnormal; } set { _wallnormal = value; UpdateColor(); } }
  149. /// <summary></summary>
  150. public Color WallHover { get { return _wallhover; } set { _wallhover = value; UpdateColor(); } }
  151. /// <summary></summary>
  152. public Color WallLocked { get { return _walllocked; } set { _walllocked = value; UpdateColor(); } }
  153. /// <summary></summary>
  154. public Color TextNormal { get { return _textnormal; } set { _textnormal = value; UpdateColor(); } }
  155. /// <summary></summary>
  156. public Color TextHover { get { return _texthover; } set { _texthover = value; UpdateColor(); } }
  157. /// <summary></summary>
  158. public Color TextLocked { get { return _textlocked; } set { _textlocked = value; UpdateColor(); } }
  159. }
  160. }
  161. #endif