Рисование Красивых линий в Windows Mobile на C#
Здесь я приведу пример кода для рисования при помощи GDI+ для Windows Mobile. Хороший человек Алекс Фейнман представил замечательную библиотеку OpenNETCF.GDIPlus для рисования очень красивых линий с использованием разнообразных кистей и заливок. Библиотека доступна с исходным кодом и позволяет делать удивительные вещи, самыми полезными (на мой взгляд) из которых являются возможность рисования прозрачных объектов (Transparent) и сглаживания краёв и объектов, что делает линии значительно более привлекательными.
Итак пример кода:
//Обязательно включаем в проект...
using OpenNETCF.GDIPlus;
namespace TestGDIPLUS
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Это параметры для использования GDI+
GdiplusStartupInput input = new GdiplusStartupInput();
GdiplusStartupOutput output;
IntPtr token;
//Сюда будем грузить картинки фона (это я чтобы эффектней смотрелось)...
Bitmap imageBackground;
//Ширина и всота экрана по умолчанию...
int scr_width = 480;
int scr_heigth = 640;
private void menuItem2_Click(object sender, EventArgs e)
{
//В руководстве написано что необходимо выполнить при выходе - но у меня выдаёт ошибку.
//А без него (GdiplusShutdown) всё нормально поэтому закомментировал.
//NativeMethods.GdiplusShutdown(token);
Application.Exit();
}
private void Form1_Load(object sender, EventArgs e)
{
//Это запускаем GDI+
GpStatus stat = NativeMethods.GdiplusStartup(out token, input, out output);
//Задаём реальные размеры экрана...
scr_width = Screen.PrimaryScreen.Bounds.Width;
scr_heigth = Screen.PrimaryScreen.Bounds.Height;
//Загружаем картинку фоновую - чтобы пример эффектнее смотрелся...
imageBackground = new Bitmap(TestGDIPLUS.Properties.Resources.fon);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
using (Graphics graphics = Graphics.FromImage(imageBackground))
{
IntPtr hdc = graphics.GetHdc();
using (GraphicsPlus g = new GraphicsPlus(hdc))
{
SmoothingMode mode = g.GetSmoothingMode();
//Это чтобы края линий сглаживались...
g.SetSmoothingMode(SmoothingMode.SmoothingModeAntiAlias);
//Рисуем линию в виде стрелки...
PenPlus pen = new PenPlus(Color.Green, 40);
pen.SetEndCap(LineCap.LineCapArrowAnchor);
pen.SetStartCap(LineCap.LineCapRound);
g.DrawLine(pen, 50, 50, scr_width - 50, 50);
//Рисуем прерывистую линию в виде стрелки с началом в виде кружочка...
pen = new PenPlus(Color.Blue, 40);
pen.SetEndCap(LineCap.LineCapArrowAnchor);
pen.SetStartCap(LineCap.LineCapRoundAnchor);
pen.SetDashStyle(DashStyle.DashStyleDot);
g.DrawLine(pen, 50, 150, scr_width - 50, 150);
//Рисуем линию в крапинку...
BrushPlus brHatch = new HatchBrush(HatchStyle.HatchStyle50Percent, Color.Black, Color.White);
pen = new PenPlus(brHatch, 40);
pen.SetEndCap(LineCap.LineCapTriangle);
pen.SetStartCap(LineCap.LineCapSquareAnchor);
g.DrawLine(pen, 50, 250, scr_width - 50, 250);
//Рисуем полупрозрачную линию...
pen = new PenPlus(Color.FromArgb(-0x5f7f7f7f), 40);
pen.SetEndCap(LineCap.LineCapFlat);
pen.SetStartCap(LineCap.LineCapAnchorMask);
g.DrawLine(pen, 50, 350, scr_width - 50, 350);
g.SetSmoothingMode(mode);
}
graphics.ReleaseHdc(hdc);
}
//Помещаем созданное изображение на форму...
Graphics gr = this.CreateGraphics();
gr.DrawImage(imageBackground, 0, 0);
}
}
}
Вот, что получается в результате работы примера (линии выглядят явно более привлекательными по сравнению со стандартными):
Скачать исходник примера можно здесь:
Скачать файл: testgdiplus.rar [3.48 Mb] (cкачиваний: 3)
Посмотреть примеры на английском языке и скачать исходный код библиотеки можно здесь: http://community.opennetcf.com/articles/cf/archive/2007/10/31/using-gdi-on-windows-mobile.aspx