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

时间:2020-08-01 17:48:20

标签: c# resize controls runtime panel

我的程序中有一个自定义用户控件。这是一个面板,需要从左侧调整大小。这是我的代码:

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

从理论上讲,解决方案是随着宽度的增加将面板向左移动新的宽度。这就是这段代码应该做的。目前的问题是,随着面板向左移动,宽度保持不变并且不会增加。有没有办法做到这一点,这样我就可以抓住左侧的控件并向左拖动,从而使尺寸增加并且看起来保持在原处?

1 个答案:

答案 0 :(得分:1)

这是一个快速且肮脏的面板,只能从左侧拖动:

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注释中所述的方法进行更好的控制。