2009-02-27 56 views
2

我有.Net中的用戶控件,我在WndProc中使用命中測試來允許在運行時用鼠標調整它的大小。如何防止控件改變Z順序?

問題是,在命中測試成功後(鼠標按下,拖動調整大小,鼠標釋放),控件以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; 
    } 
    } 

回答

1

沒有一個答案,但你嘗試去與他ControlDesigner而不是滾動您自己deigner模式的互動?

1

窗口對話框通過控件窗口的z順序來管理標籤順序和焦點,給出焦點的控件被引到頂部。

如果您希望自定義控件保留其相對的z位置,請確保其屬性不指示其TABSTOP或以其他方式能夠接收焦點。即如果禁用它會工作嗎?

這是另一面,即使你成功地停止了你的控件的z順序改變,它的隱式將被重新定位爲用戶與其他控件交互。

2

要防止Z順序變更,您應該捕獲WM_WINDOWPOSCHANGING消息並設置SWP_NOZORDER標誌。

1

你確定這是造成問題的命中測試嗎?你如何調整控制權?一種選擇是使用p-invoke調用SetWindowPos傳遞SWP_NOZORDER標誌。