За замовчуванням всі форми в Windows Forms є прямокутними. Однак ми можемо створювати і непрямокутні довільні форми. Для цього використовується властивість Region. В якості значення воно приймає об'єкт однойменного класу Region.
При створенні прямокутних форм, як правило, не використовуються кордону форми, так як кордони задаються цим об'єктом Region. Щоб прибрати кордони форми, треба привласнити у форми властивості FormBorderStyle значення None.
І ще один аспект, який треба враховувати, полягає в переміщенні, закриття, максимізації і мінімізації форм. Тобто в даному випадку, як у звичайній формі, ми не зможемо натиснути на хрестик, щоб закрити форму, не зможемо її перемістити на нове місце. Тому нам треба додатково визначати для цього програмну логіку.
Отже, перейдемо до коду форми і змінимо його наступним чином:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HelloApp
{
public partial class Form1 : Form
{
Point moveStart; // точка для переміщення
public Form1()
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None;
this.BackColor = Color.Yellow;
Button button1 = new Button
{
Location = new Point
{
X = this.Width / 3,
Y = this.Height / 3
}
};
button1.Text = "Закрити";
button1.Click += button1_Click;
this.Controls.Add(button1); // додаємо кнопку на форму
this.Load += Form1_Load;
this.MouseDown += Form1_MouseDown;
this.MouseMove += Form1_MouseMove;
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
System.Drawing.Drawing2D.GraphicsPath myPath = new System.Drawing.Drawing2D.GraphicsPath();
// створюємо еліпс з висотою і шириною форми
myPath.AddEllipse(0, 0, this.Width, this.Height);
// створюємо за допомогою еліпса ту область форми, яку ми хочемо бачити
Region myRegion = new Region(myPath);
// встановлюємо видиму область
this.Region = myRegion;
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
// если нажата левая кнопка мыши
if (e.Button == MouseButtons.Left)
{
moveStart = new Point(e.X, e.Y);
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
// якщо натиснута ліва кнопка миші
if ((e.Button & MouseButtons.Left) != 0)
{
// отримуємо нову точку положення форми
Point deltaPos = new Point(e.X - moveStart.X, e.Y - moveStart.Y);
// встановлюємо положення форми
this.Location = new Point(this.Location.X + deltaPos.X,
this.Location.Y + deltaPos.Y);
}
}
}
}
Створення області форми відбувається в обробнику події Form1_Load. Для створення області використовується графічний шлях - об'єкт класу System.Drawing.Drawing2D.GraphicsPath, в який додається еліпс. Графічний шлях дозволяє створити фігуру будь-якої форми, тому, якщо ми захочемо форму у вигляді морської зірки, то нам просто треба належним чином налаштувати використовуваний графічний шлях.
Для закриття форми в обробнику події натискання кнопки button1_Click форма закривається програмним чином: this.Close ()
Для переміщення форми обробляються дві події форми - подія натискання кнопки миші і подія переміщення покажчика миші.