Изграждане на графичен потребителски интерфейс с Windows Forms


Пакетът System.Drawing и GDI+



страница16/16
Дата27.09.2016
Размер1.09 Mb.
#10985
1   ...   8   9   10   11   12   13   14   15   16

Пакетът System.Drawing и GDI+


Пакетът System.Drawing осигурява достъп до GDI+ функциите на Windows:

  • повърхности за чертане

  • работа с графика и графични трансформации

  • изчертаване на геометрични фигури

  • работа с изображения

  • работа с текст и шрифтове

  • печатане на принтер

Той се състои от няколко пространства:

  • System.Drawing – предоставя основни класове като повърхности, моливи, четки, класове за изобразяване на текст.

  • System.Drawing.Imaging – предоставя класове за работа с изобра­же­ния, картинки и икони, класове за записване в различни файлови формати и за преоразмеряване на изображения.

  • System.Drawing.Drawing2D – предоставя класове за графични транс­формации – бленди, матрици и др.

  • System.Drawing.Text – предоставя класове за достъп до шрифто­вете на графичната среда.

  • System.Drawing.Printing – предоставя класове за печатане на принтер и системни диалогови кутии за печатане.

Класът Graphics


Класът System.Drawing.Graphics предоставя абстрактна повърхност за чертане. Такава повърхност може да бъде както част от контрола на екрана, така и част от страница на принтер или друго устройство.

Най-често чертането се извършва в обработчика на събитието Paint. В него при необходимост се преизчертава графичният облик на контролата. Параметърът PaintEventArgs, който се подава, съдържа Graphics обекта. Graphics обект може да се създава чрез Control.CreateGraphics(). Той задължително трябва да се освобождава чрез finally блок или с конс­трукцията using, защото е ценен ресурс.


Работа със System.Drawing – пример


Чрез настоящия пример ще илюстрираме работата с GDI+ чрез пакета System.Drawing – чертане на геометрични фигури с четки и моливи и изобразяване на текст със зададен шрифт.

Ето и стъпките за изграждане на нашето примерно приложение:



  1. Стартираме VS.NET и създаваме нов Windows Forms проект.

  2. Задаваме на главната форма име MainForm и заглавие "System.Drawing Demo". Променяме и името на файла от Form1.cs на MainForm.cs.

  3. Добавяме обработчик на събитието Paint, където изчертаваме графично изображение:

private void MainForm_Paint(object sender,

System.Windows.Forms.PaintEventArgs e)

{

Graphics g = e.Graphics;



g.SmoothingMode = SmoothingMode.AntiAlias;
Brush brush = new SolidBrush(Color.Blue);

g.FillEllipse(brush, 50, 40, 350, 250);

brush.Dispose();
Pen pen = new Pen(Color.Red, 2);

g.DrawRectangle(pen, 40, 50, 200, 40);

pen.Dispose();
brush = new SolidBrush(Color.Yellow);

Font font = new Font("Arial", 14, FontStyle.Bold);

g.DrawString(".NET Framework", font, brush, 60, 60);

brush.Dispose();

font.Dispose();

}


В метода вземаме Graphics обекта на формата, създаваме подходящи четки, моливи и шрифтове и с тях изчертаваме запълнена елипса и право­ъгълник и в него изписваме текст. Всички GDI+ ресурси (четки, моливи и шрифтове) задължително се освобождават след използване.

  1. Приложението е готово и можем да го стартираме и тестваме:


Анимация със System.Drawing – пример


Настоящия пример илюстрира как със средствата на GDI+ чрез пакета System.Drawing може да реализира плавна анимация на някакъв геометричен обект.

Ето и стъпките за изграждане на нашето примерно приложение:



  1. Стартираме VS.NET и създаваме нов Windows Forms проект.

  2. Задаваме на главната форма име MainForm и заглавие "System. Drawing Demo". Променяме и името на файла от Form1.cs на MainForm.cs.

  3. Добавяме променливи и константи за позицията на анимирания обект (елипса), стъпката на преместване и размерите на елипса­та:

    private int mPosX = 0;

    private int mPosY = 0;

    private int StepX = 1;

    private int StepY = 1;


    public const int ELLIPSE_SIZE_X = 70;

    public const int ELLIPSE_SIZE_Y = 40;



  4. Поставяме в главната форма една Timer компонента с име TimerAnimaiton и един PictureBox с име PictureBoxAnimatoin.

  5. Добавяме обработчик на събитието Paint на PictureBox контрола­та. В него изчертаваме движещия се обект на позицията, в която се намира в момента:

    private void PictureBoxAnimation_Paint(object sender,

    System.Windows.Forms.PaintEventArgs e)

    {

    Graphics g = e.Graphics;



    g.SmoothingMode = SmoothingMode.AntiAlias;
    Brush brush = new SolidBrush(Color.Blue);

    g.FillEllipse(brush, mPosX, mPosY,

    ELLIPSE_SIZE_X, ELLIPSE_SIZE_Y);

    brush.Dispose();


    brush = new SolidBrush(Color.Yellow);

    Font font = new Font("Arial", 14, FontStyle.Bold);

    g.DrawString(".NET", font, brush, mPosX+10, mPosY+10);

    brush.Dispose();

    font.Dispose();

    }


  6. Задаваме на свойствата Enabled и Interval на Timer компонентата съответно стойности true и 10. Така тя ще генерира събитие на всеки 10 милисекунди.

  7. Добавяме обработчик на събитието Elapsed на Timer компонентата. В него променяме координатите на движещия се обект и пречерта­ва­ме PictureBox контролата:

    private void TimerAnimation_Elapsed(object sender,

    System.Timers.ElapsedEventArgs e)

    {

    mPosX += StepX;



    if ((mPosX >= PictureBoxAnimation.Width - ELLIPSE_SIZE_X - 3)

    || (mPosX <= 0))

    {

    StepX = -StepX;



    }
    mPosY += StepY;

    if ((mPosY >= PictureBoxAnimation.Height - ELLIPSE_SIZE_Y - 3)

    || (mPosY <= 0))

    {

    StepY = -StepY;



    }
    PictureBoxAnimation.Refresh();

    }


  8. Приложението е готово и можем да го стартираме и тестваме:

В примера сме използвали PictureBox контрола, защото тя не чертае нищо в своя Paint метод, който се извиква преди всяко пречертаване. Ако бяхме използвали Panel или друга контрола, щеше да се получи трепкане.

За професионална анимация се използва DirectX технологията, която използва ресурсите на графичната карта много по-ефективно и натоварва централния процесор много по-малко. Като цяло за по-сложни прило­жения (например игри), използваният в този пример подход е грешен!

Печатане на принтер


Често се налага създадените от нас приложения да отпечатват някаква информация на принтер. Пространството System.Drawind.Printing ни пре­дос­тавя класове, чрез които можем да реализираме такава функцио­нал­ност.

При печатането на принтер се използват три ключови класа:



  • PrintDialog – стандартен диалог за печатане на принтер. Позволява на потребителя да избере принтер и да укаже кои части от доку­мен­та да се отпечатат.

  • PrintController – управлява процеса на печатане и активира съби­тия, свързани с него. PrintController предоставя Graphics по­върх­ност­­та, върху която печатаме.

  • PrintDocument – описва характеристиките на отпечатвания доку­мент. Съдържа PrinterSettings върнати от PrintDialog.

Обикновено, когато искаме да отпечатаме нещо на принтер, създаваме инстанция на класа PrintDocument, задаваме стойности на свойствата, описващи какво ще печатаме и извикваме метода Print(), за да отпе­ча­та­ме документа.

Потребителски контроли


Потребителските контроли (custom controls) позволяват разширяване на стандартния набор от контроли чрез комбиниране на съществуващи контроли, разширяване на съществуващи или създаване на съвсем нови контроли.

Потребителските контроли или разширяват съществуващи контроли или класа Control или класа UserControl. Те могат да управляват поведе­нието си по време на изпълнение, както и да взаимодействат с дизайнера на VS.NET по време на дизайн.


Създаване на нова контрола, която не наследява никоя съществуваща контрола


Създаването на нова контрола, която не наследява никоя съществуваща, става по следния начин:

  1. От VS.NET избираме File | Add New Item … | UI | Custom Control.

  2. Припокриваме виртуалния метод Paint(…), за да чертаем графич­ният образ на кон­тро­ла­та.

  3. Дефинираме необходимите свойства и методи.

  4. Обявяваме свойствата, достъпни от дизайнера на средата за разработка (VS.NET) чрез следните атрибути:

  • Category – указва категорията, в която ще се показва свойството.

  • Description – задава описание на свойството.

Създаване на нова контрола като комбинация от други контроли


Създаването на контрола, като комбинация от други контроли става по следния начин:

  1. От VS.NET избираме File | Add New Item … | UI | User Control.

  2. Използваме дизайнера на VS.NET, за да добавим контроли и да оформим желания вид на контролата.

  3. Обявяваме свойствата, достъпни за дизайнера на средата за разра­ботка чрез атрибутите Category и Description.

Създаване на нова контрола, която наследява съществуваща контрола


Създаването на нова контрола, която наследява съществуваща контрола, става по следния начин:

  1. От VS.NET избираме File | Add New Item … | UI | Inherited User Control.

  2. Избираме контролата, от която ще наследяваме.

  3. Дефинираме допълнителни методи и свойства и ги обявяваме за дизайнера на VS.NET чрез атрибутите Category и Description.

  4. Припокриваме OnXXX() методите при необходимост за да променим поведението на оригиналната контрола.

Създаване на контрола – пример


В настоящия пример ще илюстрираме, как със средствата на Windows Forms и GDI+ можем да създаваме потребителски Windows Forms контро­ли. Ще създадем контролата ClockControl, която представлява кръгъл часовник със стрелки, на който може да се задава колко часа да показва.

Ето стъпките за създаване на контролата и на приложение, което я използва:



  1. Стартираме VS.NET и създаваме нов Windows Forms проект.

  2. Задаваме на главната форма име MainForm и заглавие "Clock Control Demo". Променяме и името на файла от Form1.cs на MainForm.cs.

  3. Създаваме нашата потребителска контрола. За целта избираме File | Add New Item … | UI | Custom Control. Задаваме ClockControl за име на контролата.



  1. Дефинираме две полета mHour и mMinute и свойства за достъп до тях. Те ще съдържат часа и минутите на нашия часовник:

private int mHour;

private int mMinute;


[Category("Behavior"), Description("Specifies the hour.")]

public int Hour

{

get


{

return mHour;

}
set

{

mHour = value;



this.Invalidate();

}

}


[Category("Behavior"), Description("Specifies the minutes.")]

public int Minute

{

get


{

return mMinute;

}
set

{

mMinute = value;



this.Invalidate();

}

}



Приложили сме към свойствата атрибути Category и Description, за да укажем на Visual Studio .NET да ги публикува в Properties прозореца по време на дизайн. При промяна на свойствата се извиква метода Invalidate(), за да се пречертае контролата и да се преместят стрелките на часовника.

  1. Добавяме една константа за размер по подразбиране и добавяме в конструктора код за инициализиране на контролата. Ще инициали­зи­раме контролата с текущия час:

    private const int DEFAULT_SIZE = 100;
    public ClockControl()

    {

    // This call is required by the Windows.Forms Form Designer.



    InitializeComponent();
    this.Size = new Size(DEFAULT_SIZE, DEFAULT_SIZE);

    mHour = DateTime.Now.Hour;

    mMinute = DateTime.Now.Minute;

    }


  2. Припокриваме виртуалния метод OnPaint(…) и в него чертаем часов­ника върху Graphics повърхността на контролата. За прес­мятане на координатите на стрелките използваме изчисления с помощта на тригонометрични функции синус и косинус:

    protected override void OnPaint(PaintEventArgs pe)

    {

    Graphics g = pe.Graphics;


    // Draw the circle

    Pen pen = new Pen(Color.Blue, 1);

    g.DrawEllipse(pen, 0, 0, this.Width-1, this.Height-1);

    pen.Dispose();


    // Draw the minute finger

    double minuteFingerAngle =

    (mMinute % 60) * (2*Math.PI/60);

    int minuteFingerLen = this.Width * 45 / 100;

    int x1 = this.Width / 2;

    int y1 = this.Height / 2;

    int x2 = (int) (x1 +

    minuteFingerLen*Math.Sin(minuteFingerAngle));

    int y2 = (int) (y1 –

    minuteFingerLen*Math.Cos(minuteFingerAngle));

    pen = new Pen(Color.Red, 2);

    g.DrawLine(pen, x1, y1, x2, y2);

    pen.Dispose();
    // Draw the hour finger

    double hourFingerAngle =

    (mHour % 12) * (2*Math.PI/12) +

    (mMinute % 60) * (2*Math.PI/(60*12));

    int hourFingerLen = this.Width * 25 / 100;

    x1 = this.Width / 2;

    y1 = this.Height / 2;

    x2 = (int) (x1 + hourFingerLen*Math.Sin(hourFingerAngle));

    y2 = (int) (y1 - hourFingerLen*Math.Cos(hourFingerAngle));

    pen = new Pen(Color.Yellow, 3);

    g.DrawLine(pen, x1, y1, x2, y2);

    pen.Dispose();


    // Calling the base class OnPaint

    base.OnPaint(pe);

    }


  3. Припокриваме метода OnSize(…), в който приравняваме височината и ширината на контролата и я пречертаваме. Така контролата винаги ще бъде с квадратна форма:

    protected override void OnResize(System.EventArgs e)

    {

    this.Height = this.Width;



    this.Invalidate();

    }


  4. Нашата потребителска контрола е готова. Можем да прекомпи­ли­ра­ме приложението и да я добавим в Toolbox. За да я добавим в Toolbox, щракваме в него с десен бутон на мишката и от там изби­ра­ме Add/Remove Items… В появилия се прозорец натискаме бутона Browse… и избираме изпълнимия файл на нашето прило­же­ние. Пос­та­­вяме отметка пред ClockControl в списъка и натискаме бутона OK. Контролата се добавя в Toolbox.

  5. В главната форма на приложението поставяме една ClockControl контрола с име clock и един панел с контроли за промяна на текущия час и минути – две NumericUpDown контроли с имена NumericUpDownHour e NumericUpDwonMinute и един бутон с име ButtonSetTime за отразя­ва­не на промените. Свойствата на ClockControl се могат да бъдат про­ме­няни от прозореца Properties:



  1. Добавяме код, който при зареждане на формата (при събитие Load на формата) задава стойностите на NumericUpDown контролите за час и минута съответстващи на тези от ClockControl обекта:

    private void MainForm_Load(object sender, System.EventArgs e)

    {

    NumericUpDownHour.Value = clock.Hour;



    NumericUpDownMinute.Value = clock.Minute;

    }


  2. Добавяме обработчик на събитието Click на ButtonSetTime. В него променяме стойностите на свойствата на ClockControl обекта:

    private void ButtonSetTime_Click(object sender,

    System.EventArgs e)

    {

    clock.Hour = (int) NumericUpDownHour.Value;



    clock.Minute = (int) NumericUpDownMinute.Value;

    }


  3. Добавяме обработчик на събитието SizeChanged на формата. В него добавяме код, който не позволява на часовника да бъде върху панела:

    private void MainForm_SizeChanged(object sender,

    System.EventArgs e)

    {

    ClientSize = new Size(



    ClientSize.Width, ClientSize.Width + PanelDown.Height);

    }


  4. Приложението е готово и можем да го стартираме и тестваме.


Хостинг на контроли в Internet Explorer


Internet Explorer може да изпълнява Windows Froms контроли, вградени в тялото на HTML страници. Технологията е подобна на Java аплетите и Macromedia Flash – вгражда се изпълним код, който се изпълнява в клиентския уеб браузър. От JavaScript могат да се достъпват свойствата на Windows Forms контролите. Необходими са Internet Explorer 5.5 или по-нова версия и инсталиран .NET Framework.

Настройките за сигурност не позволяват достъп до файловата система и други опасни действия. Сигурността може да се задава и ръчно. Ако има нужда от запазване на някакви данни на машината на потребителя, може да се използва Isolated Storage. [TODO: link към главата I/O]


Хостинг на контроли в Internet Explorer – пример


Настоящият пример илюстрира как можем да реализираме хостинг на Windows Forms контроли в Internet Explorer чрез вграждането им в HTML страница и как можем да достъпваме свойствата им от JavaScript.

Да разгледаме примерна HTML страница, в която е вградена Windows Forms контролата "часовник" от предходния пример:



index.html



Clock Control in IE


classid="http:Demo-18-CustomControl-Clock.exe#Demo_18_CustomControl_Clock.ClockControl"

width="200" height="200">

Hour:


Minute:







Сподели с приятели:
1   ...   8   9   10   11   12   13   14   15   16




©obuch.info 2024
отнасят до администрацията

    Начална страница