加可拉窗口

This commit is contained in:
2025-09-02 18:41:07 +08:00
parent 29e6225cdc
commit 6de9a56916
587 changed files with 5082 additions and 519 deletions

55
Ramitta/Utils/Win32.cs Normal file
View File

@@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Ramitta.Utils
{
public class Win32
{
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
public POINT(int x, int y)
{
X = x;
Y = y;
}
}
/// <summary>
/// 带有外边框和标题的windows的样式
/// </summary>
public const long WS_CAPTION = 0X00C0000L;
/// <summary>
/// window的基本样式
/// </summary>
public static int GWL_STYLE = -16;
/// <summary>
/// window的扩展样式
/// </summary>
public static int GWL_EXSTYLE = -20;
public static int WS_EX_LAYERED = 0x00080000;
public static int WS_EX_TRANSPARENT = 0x00000020;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool GetCursorPos(out POINT pt);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowLong(nint hWnd, int nIndex);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SetWindowLong(nint hWnd, int nIndex, int newVal);
[DllImport("gdi32")]
public static extern int DeleteObject(nint obj);
}
}

View File

@@ -0,0 +1,235 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
namespace Ramitta.Utils
{
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)
{
SetWindowResizer();
base.OnInitialized(e);
}
#region
public void SetWindowResizer()
{
Window win = Window.GetWindow(this);
ResizePosition ResPosition = ResizePosition.None;
int Resizer = 10;
int ResizerSpeed = 10;
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 + ResizerSpeed && MS.Y <= Resizer + ResizerSpeed)
{
//左上 (不执行)
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 - ResizerSpeed && MS.Y <= Resizer + ResizerSpeed)
{
//右上(不执行)
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 + ResizerSpeed)
{
//顶部(不执行)
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
}
}