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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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 Expert
    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
    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 ???

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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 Expert
    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
    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

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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
    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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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 Expert
    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
    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

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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 Expert
    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
    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

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

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

  12. #12
    Membre actif

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

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

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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