最近在做一个新的项目,遇到一个小问题就是界面上的控件需要能够让用户手动调节大小,类似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;
这个方法区别于三个方法的地方在于,首先手动绘制了一个三角形在控件的右下角,然后重写了窗体事件处理,主要就是获取鼠标的事件,然后进行响应,这个方法的效果是这样子的
希望能给需要的人看到,希望寄几接下来能快点把这个项目搞完,写这个博客也是为了勉励一下自己,不至于整天想着回家卖牛肉