Sto progettando la mia finestra personalizzata in WPF e ho cercato di implementare la funzionalità di ridimensionamento che ho usato in precedenza in WinForms. Per qualche motivo il valore di ritorno del mio WndProc non mi sta dando il risultato corretto.Ridimensionamento della finestra senza bordi WPF
Ho una classe NativeMethods per tutti i miei messaggi WNDPROC e risultati:
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;
}
Ed ecco il codice sottostante per la mia finestra:
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;
}
}
mi aspettavo il cursore per passare alla " ridimensiona la freccia in giù "e la funzionalità di ridimensionamento funziona come nel mio progetto WinForms. Ho impostato i breakpoint e il ritorno HTBOTTOM si attiva quando il cursore si trova nella posizione prevista. In XAML ho impostato ResizeMode su CanResize e WindowStyle su None. Che cosa sto facendo di sbagliato?
Perché non usare 'ResizeMode = "CanResizeWithGrip"'? Stai cercando di ottenere questo effetto (solo per ridimensionarlo intorno alla finestra senza 'Grip')? –
Perché voglio ancora poter ridimensionare la finestra da qualsiasi angolo o lato come la normale funzionalità. Ho capito il problema e sto postando la risposta ora. –