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

MFC Discussion :

[API][MFC]Graphisme - Déplacement d'un image ???


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut [API][MFC]Graphisme - Déplacement d'un image ???
    Urgent...
    Que les grands pontes du VC++ ne m'en veuillent pas pour la naïveté de ma question mais je voudrais qu'elle API de Microsoft (W2K- XP) permet de faire défiler une image, et celle qui permet de synchroniser un process pendant le rafraîchissement de la carte écran?
    J’ai un gros souci avec une application graphique.
    Celle-ci affiche une image en écran, ligne par ligne, et l’image doit se déplacer d’une ligne vers le haut ou le bas pour donner un effet de déplacement.
    J’ai créé une classe dans laquelle je crée une ligne bitmap dans un buffer (800/758) après avoir déplacé cellui-ci comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy (bBuffPic, (BYTE *)bBuffPic+m_iStride, m_iStride*(m_iSourceHeight-1));
    et pour afficher je fais :
    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
    void CToolsBmp::DrawImageBuffer(CDC* pDC, BYTE* bBuffSource, bool bFitToScale)
    {
    	//Draw parent surface
    	CDC memdcX;
    	DWORD dwValue;
    	HBITMAP hSource = CToolsBmp::CreateBitmap();
    	CBitmap cbmp;
    	cbmp.Attach(hSource);
    	memdcX.CreateCompatibleDC(pDC);
    	dwValue = cbmp.SetBitmapBits(m_iStride*m_iTargetHeight,bBuffSource);
    	memdcX.SelectObject(cbmp);
    	if (bFitToScale)
    		pDC->StretchBlt(0,0,m_iTargetWidth ,m_iTargetHeight,&memdcX,0,0,m_iSourceWidth,m_iSourceHeight,SRCCOPY );  
    	else
    		pDC->BitBlt(0,0,m_iSourceWidth,m_iTargetHeight ,&memdcX,0,0,SRCCOPY);
    }
    Mais tout ceci prend encore trop de ressource system.
    Connaissez vous une API qui peux remplacer avantageusement ce processus ?
    (Pour déplacer l’image déjà dessiné et synchroniser la mise à jour de l‘image avec la carte écran)
    Je vous remercie de votre aide

  2. #2
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    DrawImageBuffer est appelé depuis quoi ???

    c'est pas ce qu'il y a autour qui peut etre gourmand en resource ???

    il y a pas une partie qui peut etre fait en dehors DrawImageBuffer ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CDC memdcX; 
       DWORD dwValue; 
       HBITMAP hSource = CToolsBmp::CreateBitmap(); 
       CBitmap cbmp; 
       cbmp.Attach(hSource); 
       memdcX.CreateCompatibleDC(pDC); 
       dwValue = cbmp.SetBitmapBits(m_iStride*m_iTargetHeight,bBuffSource);
    ca peut pas etre deplacé ca ???
    il y a du linge sur la corde à linge

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Pour être simple l’application reçois des données d’une source extérieure qui sont transformées en image suivant les commande envoyées par l’application et ceci au maximum toute les 40ms .
    DrawImageBuffer est déclanché par un timer à partir de la classe du dialogue principal de l'application.
    Lorsque l’envent OnPaint de cette classe ou une commande de refresh urgent est demandé j’appel un fonction globale DrawClientPicture(bool refreshnow) en passant true .
    Dans le cas de l’écriture d’une ligne de bmp (756 pix) DrawClientPicture est appelé en passant false.

    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
    m_tsTimeToRefresh = CFileTime::GetCurrentTime() - m_tsStart;
    int iTimeOut = (int) m_tsTimeToRefresh.GetTimeSpan()/10000; 
    if(refreshnow || iTimeOut>theApp.m_iRefreshTime)
    {
     
     if(!IsIconic())
    {
    CDC* pDC = m_cPictureArea.GetDC(); //get pic DC
    	CRect rect;
    	m_cPictureArea.GetClientRect(rect); //get client dimention  
    	if(refreshnow)
             		pTools ->DrawImageBuffer(pDC,theApp.m_bImageBuffer,true,&rect);
    	else
    			pTools ->DrawLineImage(pDC,theApp.m_bImageBuffer,&rect); 		m_cPictureArea.ReleaseDC(pDC); 
    }
    m_tsStart = CFileTime::GetCurrentTime();
    }
    pTools pointe vers la classe ToolsBitmap
    theApp.m_bImageBuffer à été créé lors de l’event new de l’appli par et est globale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_bImageBuffer = (BYTE*)GlobalAlloc(GPTR, bmpX.bmWidthBytes *800);//(var globale)
    Tous ce qui est création de la ligne d’image est gèré séparément
    CECi me semble le plus gourmand
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy (bBuffPic, (BYTE *)bBuffPic+m_iStride, m_iStride*(m_iSourceHeight-1));
    qui est applelé juste avant de générer la nouvelle ligne bmp.

    L’event OnPaint est il synchronisé avec le refresh de la carte video ?

  4. #4
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    dans ton OnPaint, ajoute ca et regarde si ca le fait toujours :

    void Machin::OnPaint()
    {

    Default();

    // tout ton code
    DrawImageBuffer(...);
    // suite de ton code

    }

    en clair, ajoute l'appelle de Default(); avant ton traitement
    il y a du linge sur la corde à linge

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Pas de changement 23% avec 100ms de refresh et 6% avec 1s

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut ,
    tu a essaye la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CWnd::ScrollWindow ( 
    int xAmount, 
    int yAmount, 
    LPCRECT lpRect = NULL, 
    LPCRECT lpClipRect = NULL );
    (voir doc MSDN pour le détail.)
    pour faire defiler ton image et reconstruire la partie manquante d'apres la memoire de buffer ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Gagné 1% de process plein écran, merci .

    Comme j'ai appris VC++ à partir du VB, il me reste quelque trous à combler.. Pour ma compréhension les Win32 API (VB) sont elles toutes incluses ou issues du C++ ?

    Et la dernière, afin d’éviter un effet de moirage de l’image, l’event WM_PAINT est il bien synchrone avec le rafraîchissement de la carte écran ?

  8. #8
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    Comme j'ai appris VC++ à partir du VB, il me reste quelque trous à combler.. Pour ma compréhension les Win32 API (VB) sont elles toutes incluses ou issues du C++ ?
    je dirais les 2. Comme son nom l'indique les API sont des interfaces donc on sait pas comment ils ont été developper. Peut etre en C++

    sinon les API WIN32 sont la pour la programmation windows, elles peuvent etre utilisées de maniere indépendante du language ( java, C++, delphi etc ... )

    WM_PAINT est l'evement qui indique à une application WIN32 qu'il doit rafraichir l'affichage courant
    il y a du linge sur la corde à linge

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Donc WM_PAINT peux être déclanché à tout moment.
    Comment le faire coïncider avec le début de rafraîchissement de la carte vidéo ?

  10. #10
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    pour "forcer" un wm_paint tu peux faire un Updatewindow, ca envoie dans la pile de message un WM_PAINT

    pour intercepter tous les messages avant qu'ils soient arrivé à la fenetre, tu peux passer par le PreTranslateMessage de la fenetre et ne pas faire suivre WM_PAINT
    il y a du linge sur la corde à linge

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Ok reste a détecter le début du refreshing de la carte.

  12. #12
    Membre habitué

    Inscrit en
    Mars 2002
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 83
    Points : 125
    Points
    125
    Par défaut
    Pour information :

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngdi/html/msdn_flicker.asp

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci

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

Discussions similaires

  1. [MFC]Problème pour afficher une image.
    Par Deedier dans le forum MFC
    Réponses: 4
    Dernier message: 25/03/2005, 16h13
  2. MFC + Afficher et modifier une image
    Par os dans le forum MFC
    Réponses: 4
    Dernier message: 07/03/2005, 19h20
  3. [VB.NET] Déplacement d'une image
    Par ludovic85 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/02/2005, 12h07
  4. [Graphisme] Comment "blanchir" une image ?
    Par yoghisan dans le forum Langage
    Réponses: 2
    Dernier message: 24/01/2005, 20h56
  5. [VB6] [Graphisme] Dimensions d'une image au saving
    Par jeanseb dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/12/2002, 19h09

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