如何在运行时从左侧调整可调整大小的面板控件的大小?

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 评论中描述的方法进行更精细的控制。