source: Common/ResizableControls.cs

Last change on this file was 1, checked in by chronos, 5 years ago
  • Added: Common library files.
File size: 10.4 KB
Line 
1
2using System;
3using System.Collections.Generic;
4using System.Linq;
5using System.Text;
6using System.Threading.Tasks;
7using System.Drawing;
8using System.Windows.Forms;
9using Microsoft.Win32;
10
11namespace Common
12{
13 class ResizableControls
14 {
15 int dragSize = 16;
16 Point mouseStartPos = Point.Empty;
17 Control movedControl = null;
18 Size movedControlSize;
19 Size movedControlParentSize;
20 Form form;
21 Point lastMousePos;
22 string RegSubKey = "ControlHeight";
23 RegistryKey regKey;
24 int richTextBoxMinHeight = 24;
25 int listViewMinHeight = 48;
26 int dataGridViewMinHeight = 24;
27
28 public void InitForm(Form form)
29 {
30 this.form = form;
31 InitControlsRecursive(form.Controls);
32
33 LoadFromRegistry(form);
34 }
35
36 public void InitControlsRecursive(Control.ControlCollection coll)
37 {
38 foreach (Control c in coll)
39 {
40 if (c is ResizableListView) (c as ResizableListView).MouseDownEx += HandleMouseDownEx;
41 else c.MouseDown += HandleMouseDown;
42 if (c is ResizableListView) (c as ResizableListView).MouseUpEx += HandleMouseUpEx;
43 else c.MouseUp += HandleMouseUp;
44 if (c is ResizableListView) (c as ResizableListView).MouseMoveEx += HandleMouseMoveEx;
45 else c.MouseMove += HandleMouseMove;
46 c.MouseLeave += HandleMouseLeave;
47 //c.MouseCaptureChanged += MouseCaptureChanged;
48 InitControlsRecursive(c.Controls);
49 }
50 }
51
52 public static Control FindControlAtPoint(Control container, Point pos)
53 {
54 Control child;
55 foreach (Control c in container.Controls)
56 {
57 if (c.Visible && c.Bounds.Contains(pos))
58 {
59 child = FindControlAtPoint(c, new Point(pos.X - c.Left, pos.Y - c.Top));
60 if (child == null) return c;
61 else return child;
62 }
63 }
64 return null;
65 }
66
67 public static Control FindControlAtCursor(Form form)
68 {
69 Point pos = Cursor.Position;
70 if (form.Bounds.Contains(pos))
71 return FindControlAtPoint(form, form.PointToClient(pos));
72 return null;
73 }
74
75 private void MouseCaptureChanged(object sender, EventArgs e)
76 {
77 mouseStartPos = Point.Empty;
78 movedControl = null;
79 }
80
81 private void HandleMouseDown(object sender, MouseEventArgs e)
82 {
83 HandleMouseDownEx(sender, new MouseEventArgsEx(e.Button, e.Clicks, e.X, e.Y, e.Delta));
84 }
85
86 private void HandleMouseDownEx(object sender, MouseEventArgsEx e)
87 {
88 Point pos = Cursor.Position;
89 mouseStartPos = pos;
90 lastMousePos = pos;
91 movedControl = FindControlAtPoint(form, form.PointToClient(pos));
92 if (movedControl != null)
93 {
94 Rectangle dragArea = new Rectangle(movedControl.PointToScreen(new Point(0,
95 movedControl.Size.Height - dragSize)), new Size(movedControl.Size.Width, dragSize));
96 if (dragArea.Contains(pos) &&
97 ((movedControl is RichTextBox) || (movedControl is ListView) || (movedControl is DataGridView)))
98 {
99 movedControlSize = movedControl.Size;
100 movedControlParentSize = movedControl.Parent.Parent.Size;
101 e.Handled = true;
102 }
103 else movedControl = null;
104 }
105 }
106
107 private void HandleMouseLeave(object sender, EventArgs e)
108 {
109 mouseStartPos = Point.Empty;
110 movedControl = null;
111 }
112
113 private void HandleMouseUp(object sender, MouseEventArgs e)
114 {
115 HandleMouseUpEx(sender, new MouseEventArgsEx(e.Button, e.Clicks, e.X, e.Y, e.Delta));
116 }
117
118 private void HandleMouseUpEx(object sender, MouseEventArgsEx e)
119 {
120 mouseStartPos = Point.Empty;
121 movedControl = null;
122 }
123
124 private void HandleMouseMove(object sender, MouseEventArgs e)
125 {
126 HandleMouseMoveEx(sender, new MouseEventArgsEx(e.Button, e.Clicks, e.X, e.Y, e.Delta));
127 }
128
129 private void HandleMouseMoveEx(object sender, MouseEventArgsEx e)
130 {
131 Point pos = Cursor.Position;
132
133 // Show pan cursor for bottom right corner
134 Control movableControl = FindControlAtPoint(form, form.PointToClient(pos));
135 if (movableControl != null)
136 {
137 Rectangle dragArea = new Rectangle(movableControl.PointToScreen(new Point(0,
138 movableControl.Size.Height - dragSize)), new Size(movableControl.Size.Width, dragSize));
139 if (dragArea.Contains(pos) &&
140 ((movableControl is RichTextBox) || (movableControl is ListView) || (movableControl is DataGridView)))
141 {
142 if (Cursor.Current != Cursors.SizeNS) Cursor.Current = Cursors.SizeNS;
143 }
144 else if (Cursor.Current == Cursors.SizeNS) Cursor.Current = Cursors.Default;
145 }
146
147 if ((mouseStartPos != Point.Empty) && (movedControl != null) && (lastMousePos != pos))
148 {
149 Point posDiff = Point.Subtract(pos, (Size)lastMousePos);
150 posDiff.X = 0; // Allow only resize of height
151 //movedControl.Size = (Size)Point.Add(posDiff, movedControl.Size);
152 Cursor.Current = Cursors.Arrow;
153
154 Size newControlSize = (Size)Point.Add(posDiff, movedControl.Size);
155 if ((movedControl is RichTextBox) && (newControlSize.Height < richTextBoxMinHeight)) posDiff.Y = movedControl.Height - richTextBoxMinHeight;
156 else if ((movedControl is ListView) && (newControlSize.Height < listViewMinHeight)) posDiff.Y = movedControl.Height - listViewMinHeight;
157 else if ((movedControl is DataGridView) && (newControlSize.Height < dataGridViewMinHeight)) posDiff.Y = movedControl.Height - dataGridViewMinHeight;
158 ResizeParent(movedControl, posDiff);
159 lastMousePos = pos;
160 regKey.SetValue(movedControl.Name, movedControl.Height);
161 }
162 }
163
164 private void ResizeParent(Control control, Point diff)
165 {
166 if ((control.Parent != null) && !diff.IsEmpty)
167 {
168 if ((control.Parent is Panel) && (control.Parent as Panel).AutoScroll) return;
169 if (control.Parent is Panel)
170 control.Parent.Size = (Size)Point.Add(diff, control.Parent.Size);
171 ResizeParent(control.Parent, diff);
172 }
173 }
174
175 private void LoadFromRegistry(Form form)
176 {
177 regKey = Application.UserAppDataRegistry.OpenSubKey(RegSubKey + "\\" + form.Name, true);
178 if (regKey == null) regKey = Application.UserAppDataRegistry.CreateSubKey(RegSubKey + "\\" + form.Name);
179 LoadControlFromRegistry(form, regKey);
180 }
181
182 private void LoadControlFromRegistry(Control control, RegistryKey regKey)
183 {
184 if ((control is RichTextBox) || (control is ListView) || (control is DataGridView))
185 {
186 int newHeight = (int)regKey.GetValue(control.Name, control.Height);
187 if ((control is RichTextBox) && (newHeight < richTextBoxMinHeight)) newHeight = richTextBoxMinHeight;
188 else if ((control is ListView) && (newHeight < listViewMinHeight)) newHeight = listViewMinHeight;
189 else if ((control is DataGridView) && (newHeight < dataGridViewMinHeight)) newHeight = dataGridViewMinHeight;
190 ResizeParent(control, Point.Subtract(new Point(control.Width, newHeight), control.Size));
191 }
192 foreach (Control child in control.Controls)
193 {
194 LoadControlFromRegistry(child, regKey);
195 }
196 }
197 }
198
199 public class MouseEventArgsEx : MouseEventArgs
200 {
201 bool handled;
202
203 public MouseEventArgsEx(MouseButtons button, int clicks, int x, int y, int delta): base(button, clicks, x, y, delta)
204 {
205 handled = false;
206 }
207
208 public bool Handled { get { return handled; } set { handled = value; } }
209 }
210
211
212 public class ResizableListView : ListView
213 {
214 public event EventHandler<MouseEventArgsEx> MouseDownEx;
215 public event EventHandler<MouseEventArgsEx> MouseUpEx;
216 public event EventHandler<MouseEventArgsEx> MouseMoveEx;
217
218 protected override void WndProc(ref Message m)
219 {
220 Boolean handled = false;
221 m.Result = IntPtr.Zero;
222
223 const int WM_MOUSEMOVE = 0x0200;
224 const int WM_LBUTTONDOWN = 0x0201;
225 const int WM_LBUTTONUP = 0x0202;
226 if (m.Msg == WM_LBUTTONDOWN)
227 {
228 IntPtr xy = m.LParam;
229 int x = unchecked((short)(long)xy);
230 int y = unchecked((short)((long)xy >> 16));
231 MouseEventArgsEx eventArgs = new MouseEventArgsEx(MouseButtons.Left, 1, x, y, 0);
232 MouseDownEx(this, eventArgs);
233 handled = eventArgs.Handled;
234 } else
235 if (m.Msg == WM_LBUTTONUP)
236 {
237 IntPtr xy = m.LParam;
238 int x = unchecked((short)(long)xy);
239 int y = unchecked((short)((long)xy >> 16));
240 MouseEventArgsEx eventArgs = new MouseEventArgsEx(MouseButtons.Left, 1, x, y, 0);
241 MouseUpEx(this, eventArgs);
242 handled = eventArgs.Handled;
243 }
244 else
245 if (m.Msg == WM_MOUSEMOVE)
246 {
247 IntPtr xy = m.LParam;
248 int x = unchecked((short)(long)xy);
249 int y = unchecked((short)((long)xy >> 16));
250 MouseEventArgsEx eventArgs = new MouseEventArgsEx(MouseButtons.Left, 1, x, y, 0);
251 MouseMoveEx(this, eventArgs);
252 handled = eventArgs.Handled;
253 }
254 if (!handled) base.WndProc(ref m);
255 // else DefWndProc(ref m);
256 }
257 }
258}
Note: See TracBrowser for help on using the repository browser.