С# - сделать форму полупрозрачной при движении

Есть ли способ сделать форму полупрозрачной, пока она перемещается, а затем стать непрозрачной, когда она больше не перемещается? Я пробовал событие Form_Move безуспешно.
Я застрял, чем помочь?


person user    schedule 18.10.2009    source источник
comment
Вы изменили свойство Form.Opacity в событии Form_Move?   -  person gn22    schedule 18.10.2009
comment
Да, но когда программа запускается впервые, она полупрозрачна.   -  person user    schedule 18.10.2009


Ответы (2)


Причина, по которой форма загружается как полупрозрачная, заключается в том, что форма должна быть перемещена в исходное положение, что вызывает событие Move. Вы можете преодолеть это, основываясь на том, установлена ​​ли непрозрачность, полностью ли загружена форма.

Событие ResizeEnd срабатывает после завершения перемещения формы, поэтому должно работать что-то вроде этого:

bool canMove = false;

private void Form1_Load(object sender, EventArgs e)
{
    canMove = true;
}

private void Form1_Move(object sender, EventArgs e)
{
    if (canMove)
    {
        this.Opacity = 0.5;
    }
}

private void Form1_ResizeEnd(object sender, EventArgs e)
{
    this.Opacity = 1;
}
person gpmcadam    schedule 18.10.2009
comment
Хороший! Я не знал, что ResizeEnd срабатывает, когда пользователь заканчивает перемещать форму. Я заметил, что ResizeBegin срабатывает, когда пользователь начинает перемещать форму, так что, возможно, он мог бы использовать это, а не трюк Form_Load/canMove/Form_Move? - person itowlson; 18.10.2009
comment
Большое спасибо! Это потрясающе! Я буду экспериментировать с ним еще больше. Кстати, люблю свою аватарку Бауэр ;). - person user; 18.10.2009
comment
У кого-нибудь возникают проблемы при использовании клавиш Windows для перемещения окна в определенную позицию плитки на экране? Например, когда я использую Windows + LeftKey, форма остается непрозрачной, и она не вернется в нормальное состояние, пока я снова не изменю ее размер вручную. Итак, что я сделал, чтобы решить эту проблему, так это последовал совету @itowlson и использовал Form1_ResizeBegin вместо Form1_Move. Кажется, это помогает. - person Ragno Croft; 21.12.2015

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

[STAThread]
static void Main()
{
    using (Form form = new Form())
    using (Timer tmr = new Timer())
    {
        tmr.Interval = 500;
        bool first = true;
        tmr.Tick += delegate
        {
            tmr.Stop();
            form.Opacity = 1;
        };
        form.Move += delegate
        {
            if (first) { first = false; return; }
            tmr.Stop();
            tmr.Start();
            form.Opacity = 0.3;
        };
        Application.Run(form);
    }
}

Очевидно, вы можете настроить это так, чтобы оно появлялось/исчезало и т. д. — это просто для того, чтобы показать общую концепцию.

person Marc Gravell    schedule 18.10.2009
comment
Я получаю сообщение об ошибке, говорящее о том, что SetCompatibleTextRenderingDefault должен быть вызван до того, как в приложении будет создан первый объект IWin32Window. - person user; 18.10.2009
comment
Так что сделай это... Я не понимаю эту ошибку, предположительно связанную с культурой. - person Marc Gravell; 18.10.2009
comment
Хорошо, я поставил Application.SetCompatibleTextRenderingDefault(false); перед всем остальным, и он работает. Но нет прозрачности при перемещении формы. - person user; 18.10.2009