web-dev-qa-db-ja.com

境界線はあるがタイトルバーがないフォームを作成するにはどうすればよいですか? (Windows 7のボリュームコントロールのように)

Windows 7では、ボリュームミキサーウィンドウには特定のスタイルがあり、太くて透明な境界線がありますが、タイトルバーはありません。 WinFormsウィンドウでそのウィンドウスタイルを再作成するにはどうすればよいですか?

volume mixer

Textをstring.Emptyに設定し、ControlBoxをfalseに設定して、タイトルバーを削除しようとしましたが、境界線も消えます。

border disappears

24
oɔɯǝɹ
form.Text = string.Empty;
form.ControlBox = false;
form.FormBorderStyle = FormBorderStyle.SizableToolWindow;

固定サイズのウィンドウの場合は、引き続きFormBorderStyle.SizableToolWindowを使用する必要がありますが、フォームのWndProcをオーバーライドして、クライアント以外のヒットテスト(サイズ変更カーソルへの切り替えに使用される)を無視できます。

protected override void WndProc(ref Message message)
{
    const int WM_NCHITTEST = 0x0084;

    if (message.Msg == WM_NCHITTEST)
        return;

    base.WndProc(ref message);
}

サイズを実際に適用したい場合は、フォームでMinimumSizeMaximumSizeに等しく設定することもできます。

33
Chris Schmich

「この編集は投稿の作者に宛てたものであり、編集としては意味がありません。コメントまたは回答として書かれている必要があります。」クリスの答えの編集を新しい答えとして提示します。

彼の答えのコードは説明どおりに機能しますが、クライアント領域のマウスイベントの発生を防ぐこともできます。これを修正するには、(HTCLIENTのように)1を返す必要があります。

protected override void WndProc(ref Message message)
{
    const int WM_NCHITTEST = 0x0084;
    const int HTCLIENT = 0x01;

    if (message.Msg == WM_NCHITTEST)
    {
        message.Result = new IntPtr(HTCLIENT);
        return;
    }

    base.WndProc(ref message);
}
1
Domi