[英]How to prevent a control from changing Z order?
我在.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;
}
}
為了防止Z順序更改,您應該捕獲WM_WINDOWPOSCHANGING
消息並設置SWP_NOZORDER
標志。
您確定是導致問題的點擊測試嗎? 您如何調整控件的大小? 一種選擇是使用傳遞給它的SWP_NOZORDER標志的p調用來調用SetWindowPos。
沒有答案,但是您是否嘗試過使用ControlDesigner,而不是滾動自己的Deigner模式交互作用?
窗口對話框管理選項卡順序,並通過控件窗口的z順序進行聚焦,被賦予焦點的控件被提升到頂部。
如果您希望自定義控件保留其相對的z位置,請確保其屬性不指示其TABSTOP或能夠接收焦點。 即如果禁用它會工作嗎?
不利的一面是,即使您成功地停止了控件的z順序更改,它的隱式也將在用戶與其他控件進行交互時重新定位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.