|
|
|
Executar el programa m7p4.exe per conèixer el seu comportament. Veure el llistat del codi del programa, m7p4. Executar Visual Basic per editar el projecte (acabat): m7p4.vbp. Com creem i gestionem un menú. Afegim-hi una simulació d'una lent divergentAugmentarem les capacitats didàctiques del programa afegint la característica de poder modelitzar el comportament d'una lent divergent.El canvi de comportament ho aconseguirem clicant en un menú. Això es pot fer de diverses maneres, per exemple canviant un menú d'etiqueta convergent-divergent. L'estratègia adoptada aquí no és aquesta, ho farem amb dos menús que canvien el seu estat de Checked-UnChecked i Enabled-Disabled i així també aprendrem com gestionar-ho. L'aspecte dels menús és el que veiem en la figura. ![]() Fase de disseny de la interfície d’usuariAquest projecte el desareu a C:\VBCurs\VBActivi\m7\p4 amb el nom m7p4.Podem partir del programa de la práctica anterior i hi afegirem les modificacions.
Fase de disseny del menú Hi afegim un nou menú, Tipus de lent, que conté 2 submenús: Convergent i Divergent amb les respectives propietat (Nombre), mnuConvergent i mnuDivergent. Les seves característiques: Checked-UnChecked i Enabled-Disabled les modificarem en temps d'execució. ![]()
Fase de programació de respostes a eventsVariables d'àmbit a tot el formulariNo hi ha cap canvi respecte la pràctica anterior. Procediments d'àmbit a tot el formulari El procediment iniciar és el mateix que l'anterior, pero hi afegim la inicialització de l'aspecte dels submenús mnuConvergent i mnuConvergent. Fa que un menú es presenti amb un color grayed i no estigui actiu, o sigui que si es clica no funciona. Sub iniciar () yT = 175 xL = 300 xO = 100 yO = 50 F = 100 CalMoureObjecte = 0 CalMoureLent = 0 CalMoureFocus = 0 CalCanviarTamanyObjecte = 0 CalMoureTerra = 0 HiHaHint = 0 HintX = 0 HintY = 0 mnuConvergent.Checked = True mnuDivergent.Checked = False mnuConvergent.Enabled = False mnuDivergent.Enabled = True End Sub El procediment (mètode) Pintar és el mateix modificat. La diferència és que pinta el comportament de la lent divergent segons els submenús mnuConvergent i mnuConvergent estiguin Checked o no. Sub Pintar ()
Dim r As Integer
'variables per la imatge de la lent divergent
Dim a1, b1, a2, b2 As Integer
Cls
'Trama
ForeColor = RGB(128, 128, 128)
If mnuTrama.Checked Then
r = 25
While r <= 480
Line (0, r)-(640, r)
r = r + 25
Wend
r = 25
While r <= 640
Line (r, 0)-(r, 480)
r = r + 25
Wend
End If
'Terra
ForeColor = QBColor(0)
Line (0, yT)-(1300, yT)
'Focus
Line (xL + F, yT - 5)-(xL + F, yT + 5)
Line (xL - F, yT - 5)-(xL - F, yT + 5)
CurrentX = xL + F
CurrentY = 20
Print "Focus"
'Lent
ForeColor = QBColor(6)
Line (xL, yT - 130)-(xL, yT + 130)
If mnuConvergent.Checked = True Then
Line (xL - 10, yT - 130 + 10)-(xL, yT - 130)
Line (xL + 10, yT - 130 + 10)-(xL, yT - 130)
Line (xL - 10, yT + 130 - 10)-(xL, yT + 130)
Line (xL + 10, yT + 130 - 10)-(xL, yT + 130)
Else
Line (xL, yT - 130)-(xL, yT + 130)
Line (xL - 10, yT - 130 - 10)-(xL, yT - 130)
Line (xL + 10, yT - 130 - 10)-(xL, yT - 130)
Line (xL - 10, yT + 130 + 10)-(xL, yT + 130)
Line (xL + 10, yT + 130 + 10)-(xL, yT + 130)
End If
CurrentX = xL
CurrentY = 20
Print "Lent"
'Objecte
ForeColor = QBColor(1)
r = 1
If yO < 0 Then
r = -1
End If
Line (xO, yT)-(xO, yT - yO)
Line (xO, yT - yO)-(xO - 10 * r, yT - yO + 10 * r)
Line (xO, yT - yO)-(xO + 10 * r, yT - yO + 10 * r)
CurrentX = xO
CurrentY = 20
Print "Objecte"
'Feixos de llum
If mnuFeixos.Checked Then
'Feix de llum paral.lel al terra
If Abs(F) > 1 Then
Line (xO, yT - yO)-(xL, yT - yO), QBColor(2)
'Feix de llum que passa pel focus
If mnuConvergent.Checked = True Then
Line (xL, yT - yO)-(1300, yT - yO + (1300 - xL) / F * yO), QBColor(2)
Else
Line (xL, yT - yO)-(1300, yT - yO - (1300 - xL) / F * yO), QBColor(2)
DrawStyle = 2
Line (xL, yT - yO)-(xL - F, yT), QBColor(2)
DrawStyle = 0
End If
End If
'Feix de llum que passa pel centre de la lent
If xL <> xO Then
Line (xO, yT - yO)-(1300, yT - yO + (1300 - xO) / (xL - xO) * yO), QBColor(2)
End If
End If
'Imatge
If (xL - xO) <> F And xL <> xO Then
ForeColor = QBColor(4)
If mnuConvergent.Checked = True Then
xI = (xO - xL * (xL - xO) / F) / (1 - (xL - xO) / F)
yI = yT - yO + (xI - xO) / (xL - xO) * yO
Line (xI, yT)-(xI, yI)
If (xO > xI) Then r = r * (-1)
Line (xI - 10 * r, yI - 10 * r)-(xI, yI)
Line (xI + 10 * r, yI - 10 * r)-(xI, yI)
If xI < 1300 And xI > 0 Then
CurrentX = xI
CurrentY = 20
If xI < xL Then
Print "Imatge virtual"
ForeColor = QBColor(2)
DrawStyle = 2
Line (xI, yI)-(xO, yT - yO)
Line (xI, yI)-(xL, yT - yO)
DrawStyle = 0
Else
Print "Imatge"
End If
End If
Else
If xL <> xO Then
a1 = -yO / (xL - xO)
b1 = yO - a1 * xO
a2 = yO / F
If a2 <> a1 Then
b2 = -a2 * (xL - F)
xI = (b1 - b2) / (a2 - a1)
yI = yT - (a1 * xI + b1)
Line (xI, yT)-(xI, yI)
If yI > yT Then r = 1 Else r = -1
Line (xI - 10 * r, yI - 10 * r)-(xI, yI)
Line (xI + 10 * r, yI - 10 * r)-(xI, yI)
End If
End If
End If
End If
If HiHaHint Then
ForeColor = QBColor(4)
CurrentX = HintX
CurrentY = HintY
Print "Prem butó esquerra i arrossega"
End If
End Sub
Mètodes associats a l'event Load i Paint Són els mateixos de la pràctica anterior. Mètodes associats als events que controlen les accions de la rata. MouseDown, MouseMove, MouseUp. Són els mateixos de la pràctica anterior. Mètodes associats als events que controlen les accions sobre els menús Només hi posem aquí els que afecten als nous. Sub mnuConvergent_Click () mnuConvergent.Checked = True mnuDivergent.Checked = False mnuConvergent.Enabled = False mnuDivergent.Enabled = True Pintar End Sub Sub mnuDivergent_Click () mnuConvergent.Checked = False mnuDivergent.Checked = True mnuConvergent.Enabled = True mnuDivergent.Enabled = False Pintar End Sub L'únic que fan és canviar les Properties: Checked i Enabled segons es cliquin. |