3

これと同様の質問がここにあるようですが、「反対の」問題があります(彼はマウスイベントをキャプチャしたくありませんでした)。

パネル付きのフォームがあります。ウィンドウはボーダレスで、パネルの正確なサイズに設定されています (すべての意図と目的において、パネルが「フリー フローティング」であるかのようです)。パネルの BackColor を SystemColors.Control に設定し、ウィンドウの TransparencyKey を同じに設定できます。これは、目的の効果 (透明度) を達成するという点で機能しますが、パネルはマウス イベントをキャプチャできなくなります (これは機能にとって不可欠です)。

これを回避する別の方法、またはマウス キャプチャを再度有効にする方法はありますか?

OnPaintBackground をオーバーライドして noop を実行しようとしましたが、ティックごとに背景が更新されないため、これは実際の透明度を達成しませんでした (したがって、パネルを移動するかどうかに関係なく、最初の描画時にパネルの背後にあるものはすべてそこに残ります)。またはそれ以外の場合は更新します)。ただし、パネルはマウス イベントをキャプチャできました。

プロジェクトのこの段階では、これはそれほど面倒なことではありませんが、簡単なプロトタイプを作成しているときに問題に出くわし、今私を悩ませ始めています. 誰かが何か指針を持っているなら、彼らは大歓迎です。

4

2 に答える 2

2

VC++ を使用している場合は、WM_ マウス イベント メッセージを処理するメッセージ ポンプが必要でした。

簡単に検索すると、次のスレッドが表示されます。

すべてのマウス イベントのキャプチャ

私はあなたがすでに次のものを試したことを期待しています:

/// <summary>
/// A transparent control.
/// </summary>
public class TransparentPanel : Panel
{
    public TransparentPanel()
    {
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return createParams;
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // Do not paint background.
    }
}
于 2009-05-19T14:36:46.733 に答える
1

私は本当にあなたに答えを持っていませんが、あなたがやろうとしていることを達成するための別の(おそらく少し「ハッキー」な)方法があります.

フォームの不透明度プロパティを 1% に設定すると (透明度キーを変更しないでください)、イベントがキャプチャされます。フォームは表示されなくなり (少なくとも私のマシンでは 1% でまったく表示されませんでした)、すべてのマウス クリックをキャプチャすることができます。

于 2009-05-19T13:46:31.920 に答える