using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace CyberX8_Themes.CustomControls { public class WindowTopArea : System.Windows.Controls.Border { static WindowTopArea() { DefaultStyleKeyProperty.OverrideMetadata(typeof(WindowTopArea), new FrameworkPropertyMetadata(typeof(WindowTopArea))); } private new bool CaptureMouse = false; private enum ResizePosition { None, Left, TopLeft, Top, TopRight, Right, BottomRight, Bottom, BottomLeft } protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { Window win = Window.GetWindow(this); if (e.ClickCount == 1 && e.LeftButton == MouseButtonState.Pressed) { win.DragMove(); } else if (e.ClickCount == 2) { win.SizeToContent = SizeToContent.Manual; win.WindowState = win.WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized; } base.OnMouseLeftButtonDown(e); e.Handled = true; } protected override void OnInitialized(EventArgs e) { //SetWindowNoBorder(); //SetWindowResizer(); base.OnInitialized(e); } #region 窗体大小变化 public void SetWindowResizer() { Window win = Window.GetWindow(this); ResizePosition ResPosition = ResizePosition.None; int Resizer = 5; win.MouseMove += new MouseEventHandler( delegate (object target, MouseEventArgs args) { try { //do resize if (win.WindowState == WindowState.Normal) { Point MS = args.GetPosition(win); if (args.LeftButton == MouseButtonState.Pressed) { Win32.POINT pos = new Win32.POINT(); Win32.GetCursorPos(out pos); #region 改变窗体大小 switch (ResPosition) { case ResizePosition.Left: //左边 Mouse.SetCursor(Cursors.SizeWE); Point transPointLeft = win.PointToScreen(new Point(0, 0)); win.Left += pos.X - transPointLeft.X; win.Width += transPointLeft.X - pos.X; break; case ResizePosition.Right: //右边 Mouse.SetCursor(Cursors.SizeWE); Point transPointRight = win.PointToScreen(new Point(win.Width, 0)); win.Width += pos.X - transPointRight.X; break; case ResizePosition.Top: //顶部 Mouse.SetCursor(Cursors.SizeNS); Point transPointTop = win.PointToScreen(new Point(0, 0)); win.Top += pos.Y - transPointTop.Y; win.Height += transPointTop.Y - pos.Y; break; case ResizePosition.Bottom: //底部 Mouse.SetCursor(Cursors.SizeNS); Point transPointBottom = win.PointToScreen(new Point(0, win.Height)); win.Height += (pos.Y - transPointBottom.Y); break; case ResizePosition.TopLeft: //左上 Mouse.SetCursor(Cursors.SizeNWSE); Point transPointTopLeft = win.PointToScreen(new Point(0, 0)); win.Left += pos.X - transPointTopLeft.X; win.Top += pos.Y - transPointTopLeft.Y; win.Width += transPointTopLeft.X - pos.X; win.Height += transPointTopLeft.Y - pos.Y; break; case ResizePosition.BottomLeft: //左下 Mouse.SetCursor(Cursors.SizeNESW); Point transPointBottomLeft = win.PointToScreen(new Point(0, win.Height)); win.Left += pos.X - transPointBottomLeft.X; win.Width += transPointBottomLeft.X - pos.X; win.Height += pos.Y - transPointBottomLeft.Y; break; case ResizePosition.TopRight: //右上 Mouse.SetCursor(Cursors.SizeNESW); Point transPointTopRight = win.PointToScreen(new Point(win.Width, 0)); win.Top += pos.Y - transPointTopRight.Y; win.Width = transPointTopRight.Y - pos.X; win.Height = transPointTopRight.Y - pos.Y; break; case ResizePosition.BottomRight: //右下 Mouse.SetCursor(Cursors.SizeNWSE); Point transPointBottomRight = win.PointToScreen(new Point(win.Width, win.Height)); win.Width += pos.X - transPointBottomRight.X; win.Height += pos.Y - transPointBottomRight.Y; break; case ResizePosition.None: default: Mouse.SetCursor(Cursors.Arrow); break; } #endregion } else if (MS.X <= Resizer + 5 && MS.Y <= Resizer + 5) { //左上 (不执行) Mouse.SetCursor(Cursors.SizeNWSE); ResPosition = ResizePosition.TopLeft; } else if (MS.X <= Resizer && MS.Y >= win.ActualHeight - Resizer) { //左下 Mouse.SetCursor(Cursors.SizeNESW); ResPosition = ResizePosition.BottomLeft; } else if (MS.X >= win.ActualWidth - Resizer - 5 && MS.Y <= Resizer + 5) { //右上(不执行) Mouse.SetCursor(Cursors.SizeNESW); ResPosition = ResizePosition.TopRight; } else if (MS.X >= win.ActualWidth - Resizer && MS.Y >= win.ActualHeight - Resizer) { //右下 Mouse.SetCursor(Cursors.SizeNWSE); ResPosition = ResizePosition.BottomRight; } else if (MS.X <= Resizer) { //左边 Mouse.SetCursor(Cursors.SizeWE); ResPosition = ResizePosition.Left; } else if (MS.Y <= Resizer + 5) { //顶部(不执行) Mouse.SetCursor(Cursors.SizeNS); ResPosition = ResizePosition.Top; } else if (MS.X >= win.ActualWidth - Resizer) { //右边 Mouse.SetCursor(Cursors.SizeWE); ResPosition = ResizePosition.Right; } else if (MS.Y >= win.ActualHeight - Resizer) { //底部 Mouse.SetCursor(Cursors.SizeNS); ResPosition = ResizePosition.Bottom; } else { //无 Mouse.SetCursor(Cursors.Arrow); ResPosition = ResizePosition.None; } } } catch { ResPosition = ResizePosition.None; win.ReleaseMouseCapture(); } args.Handled = CaptureMouse; } ); win.MouseLeftButtonDown += new MouseButtonEventHandler( delegate (object target, MouseButtonEventArgs args) { if (win.WindowState == WindowState.Normal) { //获取当前鼠标点击点相对于Dvap.Shell窗体的位置 Point pos = args.GetPosition(win); if (ResPosition != ResizePosition.None) { CaptureMouse = win.CaptureMouse(); } args.Handled = CaptureMouse; } } ); win.MouseLeftButtonUp += new MouseButtonEventHandler( delegate (object target, MouseButtonEventArgs args) { if (win.WindowState == WindowState.Normal) { ResPosition = ResizePosition.None; if (CaptureMouse) { win.ReleaseMouseCapture(); CaptureMouse = false; } args.Handled = CaptureMouse; } } ); } #endregion private void SetWindowNoBorder() { Window win = Window.GetWindow(this); // 获取窗体句柄 IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(win).Handle; // 获得窗体的 样式 long oldstyle = Win32.GetWindowLong(hwnd, Win32.GWL_STYLE); // 更改窗体的样式为无边框窗体 Win32.SetWindowLong(hwnd, Win32.GWL_STYLE, (int)(oldstyle & ~Win32.WS_CAPTION)); } } }