“Дыра” в окне без границы

215
26 марта 2018, 22:12

Пытаюсь создать метод, который будет рисовать окно с неким уведомлением. Уведомление представляет собой форму без границы, на которой размещается Label с требуемым текстом. Уведомление должно отображаться в течении какого-то времени, не захватывая фокус.

В конце-концов, мне удалось окно нужным образом, однако в итоге вместо контрола рисуется фон за окном, т.е. окно выглядит как дырка:

На скриншоте красная рамка - это не рамка, а форма. На "пустом" месте должен быть контрол.

Сам проект, строго говоря, не WinForms, а библиотека классов (4.6) с референсом на System.Wndows.Forms.

Её код:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace someNamespace
{
    public class Overlay
    {
        class Notification : Form
        {
            protected override bool ShowWithoutActivation => true;
            private const int WS_EX_TOPMOST = 0x00000008;
            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams createParams = base.CreateParams;
                    createParams.ExStyle |= (WS_EX_TOPMOST);
                    return createParams;
                }
            }
            public Notification(string Message): base()
            {
                BackColor = Color.OrangeRed;
                FormBorderStyle = FormBorderStyle.None;
                Bounds = new Rectangle(10, 10, 320, 240);
                var label = new Label();
                label.Text = Message;
                label.Location = new Point(10, 10);
                label.Size = new Size(300, 220);
                Controls.Add(label);
                Enabled = false;
            }
            public void Show(int Delay)
            {
                Deactivate += ShowAgain();
                Show();
                Task.Delay(Delay).Wait();
                Deactivate -= ShowAgain();
                Close();
            }
            EventHandler ShowAgain()
            {
                return (s, e) => Show();
            }
        }
        static Dictionary<string, Notification> notifications = new    Dictionary<string, Notification>();
    public void Notify(string Message, int Delay)
    {
        Application.EnableVisualStyles();
        if (!notifications.ContainsKey(Message))
            notifications.Add(Message, new Notification(Message));
        var n = notifications[Message];
        n.Show(Delay);
    }
}

}

Консольное приложение, которое дёргает библиотеку:

class Program
{
    static Overlay overlay = new Overlay();
    static void Main(string[] args)
    {
        overlay.Notify("Привет!", 5000);
    }
}

Как вернуть контрол на место?

READ ALSO
WPF. Отсчитать время в Async методе

WPF. Отсчитать время в Async методе

Есть WPF приложение, в котором запускается async методВ методе есть бесконечный цикл, который что-то делает

182
Отображение данных с помощью Partial View

Отображение данных с помощью Partial View

Есть 2 модели, пользователи и программы (в этом вопросе есть описание моделей)Я хочу отобразить в таблицах все программы из бд, и следом всех...

177
Поиск по году в БД

Поиск по году в БД

Есть таблица со столбцом "Дата" формата 2018-03 в sql serverВвел в textBox год 2018 Как вывести в DataGridView все записи c таким годом?

187
Крутящееся колесо SVG

Крутящееся колесо SVG

Необходимо сделать крутящийся круг из секторов

240