簡體   English   中英

如何防止控件改變Z順序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM