我把一个Form的FormBorderStyle设置为none,然后它就没有边框了,我要模拟一个边框,于是,我就放了4个panel在四边,模拟边框。
现在,拖拽右边框的代码写好了,而且有效:
private void panel_right_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Size = new Size(this.PointToClient(MousePosition).X, this.Height);
this.panel_right.Location = new Point(
this.Width - 8,//8就是这个panel的宽度
0);
}
}
请问各位高手,如何拖动左边框以调整窗体尺寸、如何拖动上边框以调整窗体尺寸?
------解决思路----------------------
为什么放4个panel
代码判断鼠标位置如果在窗体的最右边,就修改一下鼠标样式,然后左键点下就修改大小,不就得了
右边的会改,左边的有什么区别吗
我知道你纠结在哪里
你现在是把鼠标的当前X轴坐标当做窗体宽度直接赋值给窗体了
你应该在左键点下时记录当前的坐标,然后在拖动时判断拖动后的坐标和点下时的坐标到底相差了多少(有正有负)
而且应该获取的是屏幕坐标,而不是鼠标相对于窗体的坐标
否则鼠标在左边时,坐标永远是0,你怎么知道拖动过
------解决思路----------------------
试试这个
不用放4个Panel,在窗体上加上
private const int WM_NCLBUTTONDBLCLK = 163;
private const int WM_NCHITTEST = 132;
/// <summary>
/// 边框改变大小
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCLBUTTONDBLCLK://WM_NCLBUTTONDBLCLK=163 <0xA3>拦截鼠标非客户区左键双击消息,决定窗体是否最大化显示
if (this.MaximizeBox)
{
base.WndProc(ref m);
this.Invalidate();
}
return;
case WM_NCHITTEST://WM_NCHITTEST=132 <0x84>
base.WndProc(ref m);//如果去掉这一行代码,窗体将失去MouseMove..等事件
//Point lpint = new Point((int)m.LParam);//可以得到鼠标坐标,这样就可以决定怎么处理这个消息了,是移动窗体,还是缩放,以及向哪向的缩放
//if (lpint.Y < 30)
// m.Result = (IntPtr)0x2;//托动HTCAPTION=2 <0x2>
if (WindowState != FormWindowState.Maximized)
{
Point p2 = this.PointToClient(MousePosition);//鼠标相对于窗体的坐标
//当然可以托动也可以改变大小了
//label1.Text = p2.X + "," + p2.Y;
//HTLEFT=10 <0xA> 左边框
if (p2.X < 5 && p2.Y > 5 && p2.Y < this.Height - 5)
m.Result = (IntPtr)0xA;
else if (p2.Y < 5 && p2.X > 5 && p2.X < this.Width - 5)
m.Result = (IntPtr)0xC;
//HTTOP=12 <0xC> 上边框
else if (p2.X < 5 && p2.Y < 5)
m.Result = (IntPtr)0xD;
//HTTOPLEFT=13 <0xD>
else if (p2.X >= this.Width - 5 && p2.Y < 5)
m.Result = (IntPtr)0xE;
//HTTOPRIGHT=14 <0xE>
else if (p2.X > this.Width - 5 && p2.Y > 5 && p2.Y < this.Height - 5)
m.Result = (IntPtr)0xB;
//HTRIGHT=11 <0xB>
else if (p2.Y >= this.Height - 5 && p2.X > 5 && p2.X < this.Width - 5)
m.Result = (IntPtr)0xF;
//HTBOTTOM=15 <0xF>
else if (p2.X < 5 && p2.Y >= this.Height - 5)
m.Result = (IntPtr)0x10;
//HTBOTTOMLEFT=16 <0x10>
else if (p2.X > this.Width - 5 && p2.Y >= this.Height - 5)
m.Result = (IntPtr)0x11;
//HTBOTTOMRIGHT=17 <0x11>
//HTBORDER=18 <0x12>
//HTMINBUTTON=8 <0x8> 最小化按钮
//HTMAXBUTTON=9 <0x9> 最大化按钮
//HTCLOSE=20 <0x14> 关闭按钮
}
return;
default:
base.WndProc(ref m);
return;
}
}
------解决思路----------------------
如果仅仅是为了模拟边框,你在OnPaint里重绘一下,在四周加个阴影什么的就好了
panel是容器,不要用它来绘图