3

これは、Windowsフォーム/ .Net C#の質問です。

透明キーと背景色で完全に透明になるフチなしウィンドウがあります。ウィンドウ内には、いくつかのユーザーコントロールがあります。

ウィンドウを動かせるようにしたい。親ウィンドウでこれを行う方法は知っていますが、私の問題は、子コントロールが表示される唯一のものであり、したがってクリック可能な唯一のものであるということです。

問題は、特定のメッセージを親に渡して、マウスの右ボタンが押され、マウスが子コントロールのいずれかで移動しているときに親が移動できるようにするにはどうすればよいですか?

または多分あなたは別の方法を提案することができますか?

助けてくれてありがとう。

マーク

4

4 に答える 4

7

System.Windows.Forms.Messageクラスを使用して SendMessage がなくても、目標を達成できます。ドラッグを行ったことがある場合は、メッセージに精通していると思いますWM_NCLBUTTONDOWN。コントロールの MouseDown イベントから親に送信します。

コントロール label1 をクリックしてフォームを移動する例を次に示します。クリックされたコントロールからキャプチャを解放するために送信者が使用されている最初の行に注意してください。このようにして、フォームを移動するためのすべてのコントロールにこのハンドラーを設定できます。

これは、フォームを移動するための完全なコードです。他に何も必要ありません。


public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;

private void label1_MouseDown(object sender, MouseEventArgs e)
{
      (sender as Control).Capture = false;
      Message msg = Message.Create(Handle, WM_NCLBUTTONDOWN, (IntPtr)HT_CAPTION, IntPtr.Zero);
      base.WndProc(ref msg);
}

お役に立てれば。

于 2010-01-08T01:12:32.080 に答える
7

このイベントを子コントロールに追加するのが最も簡単な方法だと思います。

/// <summary>
/// The event that you will throw when the mouse hover the control while being clicked 
/// </summary>
public event EventHandler MouseRightClickedAndHoverChildControl;

その後、親がしなければならないことは、これらのイベントをサブスクライブし、親を移動する操作を行うことだけです。

ChildControl.MouseRightClickedAndHoverChildControl += OnMouseHoverChildControl;

private void OnMouseHoverChildControl(object sender, EventArgs e)
{
    //do foo...
}
于 2010-01-08T01:56:43.847 に答える
0

マウス メッセージを親コントロールに送信するには、 SendMessage API 関数を呼び出す必要があります。

WndProcコントロールのメソッドをオーバーライドしてこれを行うのがおそらく最も簡単でしょう。

于 2010-01-07T23:52:48.137 に答える
0

私はまさにこの質問をしていました...しかし、別の答えを思いつきました。WndProc にメッセージがある場合は、ハンドルを親のハンドルに変更して渡すことができます。

派生した TextBox でこれを行う必要がありました... TextBox は、ScrollBars が None に設定されている場合でも、スクロール ホイール イベントを食べます。それらをフォームまで伝播させたかったのです。したがって、これを派生 TextBox の WndProc 内に配置するだけです。

            case 0x020A: // WM_MOUSEWHEEL
            case 0x020E: // WM_MOUSEHWHEEL
                if (this.ScrollBars == ScrollBars.None && this.Parent != null)
                    m.HWnd = this.Parent.Handle; // forward this to your parent
                base.WndProc(ref m);
                break;

            default:
                base.WndProc(ref m);
                break;
于 2012-11-08T16:32:43.617 に答える