Sunteți pe pagina 1din 9

Seminar 5 PAW

Gestiunea evenimentelor generate de mouse


Controalele aflate pe un formular intercepteaza activitatea mouse-ului daca au
proprietatile Enable si Visible pe true.
Clasa Control defineste noua evenimente legate de mouse, dintre care 4 sunt cele
mai frecvente:
- MouseDown, corespunzandu-i functia de tratare OnMouseDown, mostenita din
clasa Control;
- MouseUp, corespunzandu-i functia de tratare OnMouseUp;
- MouseMove, corespunzandu-i functia de tratare OnMouseMove;
- MouseWheel, corespunzandu-i functia de tratare OnMouseWheel.
Fiecare functie de tratare a unui astfel de eveniment contine un parametru de tip
MouseEventArgs ce furnizeaza informatii despre evenimentul produs:
- X si Y, coordonatele mouse-ului la momentul producerii evenimentului;
- MouseButtons, indica ce butoane ale mouse-ului au fost actionate;
- Clicks, indica daca s-a efectuat single sau double click ;
- Delta, indica sensul si dimensiunea deplasarii rotitei mouse-ului.

Aplicatia 1:
Enunt:
Sa se creeze o aplicatie Windows pentru a implementa scrierea cu mouse-ul pe o
suprafata (simularea aplicatiei Windows Paint).
Rezolvare:
Se stabileste pentru Form1 proprietatea BackColor=White si se trage din Toolbox
un control label1 in partea stanga-jos a lui Form1. De asemenea, se pune pe formular si
un meniu contextual contextMenuStrip1. In clasa Form1 se definesc urmatorii membri:
//se declara o colectie lista de puncte si se initializeaza
private ArrayList lstPct;
//se initializeaza o variabila "mouse apasat" pe false
private bool mApasat = false;
//se defineste o suprafata de desenare
Graphics contextImagine;
//se defineste un obiect Bitmap pentru salvare desen
Bitmap imagineTampon;

Se initializeaza lista de puncte, imaginea si contextul grafic in constructorul formei:


public Form1()
{
InitializeComponent();
//se initializeaza lista de puncte, imaginea si contextul grafic
this.lstPct = new ArrayList(100);
imagineTampon = new Bitmap(Width, Height);
contextImagine = Graphics.FromImage(imagineTampon);

Pe evenimentul MouseDown al formei se scrie:


private void Form1_MouseDown(object sender, MouseEventArgs e)
{
//daca s-a apasat butonul stanga al mouse-ului
if (e.Button == MouseButtons.Left)
{
//se adauga la lista de puncte un nou punct care primeste
coordonatele pozitiei mouse-ului
Point p = new Point(e.X, e.Y);
lstPct.Add(p);
mApasat = true;
label1.Text = "Mouse Apasat";
Invalidate();
}
}

Pe evenimentul MouseMove al formei se scrie:


private void Form1_MouseMove(object sender, MouseEventArgs e)
{
//daca s-a apasat butonul stanga al mouse-ului
if (e.Button == MouseButtons.Left)
{
//se adauga la lista de puncte un nou punct care primeste
coordonatele pozitiei mouse-ului
Point pct = new Point(e.X, e.Y);
lstPct.Add(pct);
//se defineste un obiect pensula care preia culoarea implicita
a formularului
Pen pensula = new Pen(this.ForeColor); //pentru a scrie cu alta
culoare se modifica proprietatea ForeColor a formei
if (mApasat)
{
label1.Text = "Mouse scrie acum";
//se traseaza o linie de la ultimul punct existent in
lista pana la punctul curent
if (lstPct.Count > 1)
contextImagine.DrawLine(pensula,
(Point)lstPct[lstPct.Count - 2],
(Point)lstPct[lstPct.Count - 1]);
Invalidate();
}
}
}

Pe evenimentul MouseUp al formei se scrie:


private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point pRef = new Point(-1, -1);
lstPct.Add(pRef);
mApasat = false;
label1.Text = "Mouse liber";
Invalidate();

}
}

In cadrul meniului contextual se stabilesc doua optiuni pentru schimbarea culorii de


scriere si pentru salvarea desenului sub forma de imagine. Se asociaza formularul cu meniul
contextual prin setarea numelui meniului contextual in proprietatea ContextMenuStrip a
formei.
Pe evenimentul Click aferent optiunii de schimbare culoare se scrie:
private void schimbaCuloareToolStripMenuItem_Click(object sender, EventArgs
e)
{
ColorDialog cdg = new ColorDialog();
if (cdg.ShowDialog() == DialogResult.OK)
{
this.ForeColor = cdg.Color;
}
}

Pe evenimentul Click aferent optiunii de salvare a desenului sub forma de imagine se


scrie:
private void salveazaImagineToolStripMenuItem_Click(object sender,
EventArgs e)
{
save(this, "imagine.bmp");
MessageBox.Show("Imagine salvata cu succes!", "Mesaj",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}

Se adauga functia save() care se apeleaza in functia asociata evenimentului Click


aferent optiunii de salvare. Functia save() realizeaza salvarea continutului formei sub forma
de imagine Bitmap.
public void save(Control control, string fisier)
{
Graphics g = control.CreateGraphics();
Bitmap bmp = new Bitmap(control.Width, control.Height);
control.DrawToBitmap(bmp, new Rectangle(0, 0, control.Width,
control.Height));
bmp.Save(fisier);
bmp.Dispose();
}

Pentru a nu pierde continutul formei in urma minimizarii acesteia se supradefineste


metoda OnPaint():
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawImage(imagineTampon, 0, 0);
}

Rezultatul rularii aplicatiei este prezentat in figurile urmatoare.

Gestiunea evenimentelor generate de tastatur


Exist trei evenimente legate de folosirea tastaturii:
KeyDown
KeyPress
KeyUp
Evenimentele KeyDown si KeyUp se declanseaza la apasarea, respectiv relaxarea unei
taste, iar evenimentul KeyPress se produce la apasarea unei taste, dar dupa KeyDown si numai
daca apasarea tastei genereaza o valoare de tip caracter (nu si in cazul apasarii tastelor
functionale).
-

Blocul de argumente al functiei de tratare este de tip KeyPressEventArgs, care are


urmatoarele proprietati:
- Handled, care precizeaza daca evenimentul se considera deja tratat (true/false);
- KeyChar, care specifica caracterul aferent tastei apasate ce a produs evenimentul.

Aplicatia 2:
Enunt:
Sa se creeze o aplicatie Windows pentru a restrictiona posibilitatea introducerii de
caractere nenumerice intr-un textbox.
Rezolvare:
Pe un formular se adauga o eticheta label1 si doua textbox-uri. Pentru textBox2 se
stabilesc proprietatile Multiline = True si ReadOnly = True.
In clasa formei se defineste si initializeaza o variabila booleana pentru a determina
daca se tasteaza un caracter nenumeric.
private bool nonNumberEntered = false;

Pe evenimentul KeyDown asociat controlului textBox1 se scrie:


//pe evenimentul KeyDown se determina tipul de caracter introdus
private void textBox1_KeyDown(object sender,
System.Windows.Forms.KeyEventArgs e)
{
nonNumberEntered = false;
//verifica daca tasta apasata este un numar (partea de sus a
tastaturii)
if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
{
//verifica daca tasta apasata este un numar (partea dreapta a
tastaturii - NumPad)
if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
{
//verifica daca tasta apasata este Backspace
if (e.KeyCode != Keys.Back)
{
//s-a introdus un caracter nenumeric
textBox2.Text += e.KeyCode.ToString();
//se seteaza variabila booloeana pe true si se
evalueaza in evenimentul KeyPress
nonNumberEntered = true;
}
}
}
//daca s-a apasat tasta shift, atunci nu este un numar
if (Control.ModifierKeys == Keys.Shift)
{
nonNumberEntered = true;
}
}

Pe evenimentul KeyPress asociat controlului textBox1 se scrie:


//pe evenimentul KeyPress se previne introducerea caracterelor in cadrul
textbox-ului
private void textBox1_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e)
{
if (nonNumberEntered == true)
{
//nu permite caracterului sa fie introdus in cadrul textboxului, nefiind un numar
e.Handled = true;
}
}

Pe evenimentul KeyUp asociat controlului textBox1 se scrie:


private void textBox1_KeyUp(object sender,
System.Windows.Forms.KeyEventArgs e)
{
//daca s-a apasat tasta F1
if (e.KeyCode == Keys.F1)
{
//se afiseaza un mesaj
MessageBox.Show("Ati apasat F1", "Atentie",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}

Codul aferent fiecarei taste nenumerice apasate se scrie in textBox2. In cazul in care
se apasa tasta F1 apare un mesaj de atentionare.
Rezultatul rularii aplicatiei este prezentat in figura urmatoare.

Acces la cmpuri prin acceleratori, interceptnd tastatura


Acceleratorii reprezinta shortcut-uri aferente diverselor butoane sau optiuni din
meniurile unei aplicatii Windows, astfel incat functiile aferente evenimentelor Click asociate
controalelor pentru care s-au definit acceleratorii sa se apeleze prin apasarea tastei
corespunzatoare.
Definirea unui accelerator se face prin introducerea semnului & in cadrul
proprietatii Text pentru setarea denumirii aferente controlului respectiv. De exemplu, pe
optiunea File din cadrul unui meniu, pentru a permite apelul respectivei optiuni prin apasarea
tastelor Alt si apoi F, proprietatea Text va avea valoarea &File.

Aplicatia 3:
Enunt:
Sa se construiasca un browser de internet in cadrul caruia sa se defineasca acceleratori
pentru optiunile din meniu.
Rezolvare:
Pe un formular se adauga urmatoarele controale:
- un webBrowser1;
- un menuStrip1;
- un toolStrip1;
- un statusStrip1.
In cadrul meniului principal menuStrip1 se adauga optiunile File si About, iar
optiunea File are urmatoarele 3 suboptiuni: Open, Save, Exit.
In cadrul controlului toolStrip1 se adauga butoanele Back, Fwd, Reload, Home si
Go. De asemenea, se defineste si un textbox pentru introducerea adresei web.
In cadrul lui statusStrip1 se defineste un ProgressBar pentru afisarea incarcarii
paginii web.
Evenimentele asociate controlului webBrowser1 sunt tratate in continuare.
private void webBrowser1_Navigating(object sender,
WebBrowserNavigatingEventArgs e)
{
toolStripProgressBar1.MarqueeAnimationSpeed = 80;
toolStripProgressBar1.Style = ProgressBarStyle.Marquee;
}
private void webBrowser1_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
toolStripProgressBar1.MarqueeAnimationSpeed = 0;
toolStripProgressBar1.Style = ProgressBarStyle.Blocks;
}
private void webBrowser1_Navigated(object sender,
WebBrowserNavigatedEventArgs e)
{
toolStripProgressBar1.MarqueeAnimationSpeed = 0;
toolStripProgressBar1.Style = ProgressBarStyle.Blocks;
}

Evenimentele asociate optiunilor din cadrul controlului menuStrip1 sunt tratate in


continuare.
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = "txt files (*.html)|*.html|All files
(*.*)|*.*";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
GoToUrl(openFileDialog1.FileName);
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "html files (*.html)|*.html|All files
(*.*)|*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamWriter htmlFile =
File.CreateText(saveFileDialog1.FileName);
htmlFile.Write(webBrowser1.DocumentText);
htmlFile.Close();
}
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Version 1.00", "About");
}

Evenimentele asociate optiunilor din cadrul controlului toolStrip1 sunt tratate in


continuare.
private void toolStripButton1_Click(object sender, EventArgs e)
{
webBrowser1.GoBack();
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
webBrowser1.GoForward();
}
private void toolStripButton3_Click(object sender, EventArgs e)
{
webBrowser1.Refresh();
}

private void toolStripButton4_Click(object sender, EventArgs e)


{
webBrowser1.GoHome();
}
private void toolStripButton5_Click(object sender, EventArgs e)
{
GoToUrl(toolStripTextBox1.Text);
}
private void GoToUrl(string url)
{
Cursor.Current = Cursors.WaitCursor;
try
{
webBrowser1.Navigate(url);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Cursor.Current = Cursors.Default;
}

Pentru a permite accesarea unei pagini web direct prin apasarea tastei Enter in urma
introducerii adresei in cadrul textbox-ului aferent, se trateaza evenimentul KeyDown aferent
textbox-ului.
private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return) GoToUrl(toolStripTextBox1.Text);
}

Rezultatul este prezentat in continuare.

S-ar putea să vă placă și