Кратко съдържание



страница22/33
Дата23.07.2016
Размер10.53 Mb.
#1889
1   ...   18   19   20   21   22   23   24   25   ...   33

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


Често се налага създадените от нас приложения да отпечатват някаква информация на принтер. Пространството 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 проект.



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

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

  3. Дефинираме две полета 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.



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

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

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

    {

    NumericUpDownHour.Value = clock.Hour;



    NumericUpDownMinute.Value = clock.Minute;

    }


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

    private void ButtonSetTime_Click(object sender,

    System.EventArgs e)

    {

    clock.Hour = (int) NumericUpDownHour.Value;



    clock.Minute = (int) NumericUpDownMinute.Value;

    }


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

    private void MainForm_SizeChanged(object sender,

    System.EventArgs e)

    {

    ClientSize = new Size(



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

    }


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





Сподели с приятели:
1   ...   18   19   20   21   22   23   24   25   ...   33




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

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