איך ליצור childform יותר יפה כאשר משתמשים בmdi
-
אני רוצה להשתמש בmdichild
או לחילופין פשוט להדגיר ככהvar childForm = new ChildForm(); //childForm.TopLevel = false;
(ואז אין את החסרוננות של mdi ואיכמ"ל)
בכל אופן הרעיון הוא להכניס כמה forms בתוך form אחד
דומה למה שיש בבר אילן.
הבעיה היא שכשעושים ככה אז הforms הפנימיים נהיים מגעילים ומיושנים.
השאלה היא אם יש דרך לעשות אותם יותר יפים?
מצו:ב תמונה
-
-
מסתבר שאפשר להשתמש עם usercontrol
הנה משהו בתור התחלה אזמח אם מישהו יוכל לעבור על זה ואולי גם לעזור לי לשפר את זה - נתקעתי עם הרחבה בצד שמאל ולמעלה - ועם כפתור minimizeusing System; using System.Drawing; using System.Windows.Forms; namespace TestC { public partial class Form1 : Form { private ResizeableControl resizeableControl; public Form1() { InitializeComponent(); InitializeResizeableControl(); } private void InitializeResizeableControl() { resizeableControl = new ResizeableControl(); Controls.Add(resizeableControl); // Handle the Resize event of the form to update the size of the control Resize += (sender, e) => resizeableControl.Size = ClientSize; } } public class ResizeableControl : UserControl { private const int BorderSize = 8; private bool isResizing = false; private bool isResizingHorizontal = false; private bool isResizingVertical = false; private Point lastMousePosition; bool isMouseDown = false; private Point mouseDownLocation; public ResizeableControl() { // Set the initial size Size = new Size(200, 200); BorderStyle = BorderStyle.FixedSingle; // Handle mouse events MouseDown += OnMouseDown; MouseMove += OnMouseMove; MouseUp += OnMouseUp; InitializeComponents(); } private void InitializeComponents() { Panel titleBar = new Panel(); titleBar.Dock = DockStyle.Top; titleBar.BackColor = Color.White; titleBar.Height = 20; Controls.Add(titleBar); titleBar.MouseDown += TitleBar_MouseDown; titleBar.MouseMove += TitleBar_MouseMove; titleBar.MouseUp += TitleBar_MouseUp; // Maximize button Button maximizeButton = new Button(); maximizeButton.Text = "⬜"; // Larger square Unicode character maximizeButton.Width = 20; maximizeButton.Height = 20; maximizeButton.Dock = DockStyle.Right; maximizeButton.FlatStyle = FlatStyle.Flat; maximizeButton.FlatAppearance.BorderSize = 0; // Store the original DockStyle DockStyle originalDockStyle = DockStyle.None; maximizeButton.Click += (sender, e) => { if (this.Dock == DockStyle.None) { // Maximize the form originalDockStyle = this.Dock; this.Dock = DockStyle.Fill; maximizeButton.Text = "❐"; // Change text to indicate restore } else { // Restore the original DockStyle this.Dock = originalDockStyle; maximizeButton.Text = "□"; // Change text to indicate maximize } }; titleBar.Controls.Add(maximizeButton); // X button Button xButton = new Button(); xButton.Text = "X"; xButton.Dock = DockStyle.Right; xButton.Width = 20; xButton.Height = 20; xButton.FlatStyle = FlatStyle.Flat; xButton.FlatAppearance.BorderSize = 0; xButton.Click += (sender, e) => this.Dispose(); titleBar.Controls.Add(xButton); } private void TitleBar_MouseUp(object sender, MouseEventArgs e) { isMouseDown = false; } private void TitleBar_MouseMove(object sender, MouseEventArgs e) { if (isMouseDown) { if (isMouseDown) { // Calculate the new position of the form based on the mouse movement this.Location = new Point( (this.Location.X - mouseDownLocation.X) + e.X, (this.Location.Y - mouseDownLocation.Y) + e.Y); this.Update(); // Forces the form to repaint for a smoother visual experience } } } private void TitleBar_MouseDown(object sender, MouseEventArgs e) { isMouseDown = true; mouseDownLocation = e.Location; } private void OnMouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && IsOnBorder(e.Location)) { isResizing = true; lastMousePosition = e.Location; isResizingHorizontal = e.X <= BorderSize || e.X >= Width - BorderSize; isResizingVertical = e.Y <= BorderSize || e.Y >= Height - BorderSize; } } private void OnMouseMove(object sender, MouseEventArgs e) { if (isResizing) { int deltaX = e.X - lastMousePosition.X; int deltaY = e.Y - lastMousePosition.Y; if (isResizingHorizontal && isResizingVertical) { // Diagonal resizing Width += deltaX; Height += deltaY; } else if (isResizingHorizontal) { // Horizontal resizing Width += deltaX; } else if (isResizingVertical) { // Vertical resizing Height += deltaY; } lastMousePosition = e.Location; } else { if (IsOnCorner(e.Location)) { Cursor = Cursors.SizeNWSE; } else if (e.X >= Width - BorderSize && e.Y >= Height - BorderSize) { // Cursor is in the bottom-right corner, allowing diagonal resizing Cursor = Cursors.SizeNWSE; } else if (e.X >= Width - BorderSize) { // Cursor is on the right border, allowing horizontal resizing Cursor = Cursors.SizeWE; } else if (e.Y >= Height - BorderSize) { // Cursor is on the bottom border, allowing vertical resizing Cursor = Cursors.SizeNS; } else { Cursor = Cursors.Default; } } } private void OnMouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isResizing = false; Cursor = Cursors.Default; } } private bool IsOnBorder(Point mouseLocation) { return mouseLocation.X <= BorderSize || mouseLocation.Y <= BorderSize || mouseLocation.X >= Width - BorderSize || mouseLocation.Y >= Height - BorderSize; } private bool IsOnCorner(Point mouseLocation) { return mouseLocation.X <= BorderSize && mouseLocation.Y <= BorderSize || mouseLocation.X >= Width - BorderSize && mouseLocation.Y >= Height - BorderSize; } } }
-
הבעיה שנסיון לעשות כזה דבר בwpf עלה לי ממש בתוהו פה לפחות הגעתי לאן שהוא
עריכה:
עכשיו ראיתי את זה בwpf צריך לשבת לראות מה יצא
http://csharphelper.com/howtos/howto_wpf_resize_rectangle.html -
לבינתיים השלמתי את המלאכה בwinform אולי יהיה שימושי למישהו
using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ResizableTextBox { class SizeableUserControl : UserControl { private const int grab = 16; public SizeableUserControl() { this.ResizeRedraw = true; InitializeComponent(); } protected override void WndProc(ref Message m) { base.WndProc(ref m); const int WM_NCHITTEST = 0x84; const int HT_LEFT = 10; const int HT_RIGHT = 11; const int HT_TOP = 12; const int HT_TOPLEFT = 13; const int HT_TOPRIGHT = 14; const int HT_BOTTOM = 15; const int HT_BOTTOMLEFT = 16; const int HT_BOTTOMRIGHT = 17; if (m.Msg == WM_NCHITTEST) { var pos = this.PointToClient(new Point(m.LParam.ToInt32())); if (pos.X <= grab && pos.Y <= grab) m.Result = new IntPtr(HT_TOPLEFT); else if (pos.X >= this.ClientSize.Width - grab && pos.Y <= grab) m.Result = new IntPtr(HT_TOPRIGHT); else if (pos.X <= grab && pos.Y >= this.ClientSize.Height - grab) m.Result = new IntPtr(HT_BOTTOMLEFT); else if (pos.X >= this.ClientSize.Width - grab && pos.Y >= this.ClientSize.Height - grab) m.Result = new IntPtr(HT_BOTTOMRIGHT); else if (pos.X <= grab) m.Result = new IntPtr(HT_LEFT); else if (pos.X >= this.ClientSize.Width - grab) m.Result = new IntPtr(HT_RIGHT); else if (pos.Y <= grab) m.Result = new IntPtr(HT_TOP); else if (pos.Y >= this.ClientSize.Height - grab) m.Result = new IntPtr(HT_BOTTOM); } } private void InitializeComponent() { this.SuspendLayout(); this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Name = "SizeableUserControl"; this.Size = new System.Drawing.Size(100, 100); Panel titleBar = new Panel(); titleBar.Dock = DockStyle.Top; titleBar.BackColor = Color.White; titleBar.Height = 20; Controls.Add(titleBar); titleBar.MouseDown += TitleBar_MouseDown; titleBar.MouseMove += TitleBar_MouseMove; titleBar.MouseUp += TitleBar_MouseUp; // Minimize button Button minimizeButton = new Button(); minimizeButton.Text = "─"; minimizeButton.TextAlign = ContentAlignment.MiddleCenter; minimizeButton.Width = 20; minimizeButton.Height = 20; minimizeButton.Dock = DockStyle.Right; minimizeButton.FlatStyle = FlatStyle.Flat; minimizeButton.FlatAppearance.BorderSize = 0; titleBar.Controls.Add(minimizeButton); minimizeButton.Click += (sender, e) => { if (minimizeButton.Text == "─") { minimizeButton.Text = "+"; this.Height = 20; this.Width = 60; } else { minimizeButton.Text = "─"; this.Height = 100; this.Width = 100; } }; // Maximize button Button maximizeButton = new Button(); maximizeButton.Text = "⬜"; // Larger square Unicode character maximizeButton.TextAlign = ContentAlignment.MiddleCenter; maximizeButton.Width = 20; maximizeButton.Height = 20; maximizeButton.Dock = DockStyle.Right; maximizeButton.FlatStyle = FlatStyle.Flat; maximizeButton.FlatAppearance.BorderSize = 0; // Store the original DockStyle DockStyle originalDockStyle = DockStyle.None; maximizeButton.Click += (sender, e) => { if (this.Dock == DockStyle.None) { // Maximize the form originalDockStyle = this.Dock; this.Dock = DockStyle.Fill; maximizeButton.Text = "❐"; // Change text to indicate restore } else { // Restore the original DockStyle this.Dock = originalDockStyle; maximizeButton.Text = "⬜"; // Change text to indicate maximize } }; titleBar.Controls.Add(maximizeButton); // X button Button xButton = new Button(); xButton.Text = "X"; xButton.Dock = DockStyle.Right; xButton.Width = 20; xButton.Height = 20; xButton.FlatStyle = FlatStyle.Flat; xButton.FlatAppearance.BorderSize = 0; xButton.Click += (sender, e) => this.Dispose(); titleBar.Controls.Add(xButton); this.ResumeLayout(false); } bool isMouseDown = false; private Point mouseDownLocation; private void TitleBar_MouseUp(object sender, MouseEventArgs e) { isMouseDown = false; } private void TitleBar_MouseMove(object sender, MouseEventArgs e) { if (isMouseDown) { if (isMouseDown) { // Calculate the new position of the form based on the mouse movement this.Location = new Point( (this.Location.X - mouseDownLocation.X) + e.X, (this.Location.Y - mouseDownLocation.Y) + e.Y); this.Update(); // Forces the form to repaint for a smoother visual experience } } } private void TitleBar_MouseDown(object sender, MouseEventArgs e) { isMouseDown = true; mouseDownLocation = e.Location; } } }
-
שיחקתי עם זה קצת והוספתי לו תכונות snap פשוטות (לקצוות של הparentform ולקצוות של אחד לשני)
static class MyDictionary { public static List<SizeableUserControl> userControlCollection = new List<SizeableUserControl>(); } class SizeableUserControl : UserControl { Form parentForm; private const int grab = 16; public SizeableUserControl(Form form) { parentForm = form; MyDictionary.userControlCollection.Add(this); this.ResizeRedraw = true; InitializeComponent(); } private void InitializeComponent() { this.SuspendLayout(); this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.Name = "SizeableUserControl"; this.Size = new System.Drawing.Size(100, 100); Panel titleBar = new Panel(); titleBar.Dock = DockStyle.Top; titleBar.BackColor = Color.White; titleBar.Height = 20; Controls.Add(titleBar); titleBar.MouseDown += TitleBar_MouseDown; titleBar.MouseMove += TitleBar_MouseMove; titleBar.MouseUp += TitleBar_MouseUp; // Minimize button Button minimizeButton = new Button(); minimizeButton.Text = "─"; minimizeButton.TextAlign = ContentAlignment.MiddleCenter; minimizeButton.Width = 20; minimizeButton.Height = 20; minimizeButton.Dock = DockStyle.Right; minimizeButton.FlatStyle = FlatStyle.Flat; minimizeButton.FlatAppearance.BorderSize = 0; titleBar.Controls.Add(minimizeButton); minimizeButton.Click += (sender, e) => { if (minimizeButton.Text == "─") { minimizeButton.Text = "+"; this.Height = 20; this.Width = 60; } else { minimizeButton.Text = "─"; this.Height = 100; this.Width = 100; } }; // Maximize button Button maximizeButton = new Button(); maximizeButton.Text = "⬜"; // Larger square Unicode character maximizeButton.TextAlign = ContentAlignment.MiddleCenter; maximizeButton.Width = 20; maximizeButton.Height = 20; maximizeButton.Dock = DockStyle.Right; maximizeButton.FlatStyle = FlatStyle.Flat; maximizeButton.FlatAppearance.BorderSize = 0; // Store the original DockStyle DockStyle originalDockStyle = DockStyle.None; maximizeButton.Click += (sender, e) => { if (this.Dock == DockStyle.None) { // Maximize the form originalDockStyle = this.Dock; this.Dock = DockStyle.Fill; maximizeButton.Text = "❐"; // Change text to indicate restore } else { // Restore the original DockStyle this.Dock = originalDockStyle; maximizeButton.Text = "⬜"; // Change text to indicate maximize } }; titleBar.Controls.Add(maximizeButton); // X button Button xButton = new Button(); xButton.Text = "X"; xButton.Dock = DockStyle.Right; xButton.Width = 20; xButton.Height = 20; xButton.FlatStyle = FlatStyle.Flat; xButton.FlatAppearance.BorderSize = 0; xButton.Click += (sender, e) => this.Dispose(); titleBar.Controls.Add(xButton); this.ResumeLayout(false); } protected override void WndProc(ref Message m) { base.WndProc(ref m); const int WM_NCHITTEST = 0x84; const int HT_LEFT = 10; const int HT_RIGHT = 11; const int HT_TOP = 12; const int HT_TOPLEFT = 13; const int HT_TOPRIGHT = 14; const int HT_BOTTOM = 15; const int HT_BOTTOMLEFT = 16; const int HT_BOTTOMRIGHT = 17; if (m.Msg == WM_NCHITTEST) { var pos = this.PointToClient(new Point(m.LParam.ToInt32())); if (pos.X <= grab && pos.Y <= grab) m.Result = new IntPtr(HT_TOPLEFT); else if (pos.X >= this.ClientSize.Width - grab && pos.Y <= grab) m.Result = new IntPtr(HT_TOPRIGHT); else if (pos.X <= grab && pos.Y >= this.ClientSize.Height - grab) m.Result = new IntPtr(HT_BOTTOMLEFT); else if (pos.X >= this.ClientSize.Width - grab && pos.Y >= this.ClientSize.Height - grab) m.Result = new IntPtr(HT_BOTTOMRIGHT); else if (pos.X <= grab) m.Result = new IntPtr(HT_LEFT); else if (pos.X >= this.ClientSize.Width - grab) m.Result = new IntPtr(HT_RIGHT); else if (pos.Y <= grab) m.Result = new IntPtr(HT_TOP); else if (pos.Y >= this.ClientSize.Height - grab) m.Result = new IntPtr(HT_BOTTOM); } } bool isMouseDown = false; private Point mouseDownLocation; private void TitleBar_MouseUp(object sender, MouseEventArgs e) { isMouseDown = false; } private void TitleBar_MouseMove(object sender, MouseEventArgs e) { if (isMouseDown) { // Check proximity on all sides (adjust the threshold as needed) int proximityThreshold = 10; // Calculate the new position of the control based on the mouse movement int newX = this.Left - mouseDownLocation.X + e.X; int newY = this.Top - mouseDownLocation.Y + e.Y; // Ensure the new position is within the boundaries of the parent form newX = Math.Max(0, Math.Min(newX, parentForm.ClientSize.Width - this.Width)); newY = Math.Max(0, Math.Min(newY, parentForm.ClientSize.Height - this.Height)); // Iterate through other controls and check if snapping is possible foreach (var kvp in MyDictionary.userControlCollection) { if (kvp != this) { // Check top side if (Math.Abs(newY - kvp.Bottom) < proximityThreshold) { newY = kvp.Bottom + 1; // Align right and left if they are close enough if (Math.Abs(newX - kvp.Left) < proximityThreshold) { newX = kvp.Left; } else if (Math.Abs(newX + this.Width - kvp.Right) < proximityThreshold) { newX = kvp.Right - this.Width; } } // Check bottom side else if (Math.Abs(newY + this.Height - kvp.Top) < proximityThreshold) { newY = kvp.Top - this.Height - 1; // Align right and left if they are close enough if (Math.Abs(newX - kvp.Left) < proximityThreshold) { newX = kvp.Left; } else if (Math.Abs(newX + this.Width - kvp.Right) < proximityThreshold) { newX = kvp.Right - this.Width; } } // Check left side if (Math.Abs(newX - kvp.Right) < proximityThreshold) { newX = kvp.Right + 1; // Align tops if they are close enough if (Math.Abs(newY - kvp.Top) < proximityThreshold) { newY = kvp.Top; } // Align bottoms if they are close enough else if (Math.Abs(newY + this.Height - kvp.Bottom) < proximityThreshold) { newY = kvp.Bottom - this.Height; } } // Check right side else if (Math.Abs(newX + this.Width - kvp.Left) < proximityThreshold) { newX = kvp.Left - this.Width - 1; // Align tops if they are close enough if (Math.Abs(newY - kvp.Top) < proximityThreshold) { newY = kvp.Top; } // Align bottoms if they are close enough else if (Math.Abs(newY + this.Height - kvp.Bottom) < proximityThreshold) { newY = kvp.Bottom - this.Height; } } } } // Snap to parent form edges if (Math.Abs(newX) < proximityThreshold) { newX = 0; } else if (Math.Abs(newX + this.Width - parentForm.ClientSize.Width) < proximityThreshold) { newX = parentForm.ClientSize.Width - this.Width; } if (Math.Abs(newY) < proximityThreshold) { newY = 0; } else if (Math.Abs(newY + this.Height - parentForm.ClientSize.Height) < proximityThreshold) { newY = parentForm.ClientSize.Height - this.Height; } this.Location = new Point(newX, newY); // Forces the control to repaint for a smoother visual experience this.Invalidate(); } } private void TitleBar_MouseDown(object sender, MouseEventArgs e) { isMouseDown = true; mouseDownLocation = e.Location; } }
-
@dovid כתב באיך ליצור childform יותר יפה כאשר משתמשים בmdi:
תבדוק את זה:
https://github.com/Dirkster99/AvalonDockבדקתי
הוא מושלם תודה.