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 :

Blitting depuis une zone mémoire


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut Blitting depuis une zone mémoire
    Bonjour à tous !
    J'essaie (désespérément) de "blitter" une zone mémoire depuis un endroit vers un autre.
    Evidemment, si la zone source se nomme pSrc, la zone destination se nomme pDest, et que je veux juste copier, je ne m'embête pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy((void *)pDest, (void *)pSrc, m_size);
    Mon problème est quand la zone de destination (qui a une taille fixe) doit accueillir une image de taille différente. J'ai vu la fonction StretchBlt(), mais ça prend des contextes en argument...
    Puis-je m'en servir (ou d'une autre) pour adapter la zone source à la zone de destination ?

    Merci d'avance de votre aide !

  2. #2
    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
    Le cast en void* est inutile et nuisible (perte de const-correctness).
    Et en plus, c'est un cast C.

    Donc, tu travailles directment sur les Bitmap Bits ?
    Si tu ne veux pas utiliser StretchBlt(), il ne te reste plus qu'à le faire toi-même, avec une boucle de memcpy() si tu ne changes jamais la largeur, ou deux boucles imbriquées si la largeur peut changer.

    N'oublie pas le membre bmWidthBytes de la structure BITMAP, qui peut t'aider...
    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.

  3. #3
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Je veux bien utiliser StretchBlt, mais le programme, lui, ne veut pas .
    J'explique un peu plus en détails .
    Mon but est de pouvoir travailler avec un Bitmap (ou une zone) en mémoire, et d'assigner les pixels.
    Aujourd'hui, c'est "crade" au possible (et lent), car j'utilise ce code (en gros) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		for(x=0;x<w;x++)
    		{
    			for(y=h;y>0;y--)
    			{
    				SetPixel(hdcCompatible,x,y,RGB(R,G,B));
    			}
    		}
     
    	StretchBlt(hdcCompatible, 0,0,240,320,hdcCompatible,0,0,uiHeight,uiWidth,SRCCOPY);
    Avec hdcCompatible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hdcCompatible = GetDC(g_hWnd);
    et g_hWnd le HWND "principal" (mon écran finalement).
    Quoique ce code soit parfaitement compréhensible, j'ai essayé de modifier, en créant un HDC supplémentaire en mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hdcMem = CreateCompatibleDC(hdcCompatible);
    Et en remplaçant hdcCompatible par hdcMem dans SetPixel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetPixel(hdcMem,x,y,RGB(R,G,B));
    StretchBlt(hdcCompatible, 0,0,240,320,hdcMem,0,0,uiHeight,uiWidth,SRCCOPY);
    L'inconvénient, c'est qu'avec cette second méthode, ça ne fonctionne plus (aucune image à l'écran).

    De plus, SetPixel est très très lent, donc je pensais utiliser SetDIBits, mais je n'y arrive pas...

  4. #4
    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
    Peut-être faudrait-il commencer par créer un bitmap dans le HDC compatible...
    Le bitmap par défaut est un bitmap monochrome de 1x1 pixel...

    Voir la fonction CreateCompatibleBitmap() par exemple, ou bien CreateDIBSection() qui est plus compliquée.
    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.

  5. #5
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Pardon, j'ai oublié de le mentionner !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hbmNew=CreateCompatibleBitmap(hdcCompatible,uiHeight, uiWidth);
    Edit : Et bien sûr, le SelectObject :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem,hbmNew);
    Edit2 : Je reviens sur ce que j'ai dit, ça fonctionne en fait, mais c'est lent, du fait de l'utilisation de SetPixel.

  6. #6
    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
    CreateCompatibleBitmap() doit être fait sur le HDC d'origine et non pas le nouveau, sinon le bitmap créé sera monochrome.

    Edit: Ah, pardon, c'est ce que tu fais. Fais gaffe en nommant tes HDC, car "compatible" indique généralement un HDC créé avec CreateCompatibleDC()...
    Edit2: Pour commencer, utilise SetPixelV() à la place de SetPixel(). Tu gagneras un tout petit peu de vitesse...
    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.

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 21/07/2006, 16h55
  2. utilisation d'une zone mémoire dans un formulaire
    Par pursang25 dans le forum Access
    Réponses: 3
    Dernier message: 29/06/2006, 12h41
  3. Requete insert into depuis une zone de liste
    Par fredhali2000 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 07/06/2006, 14h23
  4. Réponses: 7
    Dernier message: 30/01/2006, 21h36
  5. Tester qu'un pointeur pointe une zone mémoire valide
    Par Captain_JS dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/08/2005, 19h23

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