我在.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;
}
}
答案 0 :(得分:3)
为了防止Z顺序更改,您应该捕获WM_WINDOWPOSCHANGING
消息并设置SWP_NOZORDER
标记。
答案 1 :(得分:1)
没有答案,但您是否尝试过他ControlDesigner而不是滚动自己的deigner模式互动?
答案 2 :(得分:1)
窗口对话框管理选项卡顺序并通过控件窗口的z顺序聚焦,给定焦点的控件被提升到顶部。
如果您希望自定义控件保留其相对z定位,请确保其属性不指示其为TABSTOP或以其他方式能够获得焦点。即,如果禁用它会起作用吗?
另一方面,即使您成功阻止控件的z顺序发生变化,当用户与其他控件交互时,它也会隐式重新定位。
答案 3 :(得分:1)
你确定这是导致问题的热门测试吗?你是如何调整控件的?一种选择是使用p-invoke调用SetWindowPos传递它SWP_NOZORDER标志。