Как запретить элементу управления изменять Z-порядок? - PullRequest
2 голосов
/ 27 февраля 2009

У меня есть пользовательский элемент управления в .Net, где я использую тест на попадание в WndProc, чтобы разрешить изменение размера во время выполнения с помощью мыши.

Проблема заключается в том, что после успешного нажатия кнопки мыши (нажатие кнопки мыши, перетаскивание для изменения размера, отпускание мыши) элемент управления переходит вверх в порядке Z и разрушает его положение в форме.

Мне нужен тест на попадание, так как это очень настраиваемый элемент управления.

Есть ли способ в WndProc не дать элементу управления изменить его Z-порядок?

Спасибо.

Код проверки попадания:

protected override void WndProc(ref Message m) {
  if (!DesignMode && Sizeable && (m.Msg == Win32Wrapper.WM_NCHITTEST)) {
    Point Hit = new Point((int)m.LParam & 0xFFFF, (int)m.LParam >> 16);
    Hit = this.PointToClient(Hit);
    int DistToBorder = 5;
    if (Hit.X < DistToBorder) {
      if (Hit.Y < DistToBorder) {
        m.Result = (IntPtr)Win32Wrapper.HTTOPLEFT;
        return;
      }
      if (Hit.Y > this.ClientRectangle.Bottom - DistToBorder) {
        m.Result = (IntPtr)Win32Wrapper.HTBOTTOMLEFT;
        return;
      }
      m.Result = (IntPtr)Win32Wrapper.HTLEFT;
      return;
    }
    else if (Hit.X > ClientRectangle.Right - DistToBorder) {
      if (Hit.Y < DistToBorder) {
        m.Result = (IntPtr)Win32Wrapper.HTTOPRIGHT;
        return;
      }
      else if (Hit.Y > this.ClientRectangle.Bottom - DistToBorder) {
        m.Result = (IntPtr)Win32Wrapper.HTBOTTOMRIGHT;
        return;
      }
      m.Result = (IntPtr)Win32Wrapper.HTRIGHT;
      return;
    }
    else if (Hit.Y < DistToBorder) {
      m.Result = (IntPtr)Win32Wrapper.HTTOP;
      return;
    }
    else if (Hit.Y > this.ClientRectangle.Bottom - DistToBorder) {
      m.Result = (IntPtr)Win32Wrapper.HTBOTTOM;
      return;
    }
  }

Ответы [ 4 ]

3 голосов
/ 15 июля 2009

Чтобы предотвратить изменение Z-порядка, вы должны перехватить сообщение WM_WINDOWPOSCHANGING и установить флаг SWP_NOZORDER.

1 голос
/ 29 октября 2009

Вы уверены, что именно тест на удар вызывает проблему? Как вы меняете размер контроля? Один из вариантов - вызвать SetWindowPos, используя p-invoke, передав ему флаг SWP_NOZORDER.

1 голос
/ 17 мая 2009

Диалоги окна управляют порядком вкладок и фокусируются через z-порядок окон элементов управления, элемент управления которого получает фокус, поднимается до верха.

Если вы хотите, чтобы ваш пользовательский элемент управления сохранил свое относительное z-позиционирование, то убедитесь, что его свойства не указывают на его TABSTOP или иным образом способный получать фокус. т.е. будет ли он работать, если отключен?

Обратной стороной этого является то, что даже если вы успешно остановите изменение z-порядка вашего элемента управления, он неявно будет перемещен, когда пользователь взаимодействует с другими элементами управления.

1 голос
/ 28 февраля 2009

Нет ответа, но пытались ли вы пойти с ним ControlDesigner вместо того, чтобы использовать свое собственное взаимодействие в режиме deigner?

...