如何在运行时从左侧调整可调整大小的面板控件的大小?
How can I resize a resizable panel control at runtime from the left-hand side?
我的程序中有一个自定义用户控件。这是一个需要从左侧调整大小的面板。这是我的代码:
private void ResizePanel_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && e.X == ClientRectangle.Left)
{
resizeMode = true;
}
}
private void ResizePanel_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
resizeMode = false;
}
}
private void ResizePanel_MouseMove(object sender, MouseEventArgs e)
{
if (resizeMode == true)
{
Size newSize = new Size();
newSize.Height = Height;
newSize.Width = Math.Abs(e.X - ClientRectangle.Left); // Distance between the mouse position and
// left side of the panel
if (e.X < this.ClientRectangle.Left)
{
Width = newSize.Width;
Left -= newSize.Width;
}
}
}
理论上,解决方案是随着宽度的增加将面板向左移动新的宽度。这就是这段代码应该做的。目前的问题是,当面板向左移动时,宽度保持不变,不会增加。有没有办法做到这一点,这样我就可以抓住左侧的控件并向左拖动,这样尺寸会增加并且看起来会保持原样?
这是一个只能从左侧拖动的快速但肮脏的面板:
class LeftSideResizePanel : Panel
{
private const int HTLEFT = 10;
private const int HTCLIENT = 1;
private const int WM_NCHITTEST = 0x0084;
private const int WS_THICKFRAME = 0x40000;
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.Style |= WS_THICKFRAME;
return cp;
}
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
Point pt = this.PointToClient(new Point(m.LParam.ToInt32()));
Rectangle hit = new Rectangle(new Point(-3, 0), new Size(6, this.Height));
m.Result = hit.Contains(pt) ? (IntPtr)HTLEFT : (IntPtr)HTCLIENT;
return;
}
base.WndProc(ref m);
}
}
如果您不喜欢 WS_THICKFRAME 给出的外观,您将不得不使用 Jimi 评论中描述的方法进行更精细的控制。
我的程序中有一个自定义用户控件。这是一个需要从左侧调整大小的面板。这是我的代码:
private void ResizePanel_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && e.X == ClientRectangle.Left)
{
resizeMode = true;
}
}
private void ResizePanel_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
resizeMode = false;
}
}
private void ResizePanel_MouseMove(object sender, MouseEventArgs e)
{
if (resizeMode == true)
{
Size newSize = new Size();
newSize.Height = Height;
newSize.Width = Math.Abs(e.X - ClientRectangle.Left); // Distance between the mouse position and
// left side of the panel
if (e.X < this.ClientRectangle.Left)
{
Width = newSize.Width;
Left -= newSize.Width;
}
}
}
理论上,解决方案是随着宽度的增加将面板向左移动新的宽度。这就是这段代码应该做的。目前的问题是,当面板向左移动时,宽度保持不变,不会增加。有没有办法做到这一点,这样我就可以抓住左侧的控件并向左拖动,这样尺寸会增加并且看起来会保持原样?
这是一个只能从左侧拖动的快速但肮脏的面板:
class LeftSideResizePanel : Panel
{
private const int HTLEFT = 10;
private const int HTCLIENT = 1;
private const int WM_NCHITTEST = 0x0084;
private const int WS_THICKFRAME = 0x40000;
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.Style |= WS_THICKFRAME;
return cp;
}
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
Point pt = this.PointToClient(new Point(m.LParam.ToInt32()));
Rectangle hit = new Rectangle(new Point(-3, 0), new Size(6, this.Height));
m.Result = hit.Contains(pt) ? (IntPtr)HTLEFT : (IntPtr)HTCLIENT;
return;
}
base.WndProc(ref m);
}
}
如果您不喜欢 WS_THICKFRAME 给出的外观,您将不得不使用 Jimi 评论中描述的方法进行更精细的控制。