1

次のような winform を作成したいと思います。

通知領域からのポップアップのようなスタイルの Winform (Windows 7)

他の質問に従って、(写真に見られるような)視覚効果をすでに達成しました。ただし、フォームのサイズ変更を禁止することはできません。境界線を付けるには、「サイズ変更可能」でなければならないからです。最小サイズと最大サイズの値を現在のフォーム サイズと同じにすることを誰かが提案しました。これで問題の一部は解決しますが、マウスを境界線の上に置くと、フォームのサイズを変更できることを示す両端矢印が表示されます。このカーソルの変更を無効にする方法はありますか? 私の目標は、ネットワーク、サウンドなど、Windows 7 の元の systray ポップアップを模倣することです。

ありがとうございました!

4

2 に答える 2

1

コード例:

private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM_NCHITTEST:
            m.Result = (IntPtr)HTCLIENT;
            return;
    }
    base.WndProc(ref m);
}

このようにすると、カーソルが境界線の上に移動しても、ポインターはフォーム内にあるかのように扱われ、目的の効果が得られるため、変化しません。

于 2012-09-03T12:02:15.683 に答える
0

フォームにメッセージ ハンドラーを追加し、WM_NCHITTEST を処理します。オリジナルが HTSIZE などを返す場合は、HTNONE または HTCAPTION を返します。

この質問のようなものから始める必要があります。

説明する:

Windows がウィンドウに使用するカーソルを知りたい場合、最初にWM_NCHITTESTメッセージを送信します (非クライアント ヒット テスト)。このメッセージはWndProcメソッドによって処理されます。HT*ウィンドウは、マウスがウィンドウのどの部分にあるかを Windows に伝えるコードの 1 つを返すことになっています。たとえばHTCAPTION、キャプション領域、HTCLIENTクライアント領域、またはHTSIZENESW左下のサイズ変更コーナーに対して戻ります。デフォルトのメッセージ ハンドラ ( を呼び出すbase.WndProc) は、標準のウィンドウでこれを処理します。

標準のウィンドウはありません。

ここでやろうとしているのは、元のウィンドウにマウスがどこにあるかを尋ねることです。値のいずれかを返す場合、HTSIZE*その戻り値をHTNONE(アクションがないHTCLIENT場合) または (カーソルをウィンドウ内として扱いたい場合 - おそらくこれではない) またはHTCAPTION(できるようにしたい場合) に置き換えます。ウィンドウの端をドラッグする -- 便利かもしれません)。

于 2012-09-03T09:21:07.390 に答える