Как сделать так, чтобы окно не двигалось в заголовке

Есть ли какой-либо элемент управления, который может перемещать окно без строки заголовка (верхняя)/без рамки вообще.

Я делаю приложение для заметок, как вы знаете, поэтому я хочу, чтобы оно было компактным.


person Athiwat Chunlakhan    schedule 22.08.2009    source источник
comment
Как двигаться? Будет ли окно перемещаться автоматически (аналогично «подталкиванию» MSN) или в ответ на действие пользователя («щелкните и перетащите»)?   -  person David says reinstate Monica    schedule 22.08.2009


Ответы (4)


Вам нужно вернуть HTCAPTION из WM_NCHITTEST в вашем WndProc:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    const int WM_NCHITTEST = 0x0084;
    const int HTCLIENT = 1;
    const int HTCAPTION = 2;
    protected override void WndProc(ref Message msg)
    {
        base.WndProc(ref msg);
        if (msg.Msg == WM_NCHITTEST && msg.Result == (IntPtr)HTCLIENT)
        {
            msg.Result = (IntPtr)HTCAPTION;
        }
    }
}

В этом случае клиентская область вашего окна будет казаться Windows полосой заголовка.

person RichieHindle    schedule 22.08.2009
comment
Да, это работает, но только если вы (можете) щелкнуть фон формы. Термин «приложение для заметок» заставляет меня думать о текстовом поле, заполняющем окно. - person Henk Holterman; 22.08.2009
comment
@Henk Holterman У меня есть кое-какой опыт :) Вам не нужно его перемещать, он закроется через 15 секунд после бездействия. Я просто хочу дать пользователю некоторую свободу. - person Athiwat Chunlakhan; 22.08.2009
comment
@Jonathan: Вы поместили код в свою форму - я обновил пример, чтобы показать свой полный тестовый класс. - person RichieHindle; 22.08.2009
comment
Он также работает в. частичный класс Main { тоже часть. Я решил поместить его туда, чтобы сделать код чище :) - person Athiwat Chunlakhan; 22.08.2009
comment
@ Джонатан: Круто. Обратите внимание, что я только что отредактировал код — в предыдущей версии сломалась кнопка «Закрыть» (красный крестик) и семейство. - person RichieHindle; 22.08.2009
comment
Джонатан, обычно не рекомендуется помещать что-либо в .Desgner.cs, вы можете это потерять. - person Henk Holterman; 22.08.2009
comment
@Henk Holterman, и я только что потерял его :) неважно, теперь я положил его в нужное место. Спасибо. - person Athiwat Chunlakhan; 23.08.2009

Для этого я написал компонент, вы можете найти его здесь.

Его можно использовать для перемещения любого элемента управления, а не только окна. Вы можете либо использовать его явно в коде, либо просто поместить его на поверхность конструктора и установить свойство EnableDragMove в окне или элементе управления, как показано ниже:

Снимок экрана
(источник: thomaslevesque.com)

person Thomas Levesque    schedule 22.08.2009

Попробовав что-то подобное, прежде чем я могу сказать вам, что это не особенно легко. Что вам нужно сделать, так это предоставить событие OnMouseDown/OnMouseMove/OnMouseUp самой форме (или некоторому элементу управления в форме), которое обновляет положение элемента управления, когда пользователь щелкает и перетаскивает. Насколько мне известно, нет встроенного элемента управления, который позволил бы вам щелкнуть и перетащить окно, отличное от заголовка.

person Nathan Taylor    schedule 22.08.2009

Если вы собираетесь создавать приложение с нуля, я бы рекомендовал создавать его с помощью WPF.

У Тодда Миранды есть отличная демонстрация создания приложения, похожего на гаджет, на windowsclient.net.

Ссылка на демонстрацию: http://windowsclient.net/learn/video.aspx?v=5177

person Community    schedule 22.08.2009