用户如何在winforms中在运行时调整控件大小

说我有一个pictureBox。

现在我想要的是用户应该可以随意调整pictureBox的大小。 但是我不知道如何开始这件事。 我搜索了互联网,但信息很少。

任何人都可以至少指导我从哪里开始?

这很容易做到,Windows中的每个窗口都具有可resize的天生能力。 它只是关闭PictureBox,您可以通过侦听WM_NCHITTEST消息重新打开它。 您只需告诉Windows光标位于窗口的一角,您就可以免费获得其他所有内容。 您还需要绘制一个抓握手柄,以便用户清楚地看到拖动角落会调整框的大小。

在项目中添加一个新类并粘贴下面显示的代码。 构建+构建。 您将在工具箱顶部获得一个新控件,将其放在表单上。 设置Image属性,然后设置为尝试它。

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; } 

另一种非常便宜的免费resize的方法是给控件一个可resize的边框。 适用于所有角落和边缘。 将此代码粘贴到类中(您不再需要WndProc):

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

这是一篇文章

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

应该帮助你,因为它在vb这里是一个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; } } 

和重新resize的function

 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(); } } 

使用本文中的 ControlMoverOrResizer类,您可以在运行时使用一行代码执行可移动和可resize的控件! :)示例:

ControlMoverOrResizer.Init(按钮1);

现在button1是一个可移动且可resize的控件!

创建一个新的c#winform应用程序并粘贴它:

当它帮助你时别忘了说谢谢……

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; } } } } } } } 

此致,Kix46