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

Visual C++ Discussion :

bitblt et scintillement


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut bitblt et scintillement
    Bonjour à tous

    Je parcours le forum depuis un moment, je trouve certain truc, mais je pige toujours pas. J'essaie de déplacer une image bitmap sur un axe horizontal (genre texte déroulant dans le bas d'un écran).

    Je suis parti de l'exemple win32 "hello world", j'ai un timer qui appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InvalidateRect(hWnd,NULL,true);
    et mon WM_PAINT qui fait ceci :
    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
    	PAINTSTRUCT ps;
    	HDC hdc;
    	HDC memoryHdc;
    	RECT rcClient;
    	hdc = BeginPaint(hWnd, &ps);
    	GetClientRect(hWnd, &rcClient);
    	int cxClient = rcClient.right-rcClient.left;
    	int cyClient = rcClient.bottom-rcClient.top;
    	HDC s_hDCBackground = CreateCompatibleDC(hdc);
            // moulinette pour changer de message et modifier ses coordonnées
    	bool showMessage = true;	
    	if(m_listeBMP.size()!=0 && showMessage)
    	{
    		if(indice<0)
    		{			
    			currentIt = m_listeBMP.begin();
    			msgcurrent = (*currentIt);
    			indice = 0;
    		}
    		if(msgcurrent.posX <= msgcurrent.width * -1)
    		{
    			msgcurrent.nbLoopDone++;
    			if(msgcurrent.nbLoopDone==msgcurrent.nbLoop)
    			{
    				currentIt++;
    				if(currentIt == m_listeBMP.end())
    				{
    					currentIt = m_listeBMP.begin();
    				}
    				msgcurrent = (*currentIt); 
    			}
    		}else{
    			if(msgcurrent.posX == -1)
    			{
    				msgcurrent.posX = rcClient.right;
    			}else{
    				msgcurrent.posX = msgcurrent.posX - 3;
    			}
     
    			// msgcurrent est une struct, .bmp est un HBITMAP
    			SelectObject(s_hDCBackground, msgcurrent.bmp);			
    			BitBlt(hdc, msgcurrent.posX, 10, cxClient, cyClient, s_hDCBackground, 0, 0, SRCCOPY);
    			DeleteDC(s_hDCBackground);
    		}
    	}
     
    	EndPaint(hWnd, &ps);
    et pour info, ma struct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct Message{
    	int dindice;
    	int posX;
    	int posY;
    	int width;
    	int height;
    	int nbLoop;
    	int nbLoopDone;
    	HBITMAP bmp;
    };
    J'ai lu qu'il fallait créer un DC en mémoire, dessiner dedans puis finalement dessiner ce dc dans le dc de la fenêtre... il me semble que c'est ce que je fais ? Mais j'ai toujours un effet de scintillement ?

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 39
    Par défaut
    Le probleme venait certainement de la façon dont je demandais un repaint.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RECT rcWnd; 
    GetClientRect(hWindow,&rcWnd); 
    InvalidateRect(hWindow,&rcWnd,false); // avec true, j'ai le probleme.
    UpdateWindow(hWindow);

  3. #3
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    sinon tu as penser a faire du double buffering ?

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par défaut
    Salut,
    Ton problème de scintillement vient du fait que le fond de ta fenêtre est redessiné (le paramètre true de InvalidateRect), intercepte WM_ERASEBKGND, ne fait rien dedans a part renvoyer true et ca ne scintillera plus, par contre tu devras toi même redesiner le fond de ta fenêtre.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Plutôt que de bloquer complètement le WM_ERASEBKGND, tu peux te débrouiller pour lui faire effacer tout sauf la zone du texte...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Pb scintillement-stabilité lors réaffichage de JPanel
    Par Pill_S dans le forum Composants
    Réponses: 5
    Dernier message: 28/04/2004, 14h03
  2. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  3. Problème avec BitBlt
    Par Gunadorio dans le forum MFC
    Réponses: 4
    Dernier message: 22/07/2003, 18h52
  4. [appli][Java2D]Pb scintillement Animation
    Par ddams dans le forum 2D
    Réponses: 2
    Dernier message: 25/04/2003, 11h57
  5. [Kylix] Aide sur BitBlt
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 10/12/2002, 22h54

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