Calculatoare
Gestiunea mouse-uluiGESTIUNEA MOUSE-ULUI In Visual Basic pentru urmarirea activitatii mouse-ului sunt utilizate trei evenimente de baza: MouseDown - utilizatorul a apasat un buton de mouse; MouseUp - utilizatorul a eliberat un buton de mouse; MouseMove - un buton de mouse fiind tinut apasat, utilizatorul muta (gliseaza) mouse-ul. Prototipul procedurii atasate evenimentului MouseDown este urmatorul: daca butonul de mouse este apasat pe o forma standard: Private Sub Form_MouseDown(Button As Integer,Shift As Integer, x As Single, y As Single) daca butonul de mouse este apasat pe o forma MDI (interfata multidocument): Private Sub MDIForm_MouseDown(Button As Integer,Shift As Integer, x As Single, y As Single) daca butonul de mouse este apasat pe un control avand numele NumeControl: Private Sub NumeControl_MouseDown( [Index As Integer,] Button As Integer, Shift As Integer, x As Single, y As Single) Prototipul procedurii atasate evenimentului MouseUp este urmatorul: daca butonul de mouse este eliberat pe o forma standard: Private Sub Form_MouseUp(Button As Integer,Shift As Integer, x As Single, y As Single) daca butonul de mouse este eliberat pe o forma MDI (interfata multidocument): Private Sub MDIForm_MouseUp(Button As Integer,Shift As Integer, x As Single, y As Single) daca butonul de mouse este eliberat pe un control avand numele NumeControl: Private Sub NumeControl_MouseUp( [Index As Integer,] Button As Integer, Shift As Integer, x As Single, y As Single) Semnificatia parametrilor este centralizata in tabelul urmator: <tabel> *Parametru *Descriere *Index *Livreaza o valoare intreaga prin care se identifica univoc controlul in cazul in care controlul respectiv este intr-un tabel de controale. *Button *Livreaza o valoare intreaga prin care se poate identifica care buton de mouse a fost apasat (MouseDown) sau eliberat (MouseDown). in parametrul Button: bitul 0 (cel mai putin semnificativ) corespunde butonului stang; bitul 1 corespunde butonului drept; bitul 2 corespunde butonului din mijloc. Acesti biti corespund valorilor 1, 2 si 4. Din cei trei biti numai un singur bit este pozitionat pe 1 (care corespunde butonului actionat). *Shift *Livreaza o valoare intreaga prin care se poate analiza starea tastelor SHIFT, CTRL si ALT in momentul in care se apasa sau se elibereaza un buton de mouse. in parametrul Shift bitul 0 (cel mai putin semnificativ) corespunde tastei SHIFT; bitul 1 corespunde tastei CTRL; bitul 2 corespunde tastei ALT. Acesti biti corespund valorilor 1,2 si 4. Un bit este pozitionat pe 1 atunci cand tasta respectiva este apasata. Pot fi actionate simultan toate cele trei taste, sau numai unele taste sau tastele pot fi neactionate. De exemplu, daca sunt apasate simultan tastele CTRL si ALT, atunci valoarea livrata de parametrul Shift va fi egal cu 2 + 4 = 6. *x,y *Returneaza un numar care specifica locatia curenta a cursorului de mouse (in raport cu un control sau o forma). Valorile x si y intotdeauna sunt exprimate in sistemul de coordonate stabilit prin intermediul proprietatilor ScaleHeight, ScaleWidth, ScaleLeft si ScaleTop </tabel> Pentru testarea valorii parametrului Button pot fi utilizate urmatoarele constante predefinite: <tabel> *Constanta Valoare Semnificatie *vbLeftButton A fost actionat butonul stang. *vbRightButton A fost actionat butonul drept. *vbMiddleButton A fost actionat butonul din mijloc. </tabel> Pentru testarea valorii parametrului Shift pot fi utilizate urmatoarele constante predefinite: <tabel>
*Constanta Valoare Semnificatie *vbShiftMask Este apasata tasta SHIFT. *vbCtrlMask Este apasata tasta CTRL. *vbAltMask Este apasata tasta ALT. </tabel> Intr-o procedura se poate testa orice combinatie de conditii, de exemplu daca este apasat butonul stang de mouse si este apasata tasta Ctrl: Dim StangApasat As Boolean, CtrlApasat As Boolean StangApasat (Button And vbLeftButton) > 0 CtrlApasat (Shift And vbCtrlMask) > 0 If StangApasat And CtrlApasat Then <titlu> Evenimentul MouseMove Este declansat atunci, cand un buton de mouse este apasat si utilizatorul muta (gliseaza) mouse-ul pe o forma sau pe un control. Evenimentul este generat in mod continuu atata timp, cat cursorul trece prin obiect (adica cursorul este in interiorul chenarului aferent controlului sau formei). Prototipul procedurii atasate evenimentului MouseMove este urmatorul: mutarea cursorului de mouse pe o forma standard: Private Sub Form_MouseMove(Bwton As Integer, Shift As Integer, x As Single, y As Single) mutarea cursorului de mouse pe o forma MDI (interfata multidocument): Private Sub MDIForm_MouseMove(Button« As Integer, Shift As Integer, x As Single, y As Single) mutarea cursorului de mouse pe un control care are numele NumeControl'. Private Sub NumeControl_MouseMove( [Index As Integer,] Button As Integer, Shift As Integer, x As Single, y As Single) Semnificatia parametrilor este asemanatoare cu cea descrisa la evenimentele MouseDown si MouseUp, cu urmatoarea deosebire: parametrul Button al procedurii MouseMove indica starea curenta a tuturor butoanelor (unele butoane sunt apasate, toate butoanele sunt apasate sau nici un buton nu este apasat), in timp ce la evenimentele MouseDown si MouseUp acest parametru indica starea unui singur buton. EXEMPLUL1: Aplicatia urmatoare ilustreaza prelucrarea evenimentului MouseDown atasat formei, in momentul apasarii butonului se afiseaza coordonatele mouse-ului precum si tipul butonului utilizat. Fereastra afisata de aplicatie poate avea aspectul urmator: Fig.pag.285 sub forma unei ferestre. Textul sursa al programului este: Option Explicit Private Sub Form_MouseDown(Button As Integer,_ Shift As Integer, X As Single, Y As Single) CurrentX X CurrentY = Y Select Case Button Case vbLeftButton Print 'Butonul stang (' & X & ',' & Y & ')' Case vbRightButton Print 'Butonul drept (' & X & ',' & Y & ')' Case vbMiddleButton Print 'Butonul din mijloc (' & X & ',' & Y & End Select End Sub EXEMPLUL 2: in aceasta aplicatie la fiecare declansare a evenimentului MouseDown atasat formei se uneste cu un segment de dreapta pozitia actuala de desenare (CurrentX, CurrentY) cu punctul (X, V) a formei in care s-a efectuat un clic de mouse. Fereastra afisata de aplicatie poate avea aspectul alaturat. Textul sursa al programului este: Private Sub Form_MouseDown(Button As Integer,_ Shift As Integer, X As Single, Y As Single) Line -(X, Y) End Sub EXEMPLUL 3: Aplicatia urmatoare ilustreaza modul de prelucrare a evenimentelor MouseDown si MouseMove atasate formei. Se mentioneaza faptul ca nu se apeleaza procedura aferenta evenimentului MouseMove pentru fiecare pozitie a cursorului de mouse. Butonul stang fiind apasat, se modifica pozitia mouse-ului. Pentru fiecare eveniment MouseMove receptionat se va desena cate un dreptunghi. Dimensiunea si densitatea dreptunghiurilor desenate depinde de viteza de deplasare a mouse-ului. Fereastra afisata de aplicatie poate avea aspectul alaturat. Fig.pag.286 sub forma unei ferestre. Textul sursa al programului este: Option Explicit Dim PozInitX As Integer Dim PozInitY As Integer Private Sub FormJMouseDown(Button As Integer,_ Shift As Integer, X As Single, Y As Single) PozInitX X PozInitY Y Cls End Sub Private Sub Form_MouseMove(Button As Integer,_ Shift As Integer, X As Single, Y As Single) Dim dx As Integer, dy As integer, PozActX As Integer,_ PozActY As Integer PozActX X PozActY Y dx Abs(PozActX PozInitX) dy Abs(PozActY PozInitY) Line (PozInitX dx, PozInitY – dy) – (PozInitX + dx,_ PozInitY + dy), , B End Sub EXEMPLUL Aplicatia urmatoare ilustreaza prelucrarea evenimentelor MouseMove si MouseDown atasate formei. Daca se apasa si se elibereaza butonul stang, atunci se sterge fereastra aplicatiei. Butonul stang fiind apasat se modifica pozitia mouse-ului. Pentru fiecare eveniment MouseMove receptionat se memoreaza pozitia actuala a cursorului. Densitatea pozitiilor memorate depinde de viteza de deplasare a mouse-ului. Vor fi memorate cel mult MaxPuncte = 1500 puncte. Pozitiile fiind memorate intr-un tabel, prin actionarea butonului drept fiecare punct al multimii va fi legat cu celelalte puncte, prin segmente de dreapta. Fereastra afisata de aplicatie poate avea aspectul alaturat. Fig.pag.286 sub forma unei ferestre. Textul sursa al programului este: Option Explicit Private Const MaxPuncte private Type Puncte X As Integer Y As Integer End Type Dim Contor As Integer Dim Puncte(0 To MaxPuncte) As Puncte Private Sub Form_MouseDown(Button As Integer,_ Shift As Integer, X As Single, Y As Single) Dim i As Integer Dim j As Integer Cls If Button vbLeftButton Then Contor = 0 ElseIf Button vbRightButton Then For i = 0 To Contor - 2 For j = i To Contor - 1 CurrentX Puncte(i).X CurrentY Puncte(i).Y Line (CurrentX, CurrentY)-(Puncte(j).X, Puncte(j).Y) Next j Next i End If End Sub Private Sub Form_MouseMove(Button As Integer,_ Shift As Integer, X As Single, Y As Single) If Contor < MaxPuncte Then Puncte(Contor).X X Puncte(Contor).Y = Y Contor = Contor + 1 End If End Sub EXEMPLUL 5: Aplicatia urmatoare permite desenarea traseului mouse-ului, astfel ca se pot realiza desene asemanatoare celor pe care le facem cu un creion pe o foaie de hartie, in program sunt prelucrate evenimentele MouseDown, MouseUp si MouseMove atasate formei. Fereastra afisata de aplicatie poate avea aspectul alaturat. Fig.pag.287 sub forma unei ferestre. Textul sursa al programului este: Option Explicit Dim ButonApasat As Boolean Private Sub Form_Load() ButonApasat False DrawWidth ForeColor RGB( End Sub Private Sub Form_MouseDown(Button As Integer,_ Shift As Integer, X As Single, Y As Single) If Not ButonApasat Then ButonApasat True GurrentX X CurrentY Y End If End Sub Private Sub Form_MouseMove(Button As Integer,_ Shift As Integer, X As Single, Y As Single) If ButonApasat Then Line (CurrentX, CurrentY)-(X, Y) End Sub Private Sub Form_MouseUp(Button As Integer,_ Shift As Integer, X As Single, Y As Single) If ButonApasat Then ButonApasat False End Sub
|