PROGRAMACIÓ D'APLICACIONS EDUCATIVES AMB VISUAL BASICMÒDUL 7ENRERA
PRÀCTICA 1 2 3 4 5
 
Executar el programa m7p3.exe per conèixer el seu comportament.

Veure el llistat del codi del programa, m7p3.

Executar Visual Basic per editar el projecte (acabat): m7p3.vbp.


Com creem i gestionem un menú: Afegim-hi una trama i...

L'objectiu aquí és afegir un menú que donarà noves possibilitats a la nostra aplicació educativa i hi afegirem un curiós efecte que tècnicament s'anomena Hint o Tip. Aquest efecte és comú en Windows 95, però no ho era tant en Windows 3... Aquí el que farem és crear-lo i així aprofundir en tècniques d'animació que són molt útils en aplicacions didàctiques.

L'aspecte de la finestra és:


Observeu que hi ha de més la barra de menú, Opcions i que la frase Prem botó esquerra i arrossega no està a la cantonada sinó en el lloc on es troba la rata. Això és un Hint, que ens aparegui una petita informació, pista, en el lloc oportú.

En el menú hi ha tres submenús:
    - El primer que posa Trama que l'activarem o desactivarem col·locant v al davant quan el premem, servirà per dibuixar una quadrícula a tota la finestra per facilitar les mesures.

    - L'altre submenú, Feixos de llum, tindrà un comportament similar a l'anterior i en funció de si està activat o no apareixeran o no les línies que representen els feixos de llum.

    - Finalment hi posem el submenú Sortir que servirà per abandonar el programa.


Fase de disseny de la interfície d’usuari

Aquest projecte el desareu a C:\VBCurs\VBActivi\m7\p3 amb el nom m7p3.

Podem partir del programa de la pràctica anterior i hi afegirem les modificacions.
  • Creeu el directori.
  • Copieu-hi els fitxers de la pràctica anterior m7p2.vbp i m7p2.frm
  • Crideu Visual Basic fent doble clic a m7p2.vbp.
  • Guardeu el fitxer, save as..., amb el nom m7p3.frm i guardeu el projecte amb l'altre nom m7p3.vbp.
  • Un cop fet això podeu borrar els fitxers m7p2.vbp, i m7p2.frm.


Fase de disseny del menú

Recordeu el mòdul 3, on varem aprendre a crear un menú. Feu el mateix amb les següents opcions:


A totes les opcions hi posareu les característiques per defecte excepte l'opció &Feixos de llum que activareu el quadre Checked


Fase de programació de respostes a events

Variables d'àmbit a tot el formulari
    Dim yT, xL, xO, yO, F, xI, yI As Integer
    Dim CalMoureObjecte, CalCanviarTamanyObjecte As Integer 
    Dim CalMoureLent, CalMoureFocus, CalMoureTerra As Integer
    Dim HiHaHint, HintX, HintY As Integer

Observeu que només hem afegit l'última línia que són les variables per definir si hi ha o no Hint i la seva posició.


Procediments d'àmbit a tot el formulari

El procediment iniciar és el mateix que l'anterior, pero hi afegim la inicialització de les noves variables.
    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
    End Sub

El procediment (mètode) Pintar és el mateix modificat. Les diferències són:
    - On es dibuixarà la trama si està activada o no l'opció del menú. If mnuTrama.Checked Then...

    - On es dibuixaven els eixos s'ha canviat en funció de si està activada o no l'opció de menú. If mnuFeixos.Checked Then...

    - En l'última part hi ha on s'escriu el Hint. Ho fa en la posició HintX, HintY que es la posició de la rata quan calgui dibuixar el Hint i vindrà donada per l'event MouseMove. If HiHaHint Then...
    Sub Pintar ()
      Dim r 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)
      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)
      
      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
          Line (xL, yT - yO)-(1300, yT - yO + (1300 - xL) / F * yO), QBColor(2)
        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)
        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"
    	If mnuFeixos.Checked Then
    	  ForeColor = QBColor(2)
    	  DrawStyle = 2
    	  Line (xI, yI)-(xO, yT - yO)
    	  Line (xI, yI)-(xL, yT - yO)
    	  DrawStyle = 0
    	End If
          Else
    	Print "Imatge"
          End If
        End If
      End If
    
      'Hint
      If HiHaHint Then
        ForeColor = QBColor(4)
        CurrentX = HintX
        CurrentY = HintY
        Print "Prem botó 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.

Els events MouseDown i MouseUp no canvien.

Els canvis de l'event MouseMove respecte l'anterior són:

    - Al principi s'inicia la variable HiHaHint a 0.

    - Al final, a partir If MousePointer <> 0 Then... és quan es diu si cal pintar o no i a on el Hint, i si cal fer-ho es fa amb el procediment Pintar.
    Sub Form_MouseMove (Button As Integer, Shift As Integer, x As Single, y As Single)
      HiHaHint = 0
      If CalCanviarTamanyObjecte = 1 Then
        yO = yT - y
        Pintar
      ElseIf CalMoureObjecte = 1 Then
        If x < xL - 1 Then
          xO = x
          Pintar
        End If
      ElseIf CalMoureLent = 1 Then
        If x > xO + 1 Then
          xL = x
          Pintar
        End If
      ElseIf CalMoureFocus = 1 Then
        If x > xL Then
          F = x - xL
          Pintar
        End If
      ElseIf CalMoureTerra = 1 Then
        yT = y
        Pintar
      Else
        MousePointer = 0
        If x > xO - 5 And x < xO + 5 Then
          If y > yT - yO - 5 And y < yT - yO + 5 Then
    	MousePointer = 7
          Else
    	MousePointer = 9
          End If
        ElseIf x > xL - 5 And x < xL + 5 Then
          MousePointer = 9
        ElseIf x > xL + F - 5 And x < xL + F + 5 Then
          MousePointer = 9
        ElseIf y > yT - 5 And y < yT + 5 Then
          MousePointer = 7
        End If
        If MousePointer <> 0 Then
          HiHaHint = 1
          HintX = x + 10
          HintY = y + 10
          Pintar
        Else
          HiHaHint = 0
          Pintar
        End If
      End If
    End Sub

Mètodes associats als events que controlen les accions sobre els menús

Els següents menús quan es cliquen fan que alternativament s'activi o desactivi el v (Checked or UnChecked)

Tema: Checked Subtema: Checked Property

    Sub mnuFeixos_Click ()
      mnuFeixos.Checked = Not mnuFeixos.Checked
      Pintar
    End Sub
    
    Sub mnuTrama_Click ()
      mnuTrama.Checked = Not mnuTrama.Checked
      Pintar
    End Sub

Finalment el menú Sortir per abandonar l'aplicació.
    Sub mnuSortir_Click ()
      End
    End Sub