Рисование Красивых линий в 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

Посмотреть примеры на английском языке и скачать исходный код библиотеки можно здесь: http://community.opennetcf.com/articles/cf/archive/2007/10/31/using-gdi-on-windows-mobile.aspx


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.