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.