如何防止控件改变Z顺序?

时间:2009-02-27 18:03:57

标签: c# windows winapi messaging

我在.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 个答案:

答案 0 :(得分:3)

为了防止Z顺序更改,您应该捕获WM_WINDOWPOSCHANGING消息并设置SWP_NOZORDER标记。

答案 1 :(得分:1)

没有答案,但您是否尝试过他ControlDesigner而不是滚动自己的deigner模式互动?

答案 2 :(得分:1)

窗口对话框管理选项卡顺序并通过控件窗口的z顺序聚焦,给定焦点的控件被提升到顶部。

如果您希望自定义控件保留其相对z定位,请确保其属性不指示其为TABSTOP或以其他方式能够获得焦点。即,如果禁用它会起作用吗?

另一方面,即使您成功阻止控件的z顺序发生变化,当用户与其他控件交互时,它也会隐式重新定位。

答案 3 :(得分:1)

你确定这是导致问题的热门测试吗?你是如何调整控件的?一种选择是使用p-invoke调用SetWindowPos传递它SWP_NOZORDER标志。