IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Découvrez OpenGL 1.1 en VB6/VBA

Image non disponible


précédentsommairesuivant

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.

Image non disponible   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) :

En en-tête de formulaire
Sélectionnez
Private oGL As clOpengGLFormAccess

Sur chargement du formulaire, initialisez OpenGL :

Initialisation d'OpenGL
Sélectionnez
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 :

Dessin du triangle
Sélectionnez
' 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* :

Image non disponible   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.

Image non disponible   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.

Image non disponible   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
Sélectionnez
' Affichage dans le contrôle
oGL.Display

Voici le triangle affiché dans un contrôle image standard :

Image non disponible

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…).

Image non disponible   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 :

En en-tête de formulaire
Sélectionnez
Private oGL As clOpenGLUserForm

Sur chargement du formulaire, initialisez OpenGL :

Initialisation d'OpenGL
Sélectionnez
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 :

Dessin du triangle
Sélectionnez
' 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* :

Image non disponible   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.

Image non disponible   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.


Image non disponible   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
Sélectionnez
' Affichage dans le contrôle
oGL.Display

Voici le triangle affiché dans un contrôle image d'un UserForm :

Image non disponible

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.

Image non disponible   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 :

En en-tête de formulaire
Sélectionnez
' Classe pour affichage dans un form
Private oGl As clOpengGLFormVB6

Sur chargement du formulaire, initialisez OpenGL :

Initialisation d'OpenGL
Sélectionnez
' 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 :

Dessin du triangle
Sélectionnez
' 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
Sélectionnez
' Affichage sur le formulaire
oGL.Display

Voici le triangle affiché dans un formulaire VB6 :

Image non disponible

précédentsommairesuivant

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Thierry GASPERMENT. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.