c# 控件移动 改变大小

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Windows.Forms;
  8.  
  9. namespace AllTest
  10. {
  11. class BarcodeControl
  12. {
  13. #region private
  14.  
  15. private const int MIN_SIZE = 10; //对控件缩放的最小值
  16. private const int BOX_SIZE = 7; //调整大小触模柄方框大小
  17.  
  18. public bool _IsCtrlKey = false;
  19. private TextBox _textbox;
  20. private Control _MControl = null;
  21. private bool _IsMouseDown = false;
  22. private Point _oPointClicked;
  23. private Color BOX_COLOR = Color.White;
  24. private Label[] _lbl = new Label[8];
  25. private int _startl, _startt, _startw, _starth;
  26. private bool _dragging;
  27. private Cursor[] _arrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS,
  28. Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS,
  29. Cursors.SizeNESW, Cursors.SizeWE};
  30.  
  31. #endregion
  32.  
  33. #region 构造函数
  34.  
  35. /// <summary>
  36. /// 构造控件拖动对象
  37. /// </summary>
  38. /// <param name="moveControl">需要拖动的控件 </param>
  39. public BarcodeControl(Control moveControl)
  40. {
  41. //
  42. // TODO: 在此处添加构造函数逻辑
  43. //
  44. _MControl = moveControl;
  45. _MControl.MouseDown += new MouseEventHandler(this.Control_MouseDown);
  46. _MControl.MouseUp += new MouseEventHandler(this.Control_MouseUp);
  47. _MControl.MouseMove += new MouseEventHandler(this.Control_MouseMove);
  48. _MControl.Click += new System.EventHandler(this.Control_Click);
  49.  
  50. //构造8个调整大小触模柄
  51. for (int i = 0; i < 8; i++)
  52. {
  53. _lbl[i] = new Label();
  54. _lbl[i].TabIndex = i;
  55. _lbl[i].FlatStyle = 0;
  56. _lbl[i].BorderStyle = BorderStyle.FixedSingle;
  57. _lbl[i].BackColor = BOX_COLOR;
  58. _lbl[i].Cursor = _arrArrow[i];
  59. _lbl[i].Text = "";
  60. _lbl[i].BringToFront();
  61. _lbl[i].MouseDown += new MouseEventHandler(this.handle_MouseDown);
  62. _lbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove);
  63. _lbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp);
  64. }
  65.  
  66. CreateTextBox();
  67. Create();
  68.  
  69. //Control_Click((object)sender, (System.EventArgs)e);
  70. }
  71.  
  72. #endregion
  73.  
  74. #region 需拖动控件键盘事件
  75.  
  76. private void textBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
  77. {
  78. if (e.KeyValue == 37 || e.KeyValue == 38 || e.KeyValue == 39 || e.KeyValue == 40)
  79. {
  80. if (e.KeyValue == 37)
  81. _MControl.Left -= 1;
  82. if (e.KeyValue == 38)
  83. _MControl.Top -= 1;
  84. if (e.KeyValue == 39)
  85. _MControl.Left += 1;
  86. if (e.KeyValue == 40)
  87. _MControl.Top += 1;
  88. MoveHandles();
  89. ControlLocality();
  90. _MControl.Visible = true;
  91. }
  92.  
  93. if (e.KeyValue == 46)
  94. {
  95. for (int i = 0; i < 8; i++)
  96. {
  97. _MControl.Parent.Controls.Remove(_lbl[i]);
  98. }
  99. _MControl.Parent.Controls.Remove(_MControl);
  100. _textbox.Parent.Controls.Remove(_textbox);
  101. }
  102.  
  103. if (e.KeyValue == 17)
  104. {
  105. _IsCtrlKey = true;
  106. //MessageBox.Show("a");
  107. }
  108. }
  109.  
  110. #endregion
  111.  
  112. #region 需拖动控件鼠标事件
  113.  
  114. private void Control_Click(object sender, System.EventArgs e)
  115. {
  116. _textbox.Focus();
  117. _MControl = (sender as Control);
  118. MoveHandles();
  119.  
  120. if (_IsCtrlKey == false)
  121. {
  122. for (int i = 0; i < _MControl.Parent.Controls.Count; i++)
  123. {
  124. if (_MControl.Parent.Controls[i].Text.Trim().Length == 0 && _MControl.Parent.Controls[i] is Label)
  125. {
  126. _MControl.Parent.Controls[i].Visible = false;
  127. }
  128. }
  129. }
  130. }
  131. private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
  132. {
  133. _IsMouseDown = true;
  134. _oPointClicked = new Point(e.X, e.Y);
  135. for (int i = 0; i < 8; i++)
  136. {
  137. _MControl.Parent.Controls.Add(_lbl[i]);
  138. _lbl[i].BringToFront();
  139. }
  140. HideHandles();
  141. }
  142.  
  143. private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
  144. {
  145. _IsMouseDown = false;
  146. MoveHandles();
  147. ShowHandles();
  148. _MControl.Visible = true;
  149. }
  150.  
  151. private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
  152. {
  153. if (_IsMouseDown)
  154. {
  155. int l = _MControl.Left + (e.X - _oPointClicked.X);
  156. int t = _MControl.Top + (e.Y - _oPointClicked.Y);
  157. int w = _MControl.Width;
  158. int h = _MControl.Height;
  159. l = (l < 0) ? 0 : ((l + w > _MControl.Parent.ClientRectangle.Width) ?
  160. _MControl.Parent.ClientRectangle.Width - w : l);
  161. t = (t < 0) ? 0 : ((t + h > _MControl.Parent.ClientRectangle.Height) ?
  162. _MControl.Parent.ClientRectangle.Height - h : t);
  163. _MControl.Left = l;
  164. _MControl.Top = t;
  165. ControlLocality();
  166. }
  167. //_MControl.Cursor=Cursors.SizeAll;
  168. }
  169.  
  170. #endregion
  171. #region 调整大小触模柄鼠标事件
  172.  
  173. private void handle_MouseDown(object sender, MouseEventArgs e)
  174. {
  175. _dragging = true;
  176. _startl = _MControl.Left;
  177. _startt = _MControl.Top;
  178. _startw = _MControl.Width;
  179. _starth = _MControl.Height;
  180. HideHandles();
  181. }
  182. // 通过触模柄调整控件大小
  183. // 0 1 2
  184. // 7 3
  185. // 6 5 4
  186. private void handle_MouseMove(object sender, MouseEventArgs e)
  187. {
  188. int l = _MControl.Left;
  189. int w = _MControl.Width;
  190. int t = _MControl.Top;
  191. int h = _MControl.Height;
  192. if (_dragging)
  193. {
  194. switch (((Label)sender).TabIndex)
  195. {
  196. //l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小
  197. //t算法:
  198. //w算法:
  199. //h算法:
  200. case 0: // _dragging top-left sizing box
  201. l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE;
  202. t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE;
  203. w = _startl + _startw - _MControl.Left;
  204. h = _startt + _starth - _MControl.Top;
  205. break;
  206. case 1: // _dragging top-center sizing box
  207. t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE;
  208. h = _startt + _starth - _MControl.Top;
  209. break;
  210. case 2: // _dragging top-right sizing box
  211. w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE;
  212. t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE;
  213. h = _startt + _starth - _MControl.Top;
  214. break;
  215. case 3: // _dragging right-middle sizing box
  216. w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE;
  217. break;
  218. case 4: // _dragging right-bottom sizing box
  219. w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE;
  220. h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE;
  221. break;
  222. case 5: // _dragging center-bottom sizing box
  223. h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE;
  224. break;
  225. case 6: // _dragging left-bottom sizing box
  226. l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE;
  227. w = _startl + _startw - _MControl.Left;
  228. h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE;
  229. break;
  230. case 7: // _dragging left-middle sizing box
  231. l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE;
  232. w = _startl + _startw - _MControl.Left;
  233. break;
  234. }
  235. l = (l < 0) ? 0 : l;
  236. t = (t < 0) ? 0 : t;
  237. _MControl.SetBounds(l, t, w, h);
  238. }
  239. }
  240.  
  241. private void handle_MouseUp(object sender, MouseEventArgs e)
  242. {
  243. _dragging = false;
  244. MoveHandles();
  245. ShowHandles();
  246. }
  247.  
  248. #endregion
  249.  
  250. #region private方法
  251.  
  252. private void Create()
  253. {
  254. //_IsMouseDown = true;
  255. //_oPointClicked = new Point(e.X,e.Y);
  256. for (int i = 0; i < 8; i++)
  257. {
  258. _MControl.Parent.Controls.Add(_lbl[i]);
  259. _lbl[i].BringToFront();
  260. }
  261. HideHandles();
  262. }
  263.  
  264. private void CreateTextBox()
  265. {
  266. _textbox = new TextBox();
  267. _textbox.CreateControl();
  268. _textbox.Parent = _MControl.Parent;
  269. _textbox.Width = 0;
  270. _textbox.Height = 0;
  271. _textbox.TabStop = true;
  272. _textbox.KeyDown += new System.Windows.Forms.KeyEventHandler(textBox_KeyDown);
  273. }
  274.  
  275. private void ControlLocality()
  276. {
  277. if (_MControl.Location.X < 0)
  278. {
  279. _MControl.Visible = false;
  280. _MControl.Left = 0;
  281. }
  282. if (_MControl.Location.Y < 0)
  283. {
  284. _MControl.Visible = false;
  285. _MControl.Top = 0;
  286. }
  287. if (_MControl.Location.X + _MControl.Width > _MControl.Parent.Width)
  288. {
  289. _MControl.Visible = false;
  290. _MControl.Left = _MControl.Parent.Width - _MControl.Width;
  291. }
  292. if (_MControl.Location.Y + _MControl.Height > _MControl.Parent.Height)
  293. {
  294. _MControl.Visible = false;
  295. _MControl.Top = _MControl.Parent.Height - _MControl.Height;
  296. }
  297. }
  298.  
  299. private void HideHandles()
  300. {
  301. for (int i = 0; i < 8; i++)
  302. {
  303. _lbl[i].Visible = false;
  304. }
  305. }
  306.  
  307. private void MoveHandles()
  308. {
  309. int sX = _MControl.Left - BOX_SIZE;
  310. int sY = _MControl.Top - BOX_SIZE;
  311. int sW = _MControl.Width + BOX_SIZE;
  312. int sH = _MControl.Height + BOX_SIZE;
  313. int hB = BOX_SIZE / 2;
  314. int[] arrPosX = new int[] {sX+hB, sX + sW / 2, sX + sW-hB, sX + sW-hB,
  315. sX + sW-hB, sX + sW / 2, sX+hB, sX+hB};
  316. int[] arrPosY = new int[] {sY+hB, sY+hB, sY+hB, sY + sH / 2, sY + sH-hB,
  317. sY + sH-hB, sY + sH-hB, sY + sH / 2};
  318. for (int i = 0; i < 8; i++)
  319. {
  320. _lbl[i].SetBounds(arrPosX[i], arrPosY[i], BOX_SIZE, BOX_SIZE);
  321. }
  322. }
  323.  
  324. private void ShowHandles()
  325. {
  326. if (_MControl != null)
  327. {
  328. for (int i = 0; i < 8; i++)
  329. {
  330. _lbl[i].Visible = true;
  331. }
  332. }
  333. }
  334.  
  335. #endregion
  336. }
  337. }

 出处:http://www.cnblogs.com/ln_leo/articles/1723985.html

posted on 2012-12-28 10:19  Q&A  阅读(149)  评论(0)    收藏  举报