Перетаскиваемая проблема WinForm - PullRequest
1 голос
/ 29 мая 2009

У меня есть форма окна, которую можно перемещать, щелкая и перетаскивая любую часть формы. Я использовал метод переопределения WndProc и установил результат функции NCHITTEST равным HTCAPTION, чтобы обмануть форму, подумав, что я щелкнул заголовок - чтобы он включал перетаскивание.

Код для этого прекрасно работает, и ниже:

protected override void WndProc(ref Message msg)
    {
      if (msg.Msg == (int)WinAPI.NCHITTEST)
            {
                DefWndProc(ref msg);
                if ((int)msg.Result == (int)MousePositionCodes.HTCLIENT)
                {
                   msg.Result = (IntPtr)MousePositionCodes.HTCAPTION;
                   return;
                }
            }
        }
        base.WndProc(ref msg);
    }

Проблема возникает, когда я вставляю ToolStripPanel в форму (она действует как перетаскиваемая панель инструментов). Мне нужна любая часть ToolStripPanel, которая не покрыта ToolStrip, для передачи сообщений, необходимых для перехода всей формы в режим перетаскивания.

Я создал свой собственный класс ToolStripContainer для переопределения функции WndProc и попытался использовать ту же функцию, что и выше, но он заставляет ToolStripContainer переходить в режим перетаскивания в форме, что не является желаемой функциональностью .

Я также попытался передать сообщения NCHITTEST родителю, а также создать новое сообщение с текущими координатами мыши и отправить его родителю, используя WinAPI и дескриптор окна родителя.

Мне здесь не хватает чего-то простого ... У кого-нибудь есть идеи?

1 Ответ

6 голосов

Попробуйте в WndProc вашего собственного ToolStripContainer, где вы тестируете WM_NCHITTEST, возвращая HTTRANSPARENT (-1) для области, где вы хотите, чтобы произошло перетаскивание. Это приведет к тому, что сообщение перейдет по цепочке к вашей форме, где вы его обрабатываете, и вернет HTCAPTION, чтобы произошло перетаскивание.

Надеюсь, это поможет.

...