像IDE那样调整控件的大小

  最近在做一个新的项目,遇到一个小问题就是界面上的控件需要能够让用户手动调节大小,类似vs那样通过拖拽进行实现。一开始想通过重绘,但是事件的监听那块又不知道要怎么搞,而且自己对GDI+也不是很熟,后面查了官方的资料发现了两个方法,所以在这里分享一下。

下面介绍方法一

protected override CreateParams CreateParams
        {
            get
            {
                var cp = base.CreateParams;
                cp.Style |= 0x00040000;  // Turn on WS_BORDER + WS_THICKFRAME
                return cp;
            }
        }

通过重写CreateParams事件,重绘了控件的边框,先调用基类的绘制事件,然后将设置一下格式,类似于一个控制参数,这种方法可用程度已经很高了,调整方式于IDE基本一致,但是有一个弊端就是会给控件加上了一个边框,样子是这样的,怎么说呢,感觉看起来有点别扭,所以找了下面的方法。

下面介绍方法二

首先设置一下属性this.ResizeRedraw = true;

protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            var rc = new Rectangle(this.ClientSize.Width - grab, this.ClientSize.Height - grab, grab, grab);
            ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc);
        }
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (m.Msg == 0x84)
            {  // Trap WM_NCHITTEST
                var pos = this.PointToClient(new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16));
                if (pos.X >= this.ClientSize.Width - grab && pos.Y >= this.ClientSize.Height - grab)
                    m.Result = new IntPtr(17);  // HT_BOTTOMRIGHT
            }
        }
        private const int grab = 16;

这个方法区别于三个方法的地方在于,首先手动绘制了一个三角形在控件的右下角,然后重写了窗体事件处理,主要就是获取鼠标的事件,然后进行响应,这个方法的效果是这样子的

希望能给需要的人看到,希望寄几接下来能快点把这个项目搞完,写这个博客也是为了勉励一下自己,不至于整天想着回家卖牛肉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值