Niestandardowy uchwyt zmiany rozmiaru w formie C # bez obramowania

Próbuję tworzyć formularze bez obramowania, które wyskakują z paska narzędzi. Chcę, aby użytkownik mógł chwycić w prawym dolnym rogu („uchwyt zmiany rozmiaru”) i móc zmienić rozmiar formularza, ale nie może zmieniać rozmiaru ani zmieniać położenia formularza w żaden inny sposób.

Słyszałem, że mogę przechwycićWM_NCHITTEST wiadomość wysłana do formularza i ustaw jego wynik naHTBOTTOMRIGHT co pozwoli systemowi operacyjnemu obsłużyć zmianę rozmiaru formularza, tak jakby miał sporą ramkę. Pomysł polegał na wykryciu, czy wskaźnik myszy wszedł w pole zdefiniowane w rogu, a jeśli tak, to zwróćHTBOTTOMRIGHT wynik.

To nie działa tak, jak się tego spodziewałem. Jestem w stanie przechwycić wiadomość, ale wydaje się, że wiadomość jest wysyłana tylko wtedy, gdy użytkownik umieści kursor myszy na grubej krawędzi formularza 1px. Oznacza to, że działa tak, jak chcę, jeśli bardzo precyzyjnie umieścisz kursor na dolnych prawych krawędziach.

Tutaj jest mójWndProc nadpisanie:

protected override void WndProc(ref Message m)
{
    const UInt32 WM_NCHITTEST = 0x0084;
    const UInt32 HTBOTTOMRIGHT = 17;
    const int RESIZE_HANDLE_SIZE = 40;
    bool handled = false;
    if (m.Msg == WM_NCHITTEST)
    {
        Size formSize = this.Size;
        Point screenPoint = new Point(m.LParam.ToInt32());
        Point clientPoint = this.PointToClient(screenPoint);
        Rectangle hitBox = new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE);
        if (hitBox.Contains(clientPoint))
        {
            m.Result = (IntPtr)HTBOTTOMRIGHT;
            handled = true;
        }
    }

    if (!handled)
        base.WndProc(ref m);
}

Czy robię coś złego lub czy jest lepszy sposób na zrobienie tego, co próbuję zrobić?

Wielkie dzięki.

questionAnswers(4)

yourAnswerToTheQuestion