8

フローティングサイドバーで「ペン」ボタンを切り替えた後、マウスで画面に描画するための小さなツールを作成しています。

私はこれを行いました (笑わないでください)。透明キーが画面全体をカバーするので、一番上のウィンドウ フォームに背景を表示します。描画モードのときに、マウスがフォームをクリックして以下のものにならないようにする必要があります。これに従ってみました: クリックできない背景が透明な Windows フォーム

これにより、マウスが正常に停止しますが、フォームの最大化が解除され、マウスでドラッグされます (これは HTCAPTION IntPtr(2) を使用します)。MSDN にリストされている他の値をいくつか使用してみましたが、うまくいきませんでした。

私は私の深みから抜け出しています。

PS私は今これを使用しています..

        //code for allowing clicking through of menus
        protected override void WndProc(ref Message m)
        {              
            if (penMode && m.Msg == 0x84)
            {
                m.Result = new IntPtr(2);    
            }
            else
                base.WndProc(ref m);
        }

更新:完全に別の方法で問題にアプローチすることで、問題を解決しました。WndProc が機能しないように見えるので、画面全体に空白のフォームを作成し、その中からメイン フォーム (form.Show(this)) を表示しました。次に、下にある空白のフォームの不透明度を 0% から 1% に調整して、クリックスルーを許可/防止します。動作します!皆様の回答のおかげで、大変勉強になりました。

4

2 に答える 2

8

実際、笑う必要はありません。私には、あなたがこれをすでに正しい方法で行っているように思えます。デスクトップを所有していないので、デスクトップに直接描画しないでください。代わりに、所有している透明なフォームをオーバーレイし、その上に描画することでシミュレートする必要があります。透明なオーバーレイ フォームを所有しているため、その上に描画することは問題ありません。

しかし、それを超えて、値が実際に何をするのかを明確に理解せずに、値をランダムに試しているように思えます。それは、目を閉じてダーツを投げるようなものです。ヒット数はそれほど高くありません。

コードの機能を理解することから始めましょう。マジック値はメッセージに0x84対応し、WM_NCHITTESTWindows からウィンドウに送信され、そのウィンドウでのマウス クリックの処理方法を決定します。そのメッセージに応答してHT*、リンクされたドキュメントに示されている値の 1 つを返信します。これらの値にはそれぞれ特定の意味があり、ドキュメントでも説明されています。例えば:

  • HTCAPTION(値は 2) は、ウィンドウのクリックされた部分をウィンドウのキャプション/タイトル バーとして扱う必要があることを意味します。HTCAPTIONWindows を使用して、タイトル バーを使用して画面上でウィンドウをドラッグできることを知っているので、マウス クリックに応答して戻ることで、ウィンドウをドラッグ可能にすることは理にかなっています。これは、ボーダレス フォーム (つまり、タイトル バーのないフォーム) で使用され、移動できるようになっていることがわかります。

  • HTTRANSPARENT(-1 の値を持つ) は、別の使用可能な値です。これはかなり単純です。ウィンドウが透明に見えるだけです。「気にしないで、ここに窓はないよ!」と言っているようなものです。マウス クリックは、あたかもそこにいないかのように、Z オーダーの下にあるウィンドウに単純に渡されます。

  • HTCLIENT(値 1) は、ウィンドウのクライアント領域のどこかでクリックが発生した場合のデフォルトの結果です。すべてを正常に動作させたい場合は、これを返します (または単に既定のウィンドウ プロシージャを呼び出します)。この値を返すクリック イベントは、フレームワークによって通常どおり処理され、フォームのClickイベントが発生するか、フォームにある子コントロールに渡されます。

したがって、描画していないときは、おそらく戻りたいと思うでしょうHTTRANSPARENT。描画中は、描画コードがマウス イベントを認識して結果を描画できるように、戻りたいと思うでしょう。HTCLIENT

コードを修正すると、次のようになります。

// Code for allowing clicking through of the form
protected override void WndProc(ref Message m)
{
    const uint WM_NCHITTEST = 0x84;

    const int HTTRANSPARENT = -1;
    const int HTCLIENT      = 1;
    const int HTCAPTION     = 2;
    // ... or define an enum with all the values

    if (m.Msg == WM_NCHITTEST)
    {
        // If it's the message we want, handle it.
        if (penMode)
        {
            // If we're drawing, we want to see mouse events like normal.
            m.Result = new IntPtr(HTCLIENT);
        }
        else
        {
            // Otherwise, we want to pass mouse events on to the desktop,
            // as if we were not even here.
            m.Result = new IntPtr(HTTRANSPARENT);
        }
        return;  // bail out because we've handled the message
    }

    // Otherwise, call the base class implementation for default processing.
    base.WndProc(ref m);
}
于 2013-04-07T13:09:19.537 に答える
2

ウィンドウの可視性を 5% 程度に設定し、透過キーを非アクティブのままにしておくこともできます。

あなたは基本的にそれに気付かず、ジェットがそこにあります:D

お役に立てれば

于 2013-04-07T21:50:59.180 に答える