Tôi đang thiết kế cửa sổ tùy chỉnh của riêng mình trong WPF và tôi đã cố gắng triển khai chức năng thay đổi kích thước mà tôi đã sử dụng trước đó trong WinForms. Vì lý do nào đó, giá trị trả lại của WndProc của tôi không cho tôi kết quả đúng.WPF Borderless window resize
Tôi có một lớp NativeMethods cho tất cả các thư WndProc và kết quả của tôi:
public class NativeMethods
{
public const int WM_NCHITTEST = 0x84;
public const int HTCAPTION = 2;
public const int HTLEFT = 10;
public const int HTRIGHT = 11;
public const int HTTOP = 12;
public const int HTTOPLEFT = 13;
public const int HTTOPRIGHT = 14;
public const int HTBOTTOM = 15;
public const int HTBOTTOMLEFT = 16;
public const int HTBOTTOMRIGHT = 17;
}
Và đây là đoạn code sau cho cửa sổ của tôi:
public partial class MainWindow : Window
{
const int GripSize = 16;
const int BorderSize = 7;
public MainWindow()
{
InitializeComponent();
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
IntPtr windowHandle = new WindowInteropHelper(this).Handle;
HwndSource windowSource = HwndSource.FromHwnd(windowHandle);
windowSource.AddHook(WndProc);
}
private IntPtr WndProc(IntPtr hwnd, int msg,
IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == NativeMethods.WM_NCHITTEST)
{
int x = lParam.ToInt32() <<16>> 16, y = lParam.ToInt32() >> 16;
Point pos = PointFromScreen(new Point(x, y));
if (pos.X > GripSize &&
pos.X < ActualWidth - GripSize &&
pos.Y >= ActualHeight - BorderSize)
{
return (IntPtr)NativeMethods.HTBOTTOM; // This doesn't work?
}
// Top, Left, Right, Corners, Etc.
}
return IntPtr.Zero;
}
}
tôi mong đợi con trỏ để thay đổi " thay đổi kích thước mũi tên xuống "và chức năng thay đổi kích thước để hoạt động như trong dự án WinForms của tôi. Tôi đã thiết lập các điểm ngắt và trả về HTBOTTOM đang kích hoạt khi con trỏ ở vị trí mong muốn. Trong XAML tôi đã đặt ResizeMode thành CanResize và WindowStyle được đặt thành None. Tôi đang làm gì sai?
Tại sao không sử dụng 'ResizeMode =" CanResizeWithGrip "'? Bạn đang cố gắng để đạt được hiệu ứng này (chỉ để thay đổi kích thước nó xung quanh cửa sổ mà không có 'Grip')? –
Bởi vì tôi vẫn muốn có thể thay đổi kích thước cửa sổ từ bất kỳ góc hoặc bên nào như chức năng bình thường. Tôi đã tìm ra vấn đề và tôi đang đăng câu trả lời ngay bây giờ. –