Пользовательский конструктор форм, перемещение / изменение размеров элементов управления с помощью WinAPI - PullRequest
0 голосов
/ 18 апреля 2009

Мне нужно исправить некоторые проблемы и улучшить дизайнер форм, написанный давно для проекта базы данных. В коде класса Design Panel я встретил эти строки

private void DesignPanel_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        (sender as Control).Capture = false;
        switch (FMousePosition)
        {
        case MousePosition.mpNone: 
            SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF009, 0);
            break;// Move
        case MousePosition.mpRightBottom: 
            SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF008, 0);
            break;//RB
        case MousePosition.mpLeftBottom: 
            SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF007, 0); 
            // ... here are similar cases ...
        case MousePosition.mpLeft:
            SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF001, 0);
            break;//L  
        }
    }
}

FMousePosition указывает, была ли мышь над любым краем выбранного элемента управления.

Что меня смущает, так это сообщения Windows: кажется, нет документации по WM_SYSCOMMAND с параметрами 0xF001-0xF009 (возможно, она запускает какую-то последовательность «перетаскивания / изменения размера»). Есть идеи?

Если мое предложение верно, то как я могу отменить эти последовательности?

Ответы [ 3 ]

3 голосов
/ 18 апреля 2009

Это недокументированные параметры. После поиска мне удалось найти этот список.

  • 0xF000 (центральный курсор на форме)
  • 0xF001 (изменить размер слева)
  • 0xF002 (изменить размер справа)
  • 0xF003 (изменить размер вверх)
  • 0xF004 (заблокируйте нижний правый угол формы, верхний левый угол переместите для изменения размера)
  • 0xF005 (То же в левом нижнем углу)
  • 0xF006 (заблокировать правую и левую границу, изменить размер другого)
  • 0xF007 (блокировка и правая граница, изменение размера другой границы)
  • 0xF008 (заблокировать левую и верхнюю границу и изменить размер другой)
  • 0xF009 (Перетащите из любого места)
  • 0xF010 (поместите курсор по центру в верхнем порядке)
  • 0xF020 (форма автоматического минимизации)
  • 0xF030 (форма авторазвертки)

Ссылка: http://www.delphi3000.com/articles/article_1054.asp#Comments

1 голос
/ 18 апреля 2009

На основе моего программирования Win32 (Ректор и новичок) p902-903 объясняет, WM_SYSCOMMAND отправляется, когда пользователь выбирает элемент из системного меню (вместо отправки обычного WM_COMMAND).

Справка MSDN говорит, что SC_SIZE = 0xF000 и it и Программирование Win32 также говорят, что Windows использует четыре младших бита предопределенных идентификаторов системного меню внутри но не продолжает разъяснять их использование. Огромное спасибо за разъяснения.

0 голосов
/ 18 апреля 2009

См. APIViewer и проверьте константы, начиная с SC_

...