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 :

Image de fond dans API sous Visual C++


Sujet :

MFC

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Image de fond dans API sous Visual C++
    Salut.
    j'ai développé une application sous visual C++ mais je n'arrive pas à afficher une image en fond d'écran.
    Ma fonction est :

    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
    void CMainFrame::ImageFond(CDC* pDC) 
    { 
    CBitmap bmp; 
    CBitmap *ptrBmpOld; 
    CDC dcMemory; 
    BITMAP bm; 
    CRect rect; 
     
    Invalidate(TRUE); 
    bmp.LoadBitmap(IDB_IMAGE_LARGE); 
    bmp.GetBitmap(&bm); 
    GetClientRect(rect); 
    dcMemory.CreateCompatibleDC(pDC); 
    ptrBmpOld=dcMemory.SelectObject(&bmp); 
    pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMemory,0,0,(bm.bmWidth),(bm.bmHeight), SRCCOPY ); 
    dcMemory.SelectObject(ptrBmpOld); 
    }
    et cette fonction est appellée dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BOOL CMainFrame::OnEraseBkgnd(CDC* pDC) 
    { 
    ImageFond(pDC); 
    return TRUE; 
    }
    Mon image s'affiche mais couvre la barre des taches ainsi que les autres fenetres . Et lorsque je déplace la fenetre d'application mon image disparait .
    Je n'arrive pas à voir d'où cela vient.
    Y aurait il d'autres paramètres à régler dans mon application pour avoir une jolie image en font d'écran ?
    Merci pour votre aide
    A+

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    salut, tu peux t'appuyer sur cet exemple dans la faq http://c.developpez.com/faq/vc/?page...gndBitmapOnDlg

  3. #3
    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,
    pluisieurs remarques:
    pas de Invalidate dans le message WM_ERASEBKGND .(ton pb doit venir de la).
    recharger l'image dans le message fait perdre du temps.

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Il vaut mieux utiliser CWnd::OnPaint plutot que CWnd::OnEraseBkgnd c'est beaucoup plus approprié pour dessiner et afficher graphismes.
    CWnd::OnEraseBkgnd sert à redessiner le fond d'une fenêtre pas forcément à gérer des graphismes.
    Pour appeler OnPaint , appeler avec Invalidate


    CWnd::OnEraseBkgnd
    afx_msg BOOL OnEraseBkgnd( CDC* pDC );

    Return Value

    Nonzero if it erases the background; otherwise 0.

    Parameters

    pDC

    Specifies the device-context object.

    Remarks

    The framework calls this member function when the CWnd object background needs erasing (for example, when resized). It is called to prepare an invalidated region for painting.

    CWnd::OnPaint
    afx_msg void OnPaint( );

    Remarks

    The framework calls this member function when Windows or an application makes a request to repaint a portion of an application’s window. TheWM_PAINT message is sent when the UpdateWindow or RedrawWindow member function is called.

    A window may receive internal paint messages as a result of calling the RedrawWindow member function with the RDW_INTERNALPAINT flag set. In this case, the window may not have an update region. An application should call the GetUpdateRect member function to determine whether the window has an update region. If GetUpdateRect returns 0, the application should not call the BeginPaint and EndPaint member functions.
    En programmation win32 normalement on "peint" une fenêtre avec BeginPaint et EndPaint qui retournent une PAINTSTRUCT et un HDC

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Merci pour vos conseils mais malheureusement cela n'a pas marché.
    En utilisant OnPaint, j'ai le même phénomène :
    Mon image couvre les autres fenêtres et la barre des taches ne s'affiche pas.
    Si je bouge la fenêtre, mes autres fenêtres s'affichent ainsi que la barre des taches mais mon image disparaît laissant place à un fond d'écran d'origine (gris).
    Si je retire de ma fonction mon image ne fait qu'apparaître furtivement.
    Je pense que mon image reste en premier plan au lieu de se trouver derrière puis elle est effacée lors du rafraîchissement.
    Y aurait'il des paramètres à configurer lors de la création de ma fenêtre ?
    Merci encore,
    A+
    Lolo

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Autant pour moi j'avais mal lu ; il vaut mieux utiliser OnEraseBkGnd plutot que OnPaint pour repeindre le fond de l'application .
    Essayer avec LockWindowUpdate() avant de dessiner à tout hasard

  7. #7
    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
    la methode sur OnEraseBkgnd fonctionne je l'utilise .
    enleve le invalidate dedans.
    exemple dans la faq sur une dialog:
    http://c.developpez.com/faq/vc/?page...gndBitmapOnDlg
    (c'est le meme principe).

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut

    Merci, les gars pour le coup de main cela m’a bien aidé.
    J’ai presque réussi.
    Mon image ne disparaît plus mais elle remplie aussi les autres fenêtres que j’ouvre dans mon appli cachant ainsi les boutons.
    Voici ma nouvelle fonction :

    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
    BOOL CMainFrame::OnEraseBkgnd(CDC* pDC) 
    {
    // Efface les fonds d’écran des fenêtres, si on enlève cette fonct les contours //disparaisse sous l’image de fond
    Invalidate(TRUE);
     
    // Ma fonction qui affiche l’image
    ImageFond(pDC);
     
    // Pour redessiner ma barre des taches
    m_wndToolBar.UpdateWindow();
     
    /////////////////////////////////////////////////////////////////////////////////////
    //  Pour rafraîchir mes fenêtres et ainsi avoir les affichages
    /////////////////////////////////////////////////////////////////////////////////// /
     
    POSITION temp,doc;
    CDocTemplate* pDocTemplate;
    CDocument* pDocument;
     
    temp = theApp.GetFirstDocTemplatePosition( );
    while( temp != NULL )
    {	
         pDocTemplate = theApp.GetNextDocTemplate( temp );
         doc = pDocTemplate->GetFirstDocPosition( );
         while( doc != NULL )
        {
    	pDocument = pDocTemplate->GetNextDoc( doc );
    	pDocument->UpdateAllViews( NULL, 0, NULL );
    	theApp.UpdateAllDocuments();
         }
    }
     
    // Pour garder mon image en fond d’écran, si je la place avant ma
    // fonction ImageFond je n’ai qu’un écran blanc et mon image n’apparaît
    // pas.
          LockWindowUpdate();
     
          return TRUE;
    }
    Encore merci
    A+

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/09/2006, 17h33
  2. Réponses: 5
    Dernier message: 27/09/2005, 09h18
  3. image de fond dans treeview
    Par chancourt dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2005, 16h11
  4. Etirer une image de fond dans une cellule
    Par dreamanoir dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/07/2005, 14h39
  5. Réponses: 4
    Dernier message: 03/05/2005, 09h03

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