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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

[Fenêtre Windows avec OpenGL] problème de rafraichissement


Sujet :

OpenGL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut [Fenêtre Windows avec OpenGL] problème de rafraichissement
    Salut à tous,

    J'utilise de l'OpenGL via une interface que j'ai partiellement programmé moi-même, et ce dans une fenêtre Windows. Le problème, c'est que j'ai d'autres fenêtre Windows qui doivent apparaître en pop-up au dessus de la fenêtre OpenGL.

    Tout se passe bien, sauf que si je déplace une fenêtre pop-up, la fenêtre OpenGL derrière ne s'est pas rafraîchie. Donc le "fantôme" du pop-up reste affiché sur la fenêtre OpenGL ... en plus du VRAI pop-up qui marche bien.

    Une image vaut mieux que dix mots inutiles


    Quelqu'un aurait-il une idée ? Merci d'avance...

    A+

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce ne serait pas parce que ta fenêtre n'est rafraîchie que lorsqu'elle a le focus ?

  3. #3
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    pour ton programme openGL, il te faut soit une boucle d'affichage qui va rafraichire automatiquement ton affichage et donc faire disparaitre les popup, soit untiliser le repaint pour redessiner
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Récupérer le WM_PAINT de Windows pour rafraîchir la fenêtre OpenGL à ce moment là, tout dépend du comment tu as implémenté la chose !

  5. #5
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Ya pas une histoire avec le chargement de la matrice identité aussi?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Heu... Oui, sympa mais je sais pas trop comment faire ça en fait...

    Vous pourriez peut être me donner un extrait de code d'exemple, histoire de voir comment un récupère ce WM_PAINT et qu'on rafraîchit une fenêtre ? Peut être que je verrais mieux comment faire...

    Merci d'avance A+

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faudrait commencer par voir comment tu gères ta fenêtre OpenGL, avec quelle API, le code de rafraîchissement, etc...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Il faudrait commencer par voir comment tu gères ta fenêtre OpenGL, avec quelle API, le code de rafraîchissement, etc...
    Je sais pas si ça répond à la question, mais j'ai utilisé une petite librairie OpenGL et je l'ai quelque peu modifiée, la fonction qui met l'openGL "en route" est la suivante.

    Le reste c'est des fonctions utilitaires pour la capture des événements (souris, clavier, etc) et des appels à d'autres fonctions qui affichent les éléments à afficher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    bool Graphic::setupGL(char *t,int bw,int bh,int w,int h,int bpp)
    {
    	title = t;
    	width = w;
    	height = h;
    	beginW=bw;
    	beginH=bh;
    	bits = bpp;
     
    	HINSTANCE hInstance = GetModuleHandle(NULL);
     
    	WNDCLASSEX wc;
    	unsigned int pixelFormat;
     
    	DWORD style;
     
    	wc.cbSize = sizeof(wc);
    	wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    	wc.lpfnWndProc = (WNDPROC)WndProc;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hInstance = hInstance;
    	wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    	wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hbrBackground = NULL;
    	wc.lpszMenuName = NULL;
    	wc.lpszClassName = "CNSmesher";
     
    	if (!RegisterClassEx(&wc))
    	{
    		displayMsgBox("Registering error",true);
    		return false;
    	}
        style = WS_OVERLAPPEDWINDOW;
     
    	RECT rect;
    	rect.left = 0; rect.top = 0;
    	rect.right = width; rect.bottom = height;
    	AdjustWindowRectEx(&rect, style, FALSE, 0);
     
    	if (!(hwnd = CreateWindowEx(
    		WS_EX_APPWINDOW,
    		"CNSmesher",
    		title,
    		WS_CLIPSIBLINGS | WS_CLIPCHILDREN | style,
    		beginW,beginH,
    		rect.right - rect.left,
    		rect.bottom - rect.top,
    		NULL,
    		NULL,
    		hInstance,
    		NULL)))
    	{
    		killGL();
    		displayMsgBox("Create window error",true);
    		return false;
    	}
     
    	PIXELFORMATDESCRIPTOR pfd = 
    	{
    		sizeof(pfd),
    			1,
    			PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    			PFD_TYPE_RGBA,
    			bits,
    			0, 0, 0, 0, 0, 0,		// Color bits
    			0, 0,					// Alpha bits
    			0, 0, 0, 0, 0,			// Accumulation bits
    			16,						// Depth buffer
    			0,						// Stencil buffer
    			0,						// Auxillary buffer
    			PFD_MAIN_PLANE,
    			0,						// reserved
    			0, 0, 0					// Layer masks
    	};
     
    	if (!(hdc = GetDC(hwnd)))
    	{
    		killGL();
    		displayMsgBox("Get DC error",true);
    		return false;
    	}
     
    	if(!(pixelFormat = ChoosePixelFormat(hdc, &pfd)))
    	{
    		killGL();
    		displayMsgBox("Chosing pixel format error",true);
    		return false;
    	}
     
    	if (!SetPixelFormat(hdc, pixelFormat, &pfd))
    	{
    		killGL();
    		displayMsgBox("Setting pixel format error",true);
    		return false;
    	}
     
    	if (!(hrc = wglCreateContext(hdc)))
    	{
    		killGL();
    		displayMsgBox("Creating context error",true);
    		return false;
    	}
     
    	if (!wglMakeCurrent(hdc, hrc))
    	{
    		killGL();
    		displayMsgBox("Making current rendering error",true);
    		return false;
    	}
     
    	ShowWindow(hwnd, SW_SHOW);
    	SetForegroundWindow(hwnd);
    	SetFocus(hwnd);
     
    	resize(width, height);
     
    	return initSpace();
    }

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    On peut voir WndProc ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Oui effectivement c'est sans doute là le hic ... ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    LRESULT Graphic::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg)
    	{
    	  case WM_ACTIVATE :
    		{
          active = HIWORD(wParam) ? false : true;
          for(int k=0;k<256;++k)keys[k]=false;
          return 0;
        }
      	case WM_CLOSE :
    		{	PostQuitMessage(0); return 0;	}
    	  case WM_SIZE :
    		{
        	width = LOWORD(lParam);
    			height = HIWORD(lParam);
    			resize(LOWORD(lParam), HIWORD(lParam));
    			return 0;
    		}
      	case WM_KEYDOWN :
    		{	keys[wParam] = true; return 0; }
    	  case WM_KEYUP :
    		{	keys[wParam] = false;	return 0;	}
      	case WM_MOUSEMOVE :
    		{
    			mouseX = LOWORD(lParam);
    			mouseY = height - (HIWORD(lParam) + 1);
    			Command::manageMouseMov(instance);
    			return 0;
    		}
      	case WM_LBUTTONDOWN : mouseDownL = true; return 0;
    	case WM_LBUTTONUP : mouseDownL = false; return 0;
      	case WM_RBUTTONDOWN : mouseDownR = true; return 0;
      	case WM_RBUTTONUP : mouseDownR = false; return 0;
      	case WM_MBUTTONDOWN : mouseDownM = true; return 0;
      	case WM_MBUTTONUP : mouseDownM = false; return 0;
    	}
    	return DefWindowProc(hwnd, msg, wParam, lParam);
    }

  11. #11
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Si tu as ta boucle ou se trouve ton
    C'est là où doit se situer le problème !

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Alors le seul endroit où il est question d'un peekmessage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    void Graphic::run()
    {
    	MSG msg;
    	while(!finished)
    	{
    		if (PeekMessage(&msg, NULL,0,0,PM_REMOVE))
    		{
    			if (msg.message == WM_QUIT)break;
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    		if (active)
    		{
            //Manage keys and mouse
    			Command::manageKeyCom(this);
    			Command::manageMouseCom(this);
    			display();
    			SwapBuffers(hdc);
    		}
    	}
    	killGL();
    }

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    J'ai modifié en ajoutant le
    else display(), et maintenant ça marche si je fais un déplacement de la fenêtre pop up, mais dès le second déplacement de la fenêtre pop up ça ne marche plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		if (active)
    		{
            //Manage keys and mouse
    			Command::manageKeyCom(this);
    			Command::manageMouseCom(this);
    			display();
    			SwapBuffers(hdc);
    		}
    		else
    		{
              display();
            }

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Heu... excusez, j'ai dit une bêtise: le display() que j'ai ajouté n'a rien changé, de toute façon cette fonction n'a aucun effet là dessus.

    Le problème tel que je le comprends, c'est que la boucle while de ma fonction run() cesse de tourner si une fenêtre pop-up est ouverte. La question serait alors de savoir comment faire tourner ce while même quand un pop up est ouvert...

    On s'approche, on s'approche ...

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le problème est là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    case WM_ACTIVATE :
    {
        active = HIWORD(wParam) ? false : true;
        ...
    }
     
    ...
     
    if (active)
    {
        //Manage keys and mouse
        Command::manageKeyCom(this);
        Command::manageMouseCom(this);
        display();
        SwapBuffers(hdc);
    }
    Ta fenêtre étant considérée inactive lorsqu'elle passe en second plan (cf. MSDN), le rafraîchissement du rendu sera mis en pause jusqu'à ce qu'elle revienne en avant plan. Peut-être ne veux-tu considérer ta fenêtre inactive que lorsqu'elle est minimisée par exemple (dans ce cas active = LOWORD(wParam)) ?

  16. #16
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Sinon autre idée

    Ta "pop up", ce n'est pas une dialog en mode modal que tu crées dans ton application OpenGL ?

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Salut... Ca marche !

    Alors en fait j'ai juste ajouté le case

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          case WM_PAINT: SwapBuffers(hdc); break;
    dans le switch(msg) de la fonction Graphic::WndProc

    Merci à tout le monde d'avoir pris la peine de se plonger dans mon code, ça m'a permis de localiser le problème (sinon j'avais aucune idée de où chercher).

    Alors A+ [Résolu]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Ne pas afficher la fenêtre windows avec la commande "Shell"
    Par Dan.exe dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/07/2014, 21h51
  2. Fenêtre Windows avec PyQt
    Par nOwXO dans le forum PyQt
    Réponses: 12
    Dernier message: 08/12/2013, 17h09
  3. ouvrir une fenêtre windows avec visual C++
    Par JeanNoel53 dans le forum Visual C++
    Réponses: 9
    Dernier message: 13/04/2012, 10h36
  4. Création Grille avec gridLayout --> Problème de rafraichissement ?
    Par july4474 dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 10/03/2010, 16h41
  5. Réponses: 1
    Dernier message: 26/02/2005, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo