XVIII. Affichage dans un formulaire sans freeglut▲
Jusqu'ici nous avons affiché la scène dans une nouvelle fenêtre gérée par freeglut.
Il est possible de l'afficher dans un formulaire.
Cela nécessite l'utilisation de quelques fonctions de l'API Windows que j'ai regroupées dans des modules de classe faciles à utiliser.
Notez que l'affichage dans un contrôle image est beaucoup plus lent car il faut lire les pixels de la scène et les injecter dans le contrôle.
Le frame rate chute sensiblement, mais on pourra s'en contenter selon les besoins.
XVIII-A. Affichage dans un contrôle image ou une section Access▲
Ce chapitre s'applique uniquement à Access.
Importez le module de classe clOpengGLFormAccess
Ce module contient les fonctions nécessaires à l'initialisation d'openGL et l'affichage de l'image dans un contrôle ou une section.
Pour l'utiliser, créez un nouveau formulaire avec un contrôle image nommé Image0.
Déclarez un objet en en-tête de module du formulaire (mettre la propriété Avec Code à Oui pour le formulaire) :
Private oGL As clOpengGLFormAccess
Sur chargement du formulaire, initialisez openGL :
Private Sub Form_Load()
' Crée l'objet pour dessin dans le contrôle image
Set oGL = New clOpengGLFormAccess
' Initialisation d 'openGL
oGL.InitOpenGL Me.Image0
End Sub
La fonction InitOpenGL crée une fenêtre masquée de même taille que le contrôle image.
Cette fenêtre sera utilisée par openGL.
Pour afficher la scène sur une section, utilisez la fonction InitOpenGLSection et précisez le formulaire et la section sur laquelle vous souhaitez dessiner.
Toute la section est alors utilisée pour dessiner la scène.
L'affichage est aussi rapide que sur une fenêtre avec freeglut
Ensuite on peut exécuter les commandes openGL pour dessiner.
Par exemple, le dessin du triangle :
' Vide les buffers couleur et profondeur
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
' Début de la primitive
glBegin GL_TRIANGLES
' Ajoute les trois sommets
glColor3VB vbYellow ' Jaune
glVertex2d 0, 0
glColor3VB vbBlue ' Bleu
glVertex2d 1, 0
glColor3VB vbRed ' Rouge
glVertex2d 1, 1
' Fin de la primitive
glEnd
L'affichage se fait à l'aide d'une des fonctions Display* :
Display : Affichage dans le contrôle :
Les pixels de la scènes sont injectés dans le contrôle.
Il peut y avoir des clignotements de l'image à des fréquences d'affichage élevées.
DisplayNoRepaint : Affichage dans le contrôle avec réduction des clignotements :
Effectue en plus un dessin par dessus le contrôle et annule le rafraîchissement du formulaire.
Cela évite des scintillements de l'image qui peuvent apparaître avec la fonction Display.
DisplayFast : Affichage par dessus le contrôle :
Effectue un dessin par dessus le contrôle.
Cet affichage n'est pas persistant mais peut s'avérer plus rapide et ne présente pas de problème de clignotements de l'image.
Si la scène est affichée sur une section (initialisation avec la fonction InitOpenGLSection), alors ces trois fonctions ont le même effet.
L'affichage n'est pas persistant lors du dessin sur une section.
Testons avec la fonction Display :
' Affichage dans le contrôle
oGL.Display
Voici le triangle affiché dans un contrôle image standard :
La démo complète avec les cubes, la sphère, l'éclairage et les textes est disponible à la fin de l'article en téléchargement (pour Access).
XVIII-B. Affichage dans un contrôle image d'un UserForm▲
Ce chapitre s'applique aux applications Office qui gèrent les UserForms (Excel, Word, Powerpoint, ...).
Importez le module de classe clOpenGLUserForm
Ce module contient les fonctions nécessaires à l'initialisation d'openGL et l'affichage de l'image dans le contrôle.
Pour l'utiliser, créez un nouveau formulaire utilisateur (UserForm) avec un contrôle image nommé Image1.
Déclarez un objet en en-tête de module du formulaire :
Private oGL As clOpenGLUserForm
Sur chargement du formulaire, initialisez openGL :
Private Sub UserForm_Initialize()
' Crée l'objet pour dessin dans le contrôle image
Set oGL = New clOpenGLUserForm
' Initialisation d 'openGL
oGL.InitOpenGL Me.Image1
End Sub
La fonction InitOpenGL crée une fenêtre masquée de même taille que le contrôle image.
Cette fenêtre sera utilisée par openGL.
Ensuite on peut exécuter les commandes openGL pour dessiner.
Par exemple, le dessin du triangle :
' Vide les buffers couleur et profondeur
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
' Début de la primitive
glBegin GL_TRIANGLES
' Ajoute les trois sommets
glColor3VB vbYellow ' Jaune
glVertex2d 0, 0
glColor3VB vbBlue ' Bleu
glVertex2d 1, 0
glColor3VB vbRed ' Rouge
glVertex2d 1, 1
' Fin de la primitive
glEnd
L'affichage se fait à l'aide d'une des fonctions Display* :
Display : Affichage dans le contrôle :
Les pixels de la scènes sont injectés dans le contrôle.
Il peut y avoir des clignotements de l'image à des fréquences d'affichage élevées.
DisplayNoRepaint : Affichage dans le contrôle avec réduction des clignotements :
Effectue en plus un dessin par dessus le contrôle et annule le rafraîchissement du formulaire.
Cela évite des scintillements de l'image qui peuvent apparaître avec la fonction Display.
DisplayFast : Affichage par dessus le contrôle :
Effectue un dessin par dessus le contrôle.
Cet affichage n'est pas persistant mais peut s'avérer plus rapide et ne présente pas de problème de clignotements de l'image.
Testons la fonction Display :
' Affichage dans le contrôle
oGL.Display
Voici le triangle affiché dans un contrôle image d'un UserForm :
La démo complète avec les cubes, la sphère, l'éclairage et les textes est disponible à la fin de l'article en téléchargement (pour Excel et Word).
XVIII-C. Affichage sur un formulaire VB6▲
Ce paragraphe ne s'applique qu'à un projet VB6.
Nous souhaitons afficher le rendu OpenGL sur un formulaire.
Les formulaires VB6 exposent une propriété hDC : c'est l'identifiant du contexte d'affichage gdi32.
Nous utilisons ce contexte d'affichage pour l'affichage OpenGL.
Ajoutez au projet le module de classe clOpengGLFormVB6
Pour l'utiliser, créez un nouveau formulaire nommé MainForm.
Déclarez un objet en en-tête de module du formulaire :
' Classe pour affichage dans un form
Private oGl As clOpengGLFormVB6
Sur chargement du formulaire, initialisez openGL :
' Chargement du formulaire
Private Sub Form_Load()
Set oGl = New clOpengGLFormVB6
oGl.InitOpenGL Me
End Sub
La fonction InitOpenGL lie le contexte d'affichage du formulaire avec un contexte d'affichage OpenGL.
Ensuite on peut exécuter les commandes openGL pour dessiner.
Par exemple, le dessin du triangle, à écrire dans l'événement Paint du formulaire :
' Sur dessin du formulaire
Private Sub Form_Paint()
' Vide les buffers couleur et profondeur
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
' Début de la primitive
glBegin GL_TRIANGLES
' Ajoute les trois sommets
glColor3VB vbYellow ' Jaune
glVertex2d 0, 0
glColor3VB vbBlue ' Bleu
glVertex2d 1, 0
glColor3VB vbRed ' Rouge
glVertex2d 1, 1
' Fin de la primitive
glEnd
End Sub
L'affichage se fait à l'aide de la fonction Display :
Testons cette fonction Display, à la suite du code précédent :
' Affichage sur le formulaire
oGL.Display
Voici le triangle affiché dans un formulaire VB6 :
La démo complète avec les cubes, la sphère, l'éclairage et les textes est disponible à la fin de l'article en téléchargement.


