Как предотвратить изменение Z-порядка элементом управления?

У меня есть пользовательский контроль в .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)

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

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

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

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

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

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