|
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. Tema: Enabled Subtema: Enabled Property 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. |