【问题标题】:How can I resize a resizable panel control at runtime from the left-hand side?如何在运行时从左侧调整可调整大小的面板控件的大小?
【发布时间】:2020-11-22 06:32:13
【问题描述】:

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

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

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

【问题讨论】:

标签: c# resize controls runtime panel


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    相关资源
    最近更新 更多