¿Cómo puede el usuario cambiar el tamaño del control en tiempo de ejecución en winforms?

Digamos que tengo una PictureBox.

Ahora lo que quiero es que el usuario pueda cambiar el tamaño de PictureBox a voluntad. Sin embargo, no tengo idea de cómo comenzar con esto. He buscado en Internet pero la información es escasa.

Al menos alguien me puede guiar por dónde empezar?

Esto es bastante fácil de hacer, cada ventana en Windows tiene la capacidad innata de ser redimensionable. Simplemente se apaga para un PictureBox, puede volver a encenderlo escuchando el mensaje WM_NCHITTEST . Simplemente le dice a Windows que el cursor está en una esquina de una ventana, obtiene todo lo demás de forma gratuita. También querrá dibujar un asa de agarre para que quede claro para el usuario que al arrastrar la esquina se cambiará el tamaño del cuadro.

Agregue una nueva clase a su proyecto y pegue el código que se muestra a continuación. Build + Build. Obtendrá un nuevo control en la parte superior de la caja de herramientas, colóquelo en un formulario. Establezca la propiedad de la imagen y está configurado para probarlo.

using System; using System.Drawing; using System.Windows.Forms; class SizeablePictureBox : PictureBox { public SizeablePictureBox() { this.ResizeRedraw = true; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); var rc = new Rectangle(this.ClientSize.Width - grab, this.ClientSize.Height - grab, grab, grab); ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc); } protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == 0x84) { // Trap WM_NCHITTEST var pos = this.PointToClient(new Point(m.LParam.ToInt32())); if (pos.X >= this.ClientSize.Width - grab && pos.Y >= this.ClientSize.Height - grab) m.Result = new IntPtr(17); // HT_BOTTOMRIGHT } } private const int grab = 16; } 

Otra forma muy económica de obtener el cambio de tamaño de forma gratuita es otorgarle al control un borde redimensionable. Que funciona en todas las esquinas y bordes. Pegue este código en la clase (ya no necesita WndProc):

 protected override CreateParams CreateParams { get { var cp = base.CreateParams; cp.Style |= 0x840000; // Turn on WS_BORDER + WS_THICKFRAME return cp; } } 

aquí hay un artículo

http://www.codeproject.com/Articles/20716/Allow-the-User-to-Resize-Controls-at-Runtime

eso debería ayudarte, ya que en vb aquí una traducción de C #

 using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; public class Form1 { ResizeableControl rc; private void Form1_Load(System.Object sender, System.EventArgs e) { rc = new ResizeableControl(pbDemo); } public Form1() { Load += Form1_Load; } } 

Y FUNCIÓN RE-SIZE

 using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; public class ResizeableControl { private Control withEventsField_mControl; private Control mControl { get { return withEventsField_mControl; } set { if (withEventsField_mControl != null) { withEventsField_mControl.MouseDown -= mControl_MouseDown; withEventsField_mControl.MouseUp -= mControl_MouseUp; withEventsField_mControl.MouseMove -= mControl_MouseMove; withEventsField_mControl.MouseLeave -= mControl_MouseLeave; } withEventsField_mControl = value; if (withEventsField_mControl != null) { withEventsField_mControl.MouseDown += mControl_MouseDown; withEventsField_mControl.MouseUp += mControl_MouseUp; withEventsField_mControl.MouseMove += mControl_MouseMove; withEventsField_mControl.MouseLeave += mControl_MouseLeave; } } } private bool mMouseDown = false; private EdgeEnum mEdge = EdgeEnum.None; private int mWidth = 4; private bool mOutlineDrawn = false; private enum EdgeEnum { None, Right, Left, Top, Bottom, TopLeft } public ResizeableControl(Control Control) { mControl = Control; } private void mControl_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { mMouseDown = true; } } private void mControl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { mMouseDown = false; } private void mControl_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { Control c = (Control)sender; Graphics g = c.CreateGraphics; switch (mEdge) { case EdgeEnum.TopLeft: g.FillRectangle(Brushes.Fuchsia, 0, 0, mWidth * 4, mWidth * 4); mOutlineDrawn = true; break; case EdgeEnum.Left: g.FillRectangle(Brushes.Fuchsia, 0, 0, mWidth, c.Height); mOutlineDrawn = true; break; case EdgeEnum.Right: g.FillRectangle(Brushes.Fuchsia, c.Width - mWidth, 0, c.Width, c.Height); mOutlineDrawn = true; break; case EdgeEnum.Top: g.FillRectangle(Brushes.Fuchsia, 0, 0, c.Width, mWidth); mOutlineDrawn = true; break; case EdgeEnum.Bottom: g.FillRectangle(Brushes.Fuchsia, 0, c.Height - mWidth, c.Width, mWidth); mOutlineDrawn = true; break; case EdgeEnum.None: if (mOutlineDrawn) { c.Refresh(); mOutlineDrawn = false; } break; } if (mMouseDown & mEdge != EdgeEnum.None) { c.SuspendLayout(); switch (mEdge) { case EdgeEnum.TopLeft: c.SetBounds(c.Left + eX, c.Top + eY, c.Width, c.Height); break; case EdgeEnum.Left: c.SetBounds(c.Left + eX, c.Top, c.Width - eX, c.Height); break; case EdgeEnum.Right: c.SetBounds(c.Left, c.Top, c.Width - (c.Width - eX), c.Height); break; case EdgeEnum.Top: c.SetBounds(c.Left, c.Top + eY, c.Width, c.Height - eY); break; case EdgeEnum.Bottom: c.SetBounds(c.Left, c.Top, c.Width, c.Height - (c.Height - eY)); break; } c.ResumeLayout(); } else { switch (true) { case eX <= (mWidth * 4) & eY <= (mWidth * 4): //top left corner c.Cursor = Cursors.SizeAll; mEdge = EdgeEnum.TopLeft; break; case eX <= mWidth: //left edge c.Cursor = Cursors.VSplit; mEdge = EdgeEnum.Left; break; case eX > c.Width - (mWidth + 1): //right edge c.Cursor = Cursors.VSplit; mEdge = EdgeEnum.Right; break; case eY <= mWidth: //top edge c.Cursor = Cursors.HSplit; mEdge = EdgeEnum.Top; break; case eY > c.Height - (mWidth + 1): //bottom edge c.Cursor = Cursors.HSplit; mEdge = EdgeEnum.Bottom; break; default: //no edge c.Cursor = Cursors.Default; mEdge = EdgeEnum.None; break; } } } private void mControl_MouseLeave(object sender, System.EventArgs e) { Control c = (Control)sender; mEdge = EdgeEnum.None; c.Refresh(); } } 

con el uso de la clase ControlMoverOrResizer en este artículo , puede hacer controles móviles y de tamaño variable en el tiempo de ejecución con solo una línea de código. 🙂 ejemplo:

ControlMoverOrResizer.Init (button1);

¡y ahora button1 es un control movible y redimensionable!

Cree una nueva aplicación c # winform y pegue esto:

No olvides dar las gracias cuando te ayude …

http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=743923&av=1095793&msg=4778687

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class MyForm : Form { //Public Declaration: double rW = 0; double rH = 0; int fH = 0; int fW = 0; // @ Form Initialization public MyForm() { InitializeComponent(); this.Resize += MyForm_Resize; // handles resize routine this.tabControl1.Dock = DockStyle.None; } private void MyForm_Resize(object sender, EventArgs e) { rResize(this,true); //Call the routine } private void rResize(Control t, bool hasTabs) // Routine to Auto resize the control { // this will return to normal default size when 1 of the conditions is met string[] s = null; if (this.Width < fW || this.Height < fH) { this.Width = (int)fW; this.Height = (int)fH; return; } foreach (Control c in t.Controls) { // Option 1: double rRW = (t.Width > rW ? t.Width / (rW) : rW / t.Width); double rRH = (t.Height > rH ? t.Height / (rH) : rH / t.Height); // Option 2: // double rRW = t.Width / rW; // double rRH = t.Height / rH; s = c.Tag.ToString().Split('/'); if (c.Name == s[0].ToString()) { //Use integer casting c.Width = (int)(Convert.ToInt32(s[3]) * rRW); c.Height = (int)(Convert.ToInt32(s[4]) * rRH); c.Left = (int)(Convert.ToInt32(s[1]) * rRW); c.Top = (int)(Convert.ToInt32(s[2]) * rRH); } if (hasTabs) { if (c.GetType() == typeof(TabControl)) { foreach (Control f in c.Controls) { foreach (Control j in f.Controls) //tabpage { s = j.Tag.ToString().Split('/'); if (j.Name == s[0].ToString()) { j.Width = (int)(Convert.ToInt32(s[3]) * rRW); j.Height = (int)(Convert.ToInt32(s[4]) * rRH); j.Left = (int)(Convert.ToInt32(s[1]) * rRW); j.Top = (int)(Convert.ToInt32(s[2]) * rRH); } } } } } } } // @ Form Load Event private void MyForm_Load(object sender, EventArgs e) { // Put values in the variables rW = this.Width; rH = this.Height; fW = this.Width; fH = this.Height; // Loop through the controls inside the form ie Tabcontrol Container foreach (Control c in this.Controls) { c.Tag = c.Name + "/" + c.Left + "/" + c.Top + "/" + c.Width + "/" + c.Height; // c.Anchor = (AnchorStyles.Right | AnchorStyles.Left ); if (c.GetType() == typeof(TabControl)) { foreach (Control f in c.Controls) { foreach (Control j in f.Controls) //tabpage { j.Tag = j.Name + "/" + j.Left + "/" + j.Top + "/" + j.Width + "/" + j.Height; } } } } } } } 

Saludos, Kix46