Как я могу изменить размер элемента управления панели с изменяемым размером во время выполнения с левой стороны? - PullRequest
1 голос
/ 01 августа 2020

В моей программе есть настраиваемый пользовательский элемент управления. Это панель, размер которой нужно изменять с левой стороны. Вот мой код:

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 Ответ

1 голос
/ 01 августа 2020

Вот быстрая и грязная панель, которую можно перетащить только с левой стороны:

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, вам придется go для более точного управление с помощью метода, описанного в комментарии Джими.

...