3

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

4 に答える 4

1

問題を引き起こしているのはヒット テストであると確信していますか? コントロールのサイズをどのように変更していますか? 1 つのオプションは、SWP_NOZORDER フラグを渡す p-invoke を使用して SetWindowPos を呼び出すことです。

于 2009-10-29T06:52:40.903 に答える
1

答えはありませんが、独自の deigner モードの対話を展開する代わりに、ControlDesignerを使用しようとしましたか?

于 2009-02-28T14:03:55.047 に答える
1

ウィンドウ ダイアログは、コントロール ウィンドウの z オーダーを通じてタブ オーダーとフォーカスを管理します。フォーカスを与えられたコントロールは一番上に表示されます。

カスタム コントロールで相対的な z 位置を保持する場合は、そのプロパティがタブストップを示していないこと、またはその他の方法でフォーカスを受け取ることができないことを確認してください。つまり、無効にしても機能しますか?

これの裏側は、コントロールの z オーダーの変更を正常に停止したとしても、ユーザーが他のコントロールと対話するときに暗黙的に再配置されることです。

于 2009-05-17T11:28:03.437 に答える