понедельник, 17 июня 2013 г.

Նկարչական գործիքի ստեղծումը C#-ի օգնությամբ (մաս 1)

Կարծում եմ բոլորին ծանոթ է Windows-ի ստանդարտ ծրագրերում գտնվող Paint ծրագիրը, որը հնարավորություն է տալիս կատարել հիմնական գործողություններ նկարների հետ: Նաև ծրագրի օգնությամբ կարող ենք ընտրել որոշակի գույնով և հաստությամբ մատիտ և նկարել: Այս և մի քանի հաջորդ հոդվածներում կփորձենք C#-ի օգնությամբ ստանալ Paint ծրագրի ֆունկցիոնալությանը մոտ ծրագիր:

1. Ստեղծեք նոր պրոյեկտ - File -> New Project
2. Ընտրեք Visual C# - Windows Forms Application, անվանեք պրոյեկտը Paint (կամ այնպես
ինչպես ինքներդ էք ցանկանում) և սեղմեք OK
3. Հայտնված Form-ի վրա ավելացրեք երկու կոճակ, մեկ Panel և ColorDialog
Form-ը պետք է ունենա այսպիսի տեսք

Այս հոդվածում կներկայացնեմ ամենաբարակ մատիտով նկարելու ֆունկցիոնալությունը:
Փորձենք նկարագրել քայլերի հաջորդականությունը, որով օգտագործողը պետք է նկարի ինչ-որ պատկեր:

1. Սեղմում է մկնիկի ձախ կոճակը
2. Տեղափոխում է մկնիկը որոշակի հետագծով, այդ հետագծով նկարվում է որոշակի պատկեր
3. Բաց է թողնում մկնիկի ձախ կոճակը

Բացենք Form-ի ծրագրի կոդը և սկսենք գրել ծրագիրը:
Ծրագրում հնարավորություն է տրվելու ընտրել մատիտի գույնը, սակայն լռելյալն (default) այն կլինի սև, դրա համար նկարագրենք Color տիպի հետևյալ փոփոխականը
    Color CurrentColor = Color.Black;
Ժամանակի ցանկացած պահին մկնիկի ձախ կոճակի սեղմված լինելու փաստը կստուգվի bool  տիպի isPressed փոփոխականով
    bool isPressed = false;
Երբ մկնիկի կոճակը սեղմելուց հետո այն շարժում ենք Panel-ի վրայով, մկնիկի յուրաքանչյուր դիրքում կարող ենք ունենալ մկնիկի ընթացիկ և նախորդ դիրքերը, դրա համար նկարագրենք հետևյալ փոփոխականները
     Point CurrentPoint;
     Point PrevPoint;
Եվ վերջում նկարելու համար կօգտագործենք հետևյալ փոփոխականը
     Graphics g;

Ստեղծենք գույնի ընտրության համար նախատեսված իրադարձությունը (Event), և ավելացնենք հետևյալ կոդը
        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult D = colorDialog1.ShowDialog();
            if (D == System.Windows.Forms.DialogResult.OK)
                CurrentColor = colorDialog1.Color;
        }
Իսկ նկարածը մաքրելու համար, հետևյալ իրադարձությունը
        private void button2_Click_1(object sender, EventArgs e)
        {
            panel1.Refresh();
        }

Մկնիկը սեղմելուն, թողնելուն և շարժելուն հետևելու համար ստեղծենք MouseDown, MouseUp և MouseMove իրադարծությունները:
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            isPressed = true;
            CurrentPoint = e.Location;
        }

Մկնիկը շարժելիս պետք է ստուգվի պայմանը սեղվմած է ձախ կոճակը թե ոչ: Եթե պայմանը տեղի ունի ապա պետք է ֆիքսել մկնիկի նախորդ դիրքը, ընթացիկ դիրքը և այդ երկու դիրքերով նկարել ուղիղ
        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isPressed)
            {
                PrevPoint = CurrentPoint;
                CurrentPoint = e.Location;
                paint_simple();
            }
        }
paint_simple() ֆունկցիան ունի հետևյալ տեսքը
        private void paint_simple()
        {
            Pen p = new Pen(CurrentColor);
            g.DrawLine(p, PrevPoint, CurrentPoint);
        }
Կարծես թե վերջ
Ահա ծրագրի աշխատանքի օրինակ և ծրագիրն ամբողջությամբ


using System;
using System.Drawing;
using System.Windows.Forms;

namespace Paint
{
    public partial class Form1 : Form
    {
        Color CurrentColor = Color.Black; //Default color
        Point CurrentPoint; //Current Position
        Point PrevPoint; //Previous Position
        bool isPressed;
        Graphics g;

        public Form1()
        {
            InitializeComponent();
            g = panel1.CreateGraphics();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult D = colorDialog1.ShowDialog();
            if (D == System.Windows.Forms.DialogResult.OK)
                CurrentColor = colorDialog1.Color;
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            isPressed = true;
            CurrentPoint = e.Location;
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isPressed)
            {
                PrevPoint = CurrentPoint;
                CurrentPoint = e.Location;
                paint_simple();
            }
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            isPressed = false;
        }

        private void paint_simple()
        {
            Pen p = new Pen(CurrentColor);
            g.DrawLine(p, PrevPoint, CurrentPoint);
        }

        private void button2_Click_1(object sender, EventArgs e)
        {
            panel1.Refresh();
        }
    }
}