XIX. 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.
XIX-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ène 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 :
XIX-B. Affichage dans un contrôle Image ou Frame 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 par exemple 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 avec une image crée une fenêtre masquée de même taille que le contrôle image.
Cette fenêtre sera utilisée par OpenGL.
Si on utilise un contrôle Frame, OpenGL utilise directement ce contrôle et l’affichage est plus rapide.
Attention, il faut que le formulaire soit totalement initialisé avant de pouvoir effectuer le rendu.
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ène 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 Frame, alors ces trois fonctions ont le même effet.
L'affichage n'est pas persistant lors du dessin sur une Frame.
Testons la fonction Display :
' Affichage dans le contrôle
oGL.Display
Voici le triangle affiché dans un contrôle image d'un UserForm :
XIX-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 :