Как создать форму с рамкой, но без заголовка? (например, регулятор громкости в Windows 7)

В Windows 7 окна микшера громкости имеют особый стиль с толстой прозрачной рамкой, но без заголовка. Как мне воссоздать этот стиль окна в окне winforms?

объемный миксер

Я попытался установить Text в string.Empty, а ControlBox в false, что удаляет заголовок, но затем граница также исчезает:

граница исчезает

3 ответа

Решение
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);
}

Если вы действительно хотите установить размер, вы также можете установить MinimumSize равно MaximumSize на форме.

Поскольку "Это редактирование предназначено для обращения к автору поста и не имеет смысла как редактирование. Оно должно было быть написано как комментарий или ответ". Я представляю правку Криса как новый ответ.

Код, на который он отвечает, работает, как описано, за исключением того, что он также предотвращает любое событие мыши в клиентской области. Вам нужно вернуть 1 (как в HTCLIENT), чтобы это исправить.

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);
}

form.FormBorderStyle = FormBorderStyle.Fixed3D;

Другие вопросы по тегам