0

ドラッグ可能なコントロール (A) があり、その中にボタンがあります。A には他のコントロールもあります。つまり、ボタンは A を埋めません。

ドラッグ機能を管理するために、コントロール (A) はすべてのMouseDownイベントをキャプチャします。その後、マウスの移動距離に基づいてドラッグを開始するかどうかを決定します。

ボタンがクリックMouseUpされ、ドラッグが開始される前にイベントが受信された場合、ボタンのイベントが発生するようにしたいと思いますClick

現時点では、MouseUpイベントは親コントロール (A) によってキャプチャされるため、これは発生しません。これを手動で処理するために、 A に機能を実装できます。

private void MouseUp(object sender, MouseEventArgs e) {
    if (DragHasStarted) {
        DealWithDrag();
    }
    else {
        DelegateToChildControls();
    }
}

DelegateToChildControlsただし、どの子に委譲するかを決める必要があるため、これは複雑で、うまくスケーリングできません。

親コントロールがイベントを処理しない場合、Windows にこれを処理させ、ボタンの Click メソッドを直接呼び出す方法はありMouseUpますか?

編集 - イベント シーケンスの詳細:

ボタンをクリックすると、次の一連のイベントが表示されます。

  1. MouseDownオンボタン
  2. MouseDownon Button (ドラッグ ハンドラ)
  3. これをボタンの親に転送します
  4. MouseDown親 (ドラッグ ハンドラ)
  5. 親によってキャプチャされたマウス (ドラッグ ハンドラ)
  6. MouseUp親に
  7. ドラッグの終了 (ドラッグ ハンドラ)

MouseUpボタンにイベントが表示されません。

4

1 に答える 1

-1

Controlでテストしたため、使用しているコンテナの種類はわかりませんがUserControl、 のすべての子と対話できUserControlますが、子のみをクリックすることに興味がある場合は、次の解決策があります。

[DllImport("user32")]
private static extern IntPtr WindowFromPoint(POINT point);
[DllImport("user32")]
private static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam);
struct POINT
{
  public int x, y;
}
private void MouseUp(object sender, MouseEventArgs e){
   if(DragHasStarted){
      DealWithDrag();
   }
   else {
      Point screenLocation = PointToScreen(e.Location);
      IntPtr childHandle = WindowFromPoint(new POINT{x=screenLocation.X,y=screenLocation.Y });
      if(childHandle != IntPtr.Zero){
         SendMessage(childHandle, 0x201, IntPtr.Zero, IntPtr.Zero);
         SendMessage(childHandle, 0x202, IntPtr.Zero, IntPtr.Zero);
      }
   }
}
于 2013-06-19T11:28:50.850 に答える