您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: