一般情况,无边框窗体用拖动来改变大小是蛮容易的。通过重载窗体的WndProc函数即可,
点此处见详情!然而,我目前的情况并不适合用这种方法。
大伙都用过暴风影音,它有一种“最小界面”,设置它以后,只看到播放区域:控制栏、菜单栏、状态栏都不可见。这时,它还能在四个角、四条边通过拖动来改变窗口的大小。我也想给我的播放器加上这个功能。毫无疑问,我得设置wmp.Dock=DockStyle.Fill。然而fill造成的结果是,鼠标消息都给了播放器控件,而窗口没有捕获鼠标消息了。所以,那种重载WndProc的方法不行了。郁闷。
在网上查了一下,还有一种方法能实现这个功能,通过mousemove/mousedown,mouseup三事件实现。手工捕获鼠标、并改变窗口大小,这下子麻烦了。我初略实现了一下,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace TestWMP
{
public partial class Form1 : Form
{
private bool bStartDrag = false; //是否正在拖动控件的大小
private EnumMousePosition starttPosition = EnumMousePosition.None; //当前鼠标位置
private Size minSize = new Size(50, 50); //控件的最小大小
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 获得鼠标所在区域
/// </summary>
/// <param name="ctl"></param>
/// <param name="p"></param>
/// <returns></returns>
private EnumMousePosition GetPosition(Control ctl,Point p)
{
//鼠标在四个角上的判断范围
Size s=new Size(10,10);
//在四个角上
if (p.X >= 0 && p.X <= s.Width && p.Y >= 0 && p.Y <= s.Height) return EnumMousePosition.LeftTop;
if (p.X >= ctl.Width - s.Width && p.X <= ctl.Width && p.Y >= 0 && p.Y <= s.Height) return EnumMousePosition.RightTop;
if (p.X >= 0 && p.X <= s.Width && p.Y >= ctl.Height - s.Height && p.Y <= ctl.Height) return EnumMousePosition.LeftBottom;
if (p.X >= ctl.Width - s.Width && p.X <= ctl.Width && p.Y >= ctl.Height - s.Height && p.Y <= ctl.Height) return EnumMousePosition.RightBottom;
//不在四个角但在四条边上时
if (p.X >= 0 && p.X <= s.Width) return EnumMousePosition.Left;
if (p.X >= ctl.Width - s.Width && p.X <= ctl.Width) return EnumMousePosition.Right;
if (p.Y >= 0 && p.Y <= s.Height) return EnumMousePosition.Top;
if (p.Y >= ctl.Height - s.Height && p.Y <= ctl.Height) return EnumMousePosition.Bottom;
return EnumMousePosition.None;
}
private void SetCursor(EnumMousePosition p,bool bPress)
{
switch (p)
{
case EnumMousePosition.Left:
this.Cursor = Cursors.SizeWE; break;
case EnumMousePosition.Right:
this.Cursor = Cursors.SizeWE; break;
case EnumMousePosition.Top:
this.Cursor = Cursors.SizeNS; break;
case EnumMousePosition.Bottom:
this.Cursor = Cursors.SizeNS; break;
case EnumMousePosition.LeftTop:
this.Cursor = Cursors.SizeNWSE; break;
case EnumMousePosition.RightBottom:
this.Cursor = Cursors.SizeNWSE; break;
case EnumMousePosition.RightTop:
this.Cursor = Cursors.SizeNESW; break;
case EnumMousePosition.LeftBottom:
this.Cursor = Cursors.SizeNESW; break;
case EnumMousePosition.None:
{
if(bPress&&!bStartDrag) this.Cursor = Cursors.SizeAll;
break;
}
}
}
private void axWindowsMediaPlayer1_MouseMoveEvent(object sender, AxWMPLib._WMPOCXEvents_MouseMoveEvent e)
{
//当鼠标按下左键离开窗口时仍然捕获
wmp.Capture = true;
System.Diagnostics.Debug.Print(e.fX.ToString());
//鼠标当前位置
Point cp= new Point(e.fX, e.fY);
EnumMousePosition currentPosition = GetPosition(wmp,cp);
bool bPress = e.nButton == 1;
SetCursor(currentPosition, bPress);
if (bPress)
{
System.Diagnostics.Debug.Print(starttPosition.ToString());
switch (starttPosition)
{
case EnumMousePosition.Left:
{
int x = cp.X;
cp = this.PointToScreen(cp);
this.Left = cp.X;
this.Width = this.Width - x;
break;
}
case EnumMousePosition.Right:
{
this.Width = cp.X;
break;
}
case EnumMousePosition.Top:
{
int y = cp.Y;
cp = this.PointToScreen(cp);
this.Top = cp.Y;
this.Height = this.Height - y;
break;
}
case EnumMousePosition.Bottom:
{
this.Height = cp.Y; break;
}
case EnumMousePosition.LeftTop:
{
Point p = cp;
cp = this.PointToScreen(cp);
this.Left = cp.X;
this.Top = cp.Y;
this.Width = this.Width - p.X;
this.Height = this.Height - p.Y;
break;
}
case EnumMousePosition.RightBottom:
{
this.Width = cp.X;
this.Height = cp.Y;
break;
}
case EnumMousePosition.LeftBottom:
{
Point p = cp;
cp = this.PointToScreen(cp);
this.Left = cp.X;
this.Width = this.Width - p.X;
this.Height = p.Y;
break;
}
case EnumMousePosition.RightTop:
{
Point p = cp;
cp = this.PointToScreen(cp);
this.Top = cp.Y;
this.Height = this.Height - p.Y;
this.Width = p.X;
break;
}
}
wmp.Refresh();
}
}
private void wmp_MouseUpEvent(object sender, AxWMPLib._WMPOCXEvents_MouseUpEvent e)
{
bStartDrag = false;
wmp.Capture = false;
this.Cursor = Cursors.Arrow;
}
private void wmp_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
{
if (e.nButton == 1)
{
starttPosition = GetPosition(wmp, new Point(e.fX, e.fY));
bStartDrag = true;
}
}
}
//定义一个枚举类型,描述光标状态
public enum EnumMousePosition
{
Left=0,
Right=1,
Top=2,
Bottom=3,
LeftTop=4,
RightTop=5,
LeftBottom=6,
RightBottom=7,
None=-1
}
}
评论