2009-02-27 13 views
2

私はWndProcでヒットテストを使用して、実行時にマウスでサイズを変更できるようにする.NETでユーザーコントロールを使用しています。コントロールがZオーダーを変更しないようにするには?

問題は、ヒットテストが成功した後(マウスを押し、ドラッグしてサイズを変更し、マウスを離した場合)、コントロールがZ順に上方向にジャンプし、フォームの位置を破棄することです。

非常にカスタマイズされたコントロールなのでヒットテストが必要です。

コントロールが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

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

関連する問題