如何防止控制改变Z命令?

我有.Net中的用户控件,我在WndProc中使用命中testing来允许在运行时用鼠标调整它的大小。

问题是,在命中testing成功后(鼠标按下,拖动resize,鼠标释放),控件以Z顺序向上跳,并将其废弃在窗体中。

我需要命中testing,因为它是一个非常自定义的控件。

WndProc有没有办法阻止控件改变它的Z顺序?

谢谢。

命中testing代码:

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; } } 

为了防止Z顺序改变,你应该捕获WM_WINDOWPOSCHANGING消息并设置SWP_NOZORDER标志。

没有一个答案,但你有没有试图去与他ControlDesigner而不是滚动自己deigner模式的互动?

窗口对话框通过控制窗口的Z顺序来管理标签顺序和焦点,给出焦点的控件被提升到顶部。

如果您希望您的自定义控件保留其相对的z位置,则确保其属性不指示其TABSTOP或以其他方式能够接收焦点。 即如果禁用它将工作吗?

另一方面,即使你成功地停止了你的控件的z顺序改变,当用户与其他控件交互时,它的隐含地将被重新定位。

你确定这是造成问题的命中测试吗? 你如何调整控制权? 一种选择是使用p-invoke调用SetWindowPos传递SWP_NOZORDER标志。