WPF无边框发送消息改变窗口大小
2017-07-13 14:32
405 查看
用WPF做的无边框窗口真的很漂亮,但无法像有边框窗口操作方便,上篇转载别人通过捕获WM_NCHITTEST消息来完成改变大小和拖动功能,是通过传过来的lParam里面的鼠标位置坐标(相对与屏幕),把指定的位置坐标变成不同的功能区。而这次项目中有用到,但是用控件的一些事件来完成,也是通过获取鼠标位置(相对窗口),在指定位置改变鼠标图标DisplayResizeCursor,发送消息给窗口,实现拖动功能Resize,但发送的这个消息还没弄明白,找时间仔细看下。全部代码如下:
构造函数:
构造函数:
this.SourceInitialized += new EventHandler(MyMacClass_SourceInitialized); dragBorder.MouseLeftButtonDown += delegate { DragMove(); }; dragBorder.PreviewMouseDown += delegate { Resize(null, null); }; dragBorder.MouseMove += delegate { DisplayResizeCursor(null, null); }; this.PreviewMouseMove += delegate { ResetCursor(null, null); };
public double relativeClip = 10; public enum ResizeDirection { Left = 1, Right = 2, Top = 3, TopLeft = 4, TopRight = 5, Bottom = 6, BottomLeft = 7, BottomRight = 8, } private void ResizeWindow(ResizeDirection direction) { SendMessage(hs.Handle, WM_SYSCOMMAND, (IntPtr)(61440 + direction), IntPtr.Zero); }
private void DisplayResizeCursor(object sender, MouseEventArgs e) { Point pos = Mouse.GetPosition(this); double x = pos.X; double y = pos.Y; double w = this.ActualWidth; //注意这个地方使用ActualWidth,才能够实时显示宽度变化 double h = this.ActualHeight; if (x <= relativeClip & y <= relativeClip) // left top { this.Cursor = Cursors.SizeNWSE; } if (x >= w - relativeClip & y <= relativeClip) //right top { this.Cursor = Cursors.SizeNESW; } if (x >= w - relativeClip & y >= h - relativeClip) //bottom right { this.Cursor = Cursors.SizeNWSE; } if (x <= relativeClip & y >= h - relativeClip) // bottom left { this.Cursor = Cursors.SizeNESW; } if ((x >= relativeClip & x <= w - relativeClip) & y <= relativeClip) //top { this.Cursor = Cursors.SizeNS; } if (x >= w - relativeClip & (y >= relativeClip & y <= h - relativeClip)) //right { this.Cursor = Cursors.SizeWE; } if ((x >= relativeClip & x <= w - relativeClip) & y > h - relativeClip) //bottom { this.Cursor = Cursors.SizeNS; } if (x <= relativeClip & (y <= h - relativeClip & y >= relativeClip)) //left { this.Cursor = Cursors.SizeWE; } }
private void ResetCursor(object sender, MouseEventArgs e) { if (Mouse.LeftButton != MouseButtonState.Pressed) { this.Cursor = Cursors.Arrow; } }
private void Resize(object sender, MouseButtonEventArgs e) { Point pos = Mouse.GetPosition(this); double x = pos.X; double y = pos.Y; double w = this.ActualWidth; double h = this.ActualHeight; if (x <= relativeClip & y <= relativeClip) // left top { this.Cursor = Cursors.SizeNWSE; ResizeWindow(ResizeDirection.TopLeft); } if (x >= w - relativeClip & y <= relativeClip) //right top { this.Cursor = Cursors.SizeNESW; ResizeWindow(ResizeDirection.TopRight); } if (x >= w - relativeClip & y >= h - relativeClip) //bottom right { this.Cursor = Cursors.SizeNWSE; ResizeWindow(ResizeDirection.BottomRight); } if (x <= relativeClip & y >= h - relativeClip) // bottom left { this.Cursor = Cursors.SizeNESW; ResizeWindow(ResizeDirection.BottomLeft); } if ((x >= relativeClip & x <= w - relativeClip) & y <= relativeClip) //top { this.Cursor = Cursors.SizeNS; ResizeWindow(ResizeDirection.Top); } if ((x >= relativeClip & x <= w - relativeClip) & y > h - relativeClip) //bottom { this.Cursor = Cursors.SizeNS; ResizeWindow(ResizeDirection.Bottom); } if (x >= w - relativeClip & (y >= relativeClip & y <= h - relativeClip)) //right { this.Cursor = Cursors.SizeWE; ResizeWindow(ResizeDirection.Right); } if (x <= relativeClip & (y <= h - relativeClip & y >= relativeClip)) //left { this.Cursor = Cursors.SizeWE; ResizeWindow(ResizeDirection.Left); } }
[DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private void MyMacClass_SourceInitialized(object sender, EventArgs e) { hs = PresentationSource.FromVisual((Visual)sender) as HwndSource; //hs.AddHook(new HwndSourceHook(WndProc)); }
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case 0x0024:/* WM_GETMINMAXINFO */ default: break; } return IntPtr.ZERO; }
相关文章推荐
- WPF无边框捕获消息改变窗口大小
- wpf改变默认的窗口边框大小,去掉边框,并且可以拖动大小
- 窗口大小改变时,发送的消息
- node-webkit无边框窗口用纯JS实现拖动改变大小
- 改变程序显示模式(获取窗口大小、状态栏大小、标题栏大小、边框大小)
- DUI程序Demo2(注意拖动程序的边框改变程序界面的大小,OnNcHitTest消息中处理)
- WPF 动态改变窗口大小
- c#利用消息给无边框窗体改变大小
- winform 无边框窗口 可改变窗体大小
- 窗口移动、改变大小的有关消息
- Winform无边框窗口拖动及改变窗口大小
- WPF 无框窗口改变大小
- Win32 SDK程序中拖动Thin边框窗口来改变窗口大小
- WM_SIZE 改变窗口大小 消息
- node-webkit无边框窗口用纯JS实现拖动改变大小
- Pyqt实现无边框窗口拖动及改变窗口大小
- C#可调用API接口来获取窗口句柄,发送消息控制其余程序窗体大小
- WPF 下无边框窗体改变大小和移动
- MFC_OnSize_改变窗口大小(WM_SIZE消息映射)
- java中 实现无标题无边框的窗体能够用鼠标拖动改变窗口大小