Как нарисовать DrawRectangle вне окна WindowForms
Написал на C# .NET WindowForms свою первую простую программу, в которой рисую прямоугольники DrawRectangle по определенным координатам -> в окне программы в форме pictureBox.
При нажатии на определенную кнопку мне нужно вывести полученное изображение на экран ВНЕ окна самой программы (чтобы оно перекрывало остальные окна). Как это сделать?
Ответы (1 шт):
Пример. По нажатию на кнопку создаётся новая форма без бордюров и распахивается на весь экран. Свойством TopMost помещаем её поверх всех. В обработчике её события Paint рисуем.
Свойство TransparencyKey определяем цвет, который будет прозрачным. Я задал BackColor - цвет фона по умолчанию - так фон получается прозрачным. Нюанс в том, что при попытке рисовать именно этим цветом, ничего не будет видно. То есть, значение цвета нужно выбирать с умом.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WinForm
{
public partial class Form1 : Form
{
Button button;
public Form1()
{
//InitializeComponent();
button = new Button { Parent = this };
button.Click += Button_Click;
}
private void Button_Click(object sender, EventArgs e)
{
var form = new Form();
form.FormBorderStyle = FormBorderStyle.None;
form.WindowState = FormWindowState.Maximized;
form.TopMost = true;
form.TransparencyKey = form.BackColor;
form.Show();
form.Paint += Form_Paint;
}
private void Form_Paint(object sender, PaintEventArgs e)
{
using (var pen = new Pen(Color.Red, 10))
{
e.Graphics.DrawRectangle(pen, 200, 200, 300, 200);
}
}
}
}
Есть один способ, позволяющий рисовать именно поверх других окон, а не в своём собственном. Это методы ControlPaint.DrawReversibleFrame и ControlPaint.FillReversibleRectangle. Но, во-первых, цвета получаются реверсивные, во-вторых, рисунок стирается при обновлении чужих окон. Поэтому кроме как для баловства это вряд ли пригодно.