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 :

initialisation multiple de CPaintDC


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Par défaut initialisation multiple de CPaintDC
    Bonjour,
    dans mon appli j'ai besoin d'afficher plusieurs image bitmap. J'arrive à en afficher une avec ce code.

    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
    void CDialog1::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
    	CRect client;
    	HBITMAP bit;
    	BITMAP bitmap;
     
    	CWnd *fenetre=monbouton.GetWindow(GW_HWNDLAST);
    	CPaintDC hdc(fenetre);
     
    	bit= (HBITMAP) LoadImage(NULL,"mer.bmp", IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
    	GetObject(bit, sizeof(BITMAP), &bitmap);
    	int surf_width = bitmap.bmWidth;
    	int surf_height = bitmap.bmHeight;
    	HDC bit_dc = CreateCompatibleDC(hdc);
    	SelectObject(bit_dc, bit);
     
     
    	CDC *test=monbouton.GetDC();
    	monbouton.GetClientRect(&client);
     
    	StretchBlt(hdc,0,0, client.right, client.bottom,bit_dc, 0,0,surf_width,surf_height, SRCCOPY);
     
    }
    où monbouton est une variable membre de ma classe.

    Pour en afficher plusieurs (le nombre est variable, j'ai besoin de réinitialiser les variable fenetre et hdc. Je ne sais pas comment faire.

    voici le code que j'utilise actuellement:

    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
    void CbddPhoto::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
    	int i;
    	CRect client;
    	Tableau<Image> tab1(2);
    	HBITMAP bit;
    	BITMAP bitmap;
     
    // initialisation des variables fenetres et hdc
     
     
    // initialisation des noms	
    	tab1[0].m_Nom="mer.bmp";
    	tab1[1].m_Nom="ng.bmp";
     
    // boucle d'affichage
    	for (i=0;i<tab1.LireTaille();i++)
    	{
    		CWnd *fenetre=myButton1[i].GetWindow(GW_HWNDLAST);
    		CPaintDC hdc(fenetre);
    		bit= (HBITMAP) LoadImage(NULL, tab1[i].m_Nom, IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
    		GetObject(bit, sizeof(BITMAP), &bitmap);
    		int surf_width = bitmap.bmWidth;
    		int surf_height = bitmap.bmHeight;
    		HDC bit_dc = CreateCompatibleDC(hdc);
    		SelectObject(bit_dc, bit);
     
    		CDC *test=myButton1[i].GetDC();
    		myButton1[i].GetClientRect(&client);
     
    		StretchBlt(hdc,0,0, client.right, client.bottom,bit_dc, 0,0,surf_width,surf_height, SRCCOPY);
    	}
     
    }
    ça affiche bien une image, mais une seule, celle dans le second CStatic (oui monbouton est un CStatic, enfin un tableau CStatic monbouton(2)).

    Alors j'ai plusieurs question
    1- Est ce que CStatic monbouton(2) crée bien un tableau de 2 boutons? (apparemment oui, ça me les affiches.

    2- le problème peut-il venir de l'initialisation de fenetre et hdc?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Par défaut
    Bon je viens de faire d'autre test, et ben j'ai pas mieux!!!

    Voilà comment j'ai créer mes controles CStatic:

    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
    BOOL CbddPhoto::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
     
    	int i;
    	for(i=0;i<2;i++)
    	{
     
    		monbouton[i].Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
       CRect(10+100*i,10,100+100*i,30), this, 1);
     
    	}
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
    Et en tentant d'afficher la bitmap sur le premier controle avec le code qui va suivre, j'obtient toujours l'image sur le deuxième controle.

    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
    void CbddPhoto::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
    	int i;
    	CRect client;
    	CString tab1[2];
    	HBITMAP bit;
    	BITMAP bitmap;
    	int surf_width;
    	int surf_height;
    	HDC bit_dc;
    	CDC *test;
    	CWnd *fenetre=monbouton[1].GetWindow(GW_HWNDLAST);
    	CPaintDC hdc(fenetre);
     
    	tab1[0]="mer.bmp";
    	tab1[1]="ng.bmp";
    	bit= (HBITMAP) LoadImage(NULL, tab1[0], IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
     
    	GetObject(bit, sizeof(BITMAP), &bitmap);
     
    	surf_width = bitmap.bmWidth;
    	surf_height = bitmap.bmHeight;
    	bit_dc = CreateCompatibleDC(hdc);
    	SelectObject(bit_dc, bit);
    	test=monbouton[1].GetDC();
    	monbouton[1].GetClientRect(&client);
    	StretchBlt(hdc,0,0, client.right, client.bottom,bit_dc, 0,0,surf_width,surf_height, SRCCOPY);
     
    }

  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
    Par défaut
    salut,
    donne a tes controles un numero d'id different , voir le dernier argument de create.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Par défaut
    Grrrrrrrrrrrrrrrr

    Je me suis dit super!!! pourquoi j'y ai pas pensé plus tôt!!!! Je me suis empressé de remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monbouton[i].Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
       CRect(10+100*i,10,100+100*i,30), this, 1);
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monbouton[i].Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
       CRect(10+100*i,10,100+100*i,30), this, i);
    Et plein de bonne volonté, j'ai lancer la compilation. Mais dans la fonction OnPaint, en utilisant monbouton[0] ou monbouton[1], l'image s'affiche toujours dans le deuxième controle!!!!

    HELLPPPPPP

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Par défaut
    alors? pas d'idée?

  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,
    ben finalement ça m'etonne pas trop .
    1) evite de mettre un id control a 0 (voir i)
    2) la signature d'un CRect c'est CRect( int l, int t, int r, int b ) ou:
    l=left t=top , r = right , b=bottom.
    toi tu fais : CRect(10+100*i,10,100+100*i,30)
    ce qui donne :
    left=10+100*i
    top=10
    right=100+100*i
    bottom=30

    left == right !!!! alors que right=left+ largeur.
    et que bottom= top + hauteur .


  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Par défaut
    Attends, ya erreur là!!

    Autant pour l'ID nul je veux bien que ça pose problème. Autant pour le CRect mon initialisation et bonne. left=10+100i et right=100+100i c'est différent.

    Pour le premier controle : CRect ==> left 10, right=100, top=10 et bottom =30

    Pour le deuxième : left=110, right=200 top=10 et bottom=30.


    Pour l'identifiant du bouton, ça change rien, j'ai modifié le code de la fonction create, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(i=0;i<tab1.LireTaille();i++)
    	{
     
    		monbouton1[i].Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
       CRect(10+100*i,10,100+100*i,30), this, i+1);
     
    	}
    Ensuite, que je récupère le handle sur la fenetre et le contexte graphique avec monbouton[0] ou monbouton[1], ça change rien, l'image apparait toujoursdans le deuxième controle.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Par défaut
    Est-ce que le problème ne viendrait pas du GW_HWNDLAST dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CWnd *fenetre=monbouton[1].GetWindow(GW_HWNDLAST);
    Désolé si je dis des bétises, mais je cherche ce qui pourrais foirer

  9. #9
    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
    Citation Envoyé par vincebel
    Est-ce que le problème ne viendrait pas du GW_HWNDLAST dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CWnd *fenetre=monbouton[1].GetWindow(GW_HWNDLAST);
    Désolé si je dis des bétises, mais je cherche ce qui pourrais foirer
    arf j'avais mal lu ,
    néanmoins moi je ne ferais comme ça .

    devise générale : chaque fenêtre doit être responsable de son apparence .

    si le sujet c'est de faire un bouton avec bitmap ,
    il est plus facile dans ce cas precis d'utiliser la classe CBitmapButton .

    si c'est pour se servir du bouton pour afficher une image,
    il est plus facile de faire une classe derivée du bouton et de le laisser gerer son affichage.

    voir faq:
    http://c.developpez.com/faq/vc/?page...awBitmapInCtrl
    il faudra creer le bouton avec l'attribut BS_OWNERDRAW dans le create .


  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Par défaut
    Oui, j'ai vu cette méthode dans la faq, tu m'as déjà envoyé le lien dans un autre topic. J'ai réussi a faire tourner cette méthode sans trop de problème, mais ça me plaisais pas trop de rajouter une classe dans mon projet, j'en ai déjà assez

    J'ai trouvé ailleurs cette méthode pour afficher des bitmaps dans des controles. Elle est assez simple a mettre en oeuvre pour un nombre d'image statique, mais je galère un peu pour un nombre dynamique.

    Ce serait plus simple avec la classe dérivé du bouton tu penses?


    Sinon pour mon problème avec ma méthode actuelle, penses-tu que le pb vienne du GW_HWNDLAST?

  11. #11
    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,
    je persiste a dire que c'est pas terrible,
    neanmoins j'ecrirais ça de maniere plus objet MFC:
    le dc entre autre est demandé au bouton .
    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 CTestMdiView::OnDraw(CDC* pDC) 
    {
     
        CBitmap Bitmap;
        CDC MemDC;
     
        CDC *pBtDC = m_MyButton.GetWindowDC();
        HBITMAP hbt=(HBITMAP)LoadImage(NULL, "c:\\bitmap1.bmp", IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
        Bitmap.Attach(hbt); // lecture bitmap dans les ressources
        BITMAP InfosBmp;    // structure d'informations.
        Bitmap.GetBitmap(&InfosBmp);
        MemDC.CreateCompatibleDC(pBtDC);// creation d'un DC en memoire
        MemDC.SelectObject(&Bitmap); // selection du bitmap dans le DC en memoire
     
        pBtDC->StretchBlt( 20, 20,
                         InfosBmp.bmWidth,InfosBmp.bmHeight,
                         &MemDC,
                         0, 0,
                         InfosBmp.bmWidth, InfosBmp.bmHeight,
                         SRCCOPY); 
        m_MyButton.ReleaseDC(pBtDC);
    }
    le create de mon bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m_MyButton.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
                CRect(400,150,450,200), this, 1);

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Par défaut
    PFfffffffff je suis pomé!!

    Bon, j'ai essayé ton code, bah j'ai rien d'afficher, pourtant j'ai fait du copier coller tout bête.

    Je comprends pas trop le role de chaque fonction pour la gestion des images. J'ai beau lire msdn, c vague...
    Pourrais tu m'en donner une description succinte?

    merci encore pour ta patience

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Par défaut
    Pour être plus précis dans mes questions,

    1- Que renvoie LoadImage?

    2- Bitmap est l'image? avec palette header et tab de pixel?

    3- InfosBmp serait le header? (type d'image, compression...)

    4- GetBitmap fait quoi exactement?

    5- Comment savoir quelle fonction foire?
    StretchBlt me renvoie 1, donc ça veut dire que l'affichage n'a pas marché, ok. Mais pour les autres je sais pas

  14. #14
    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
    note:
    Mon exemple est une transposition de ce que tu as fait mais avec des objets.(aux details du nom du bitmap et de mon bouton bien sur) .
    Pour manipuler le GDI en MFC il vaut mieux utiliser les classes,
    C’est plus simple et ça permet de s'affranchir de détails : destruction de l’objet, et recherche plus facile des fonctionnalités. (ça c'est un des objectifs des classes en c++ )
    dans ton code tu auras certainement des fuites memoires GDI tu ne relaches pas le bitmap et les HDC.
    le point clef de ce que j'ai ecris, c'est de demander un dc (GetWindowDC) au bouton pour s'affranchir des coordonnées ecran et travailler sur la surface cliente du bouton.
    ce code s'appui sur l'exemple de la faq : http://c.developpez.com/faq/vc/?page=GDI#StretchBitmap

    Citation Envoyé par vincebel
    Pour être plus précis dans mes questions,
    1- Que renvoie LoadImage?
    dans le cas present LoadImage renvoie un Handle sur un bitmap .

    Citation Envoyé par vincebel
    2- Bitmap est l'image? avec palette header et tab de pixel?
    Bitmap est un objet de la classe CBitmap ,
    Chaque objet du gdi a un handle,
    Avec les mfc on dispose de classes permettant de manipuler plus facilement leurs propriétés exemple:
    Avec un HDC correspond la classe CDC .
    Un HBRUSH on a la classe CBrush etc...

    j'ai juste attaché le handle du bitmap renvoyé par loadimage à l'objet Bitmap.

    Citation Envoyé par vincebel
    3- InfosBmp serait le header? (type d'image, compression...)
    oui ,
    BITMAP
    This structure defines the type, width, height, color format, and bit values of a bitmap.
    Citation Envoyé par vincebel
    4- GetBitmap fait quoi exactement?
    GetBitmap qui est une fonction membre de la classe CBitmap charge la variable infosBmp correspondant a l'objet en cours.
    ça correspond a ton code win32 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetObject(bit, sizeof(BITMAP), &bitmap);
    Citation Envoyé par vincebel
    5- Comment savoir quelle fonction foire?
    StretchBlt me renvoie 1, donc ça veut dire que l'affichage n'a pas marché, ok. Mais pour les autres je sais pas
    non c'est l'inverse :
    CDC::StretchBlt
    BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );
    ça renvoie un BOOL donc 1 c'est ok.
    note moi j'ai mis 20,20 pour x,y mais c'etait pour mon exemple ,met 0,0
    attention:comme le bouton dispose d'un texte si tu ecris dessus il sera effacé puisque le bouton va le raffraichir apres...

  15. #15
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    Salut, j'ai pas tout lu mais il me semble que si tu met dans ta boucle (ton premier post) une MessageBox apres ton StretchBlt, tu devrai voir sous ta messagebox ta premiere bitmap puis après click dessus ta deuxième...

    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
     
    void CbddPhoto::OnPaint() 
    { 
       CPaintDC dc(this); // device context for painting 
       int i; 
       CRect client; 
       Tableau<Image> tab1(2); 
       HBITMAP bit; 
       BITMAP bitmap; 
     
    // initialisation des variables fenetres et hdc 
     
     
    // initialisation des noms    
       tab1[0].m_Nom="mer.bmp"; 
       tab1[1].m_Nom="ng.bmp"; 
     
    // boucle d'affichage 
       for (i=0;i<tab1.LireTaille();i++) 
       { 
          CWnd *fenetre=myButton1[i].GetWindow(GW_HWNDLAST); 
          CPaintDC hdc(fenetre); 
          bit= (HBITMAP) LoadImage(NULL, tab1[i].m_Nom, IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE); 
          GetObject(bit, sizeof(BITMAP), &bitmap); 
          int surf_width = bitmap.bmWidth; 
          int surf_height = bitmap.bmHeight; 
          HDC bit_dc = CreateCompatibleDC(hdc); 
          SelectObject(bit_dc, bit); 
     
          CDC *test=myButton1[i].GetDC(); 
          myButton1[i].GetClientRect(&client); 
     
          StretchBlt(hdc,0,0, client.right, client.bottom,bit_dc, 0,0,surf_width,surf_height, SRCCOPY); 
          AfxMessageBox("Pause entre dessins");
       } 
     
    }

  16. #16
    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
    de toute façon avec cette methode que je ne recommande pas ,
    tu ne maitrise pas l'ordre du raffraichissement du bouton et ton affichage du bitmap risque de passer a la trappe...

  17. #17
    mat.M
    Invité(e)
    Par défaut
    *MessageBox EST A BANNIR , utiliser la macro TRACE

    *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void CbddPhoto::OnPaint() 
    { 
       CPaintDC dc(this); // device context for painting 
             bit= (HBITMAP) LoadImage(NULL, tab1[i].m_Nom, IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE); 
     
    }
    Il est préférable de ne pas recharger l'image à partir du disque à chaque WM_PAINT mais plutôt créer un DC en mémoire ( voir FAQ )

    *NE PAS OUBLIER D'EFFACER LES OBJETS du GDI avec DeleteObject.
    Sinon le GDI bloque !

  18. #18
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    Citation Envoyé par mat.M
    *MessageBox EST A BANNIR , utiliser la macro TRACE
    ....
    Non!!!
    car en débug (et effectivement seulement dans ce cas là) cela permet de faire perdre la main au thread d'affichage (une sorte de pause) et donc de voir son état à l'instant d'avant la Messagebox chose que ne fait pas le TRACE...

  19. #19
    mat.M
    Invité(e)
    Par défaut
    Non!!!
    car en débug (et effectivement seulement dans ce cas là) cela permet de faire perdre la main au thread d'affichage (une sorte de pause) et donc de voir son état à l'instant d'avant la Messagebox chose que ne fait pas le TRACE...
    Je ne vois pas où tu veux en venir !
    Il ya des points d'arrêt pour cela.
    En tout cas , les gens sont libres de faire ce qu'ils veulent faire mais je maintiens ce que je dis MessageBox c'est vraiment à bannir
    !!!

    Je ne sais pas pourquoi cette API existe , et qui de chez M$ l'a inventé
    parce que ça bloque totalement un logiciel.
    ( D'ailleurs existe-elle sous d'autres OS ??)
    J'utilisedes softs du commerce et bam messagebox quand il ya une erreur.
    Et après coup obligé de "tuer" le programme dans le gestionnaire des tâches.

    Il ya d'autres méthodes pour tracer des données.

    Le pire c'est sous VB : On Error Goto .... MsgBox Err.MSg !

  20. #20
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    Ben quand tu veux débugger dans la méthode paint avec Visual studio et que tu met un point d'arret VC se maximise écrase le DC de ta dialog et tu peux pas savoir pourquoi il as pas déssiné ce que tu voulais.
    En mettant une messageBox le DoModal de celle-ci te permet de voir ce qu'il y as sur le DC de ta dialog juste avant la MessageBox...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/12/2014, 15h19
  2. [1.x] Initialisation GMap multiple
    Par pixworld dans le forum Symfony
    Réponses: 2
    Dernier message: 12/12/2011, 17h19
  3. Réponses: 4
    Dernier message: 28/07/2009, 21h01
  4. [AJAX] Initialisation de liste multiple
    Par Alex70 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 25/03/2008, 16h38
  5. Initialisation ListBox à sélections multiples
    Par vincentdu33 dans le forum C#
    Réponses: 1
    Dernier message: 26/07/2007, 09h54

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