Окна произвольной формы на C#

30 дек. 2009 г. | | |

Недавно наткнулась на свою программку, которая создает окно произвольной формы. Написана она была на C#, код довольно простой. Логически код можно разделить на две части - одна отрисовывает форму произвольной формы, заданной bmp-файлом, другая занимается отслеживанием перемещений формы. На самой форме нет ничего, FormBorderStyle установлен в None.
Принцип работы этого кода прост. Методу CreateFromBMP() в качестве аргументов передается bmp-русинок, в котором содержится желаемая форма для окна, и цвет, который надо из рисунка исключить, чтобы получить контур. Для примера использовался рисунок машинки, созданный в mspaint :)

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.BackgroundImage = global::Window.Properties.Resources.bg;
this.Region = CreateFromBMP(global::Window.Properties.Resources.bg, Color.FromArgb(255, 255, 255));
}

#region Create Form Border From BMP

Region CreateFromBMP(Bitmap bg, Color excludeColor)
{
GraphicsPath path = new GraphicsPath();

int width = bg.Width;
int height = bg.Height;

for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
if (bg.GetPixel(x, y) != excludeColor)
{
path.AddRectangle(new Rectangle(x, y, 1, 1));
}
}
}

return (new Region(path));
}
#endregion

#region Moving form
private bool toMove = false;
private Point delta = new Point();

private void start_MouseMove(object sender, MouseEventArgs e)
{
if (toMove)
{
Point coords = this.PointToScreen(e.Location);

Point location = new Point(this.Location.X + (coords.X - delta.X), this.Location.Y + (coords.Y - delta.Y));

this.Location = location;

delta = coords;
}
}

private void start_MouseDown(object sender, MouseEventArgs e)
{
if ((e.Button == MouseButtons.Left) && (e.Clicks == 1))
{
toMove = true;
delta = this.PointToScreen(e.Location);
}
}

private void start_MouseUp(object sender, MouseEventArgs e)
{
toMove = false;
}
#endregion

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape) Application.Exit();
}
}

Результат работы кода:
Скачать проект можно отсюда.

0 коммент.:

Отправить комментарий