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 :

[MFC] Dessin dynamique mode console


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 82
    Par défaut [MFC] Dessin dynamique mode console
    Bonjour,

    J'aimerais réaliser une application console avec Visual C++ permettant de créer un dessin en dynamique (une simple croix rouge) et de l'enregistrer sur le disque. (Wizard -> Application console avec support MFC)

    J'ai fait des recherches et il semble que j'ai besoin d'un "device context" pour dessiner ? Comme il me faut une application console... je n'ai pas de "device context" disponible (une form ou autre...). J'ai tenté CreateDC("DISPLAY", NULL, NULL, NULL) mais alors il me semble que je vais dessiner sur l'écran...
    Que faudrais-il utiliser CBitmap, CImage...

    Sous C++ builder j'aurais utiliser un TCanvas en dynamique mais je ne trouve pas d'équivalent MFC.

    Je suis un peu dans la gadou ;-)

    Merci pour vos lumières !

  2. #2
    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 suis surpris que l'on puisse dessiner sur la console ...
    tu peux toujours essayer en récupérant le hWnd de la fenêtre avec l'api:
    GetConsoleWindow()
    tu récupèreras alors un dc avec GetDC.

  3. #3
    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
    En mono-thread, tu peux créer un DC en mémoire à partir de rien avec CreateCompatibleDC(NULL).
    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.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 82
    Par défaut
    Merci pour ta réponse.

    Je ne veux pas déssiner sur la console

    J'aimerais dessiner dans un objet temporaire dans une application console...
    La croix rouge ne serais dessiner quand mémoire et ensuite sauvegareder...

    Un peu comme les fonctions de screen shot, capture de l'image et écriture sur le disque pas de visualisation...

  5. #5
    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
    Donc, CreateCompatibleDC() est ton ami.
    L'équivalent direct sous MFC est la classe CMemoryDC.
    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.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 82
    Par défaut
    Merci pour vos réponse.

    Donc, CreateCompatibleDC() est ton ami.
    L'équivalent direct sous MFC est la classe CMemoryDC
    Je ne retrouve pas CMemoryDC dans les MFC library 7.0, faut-il le comprendre comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	CDC mdc;
     
    	mdc.CreateCompatibleDC(NULL);

  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
    Par défaut
    oui et CMemoryDC n'existe pas ...

  8. #8
    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
    En effet, j'ai du me gourer. J'aurais pourtant juré d'avoir vu une telle classe...
    Après examen, ce doit bien être ce que tu as posté.
    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.

  9. #9
    Membre confirmé Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Par défaut
    Je pense que la probleme ce n'est pas comment tu dessiner mais le probleme comment tu va recuprer ce que tu as dessiner pour l'enregistrer sous forme d'image bitmap,jpeg,... sans utilisé le contexte graphique?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 82
    Par défaut
    Impeccable !

    Je peux donc utiliser moveto,lineto,...

    Pour la suite je supposse qu'il faut lier à un bitmap avec CreateCompatibleBitmap ou bien utiliser CImage ? Les fonctions de sauvegarde de CImage me plaisent bien ... jpg,png,...

    Merci pour votre aide !

  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
    CImage c'est pas mal ...

  12. #12
    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() sur un DC vide retourne un bitmap monochrome.
    Je ne connais pas CImage (c'est du GDI+ ?), ni CBitmap s'il y a, mais pour créer un bon bitmap sans MFC, tu peux utiliser CreateDIBSection.
    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.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 82
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateCompatibleBitmap() sur un DC vide retourne un bitmap monochrome.
    Effectivement ce n'est pas ce que je veux

    mais pour créer un bon bitmap sans MFC, tu peux utiliser CreateDIBSection.
    Ha, mum le dessin devrais se faire à la main en colorisant pixel par pixel...
    Dans le CDC il y a tout une série de fonction notament pour le dessin de texte...

    Pas aussi simple on dirait

  14. #14
    Membre confirmé Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Par défaut
    Citation Envoyé par Médinoc
    créer un bon bitmap sans MFC, tu peux utiliser CreateDIBSection.
    C'est ça que je parle moi tu veux mettre quoi dans le permier parametre de la fonction de CreateDIBSection
    HBITMAP CreateDIBSection(
    HDC
    hdc, // handle to device context
    CONST BITMAPINFO *pbmi,
    // pointer to structure containing bitmap size,
    // format, and color data
    UINT iUsage, // color data type indicator: RGB values or
    // palette indexes
    VOID *ppvBits, // pointer to variable to receive a pointer to
    // the bitmap's bit values
    HANDLE hSection, // optional handle to a file mapping object
    DWORD dwOffset // offset to the bitmap bit values within the
    // file mapping object
    );

  15. #15
    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
    Citation Envoyé par MAGNUM_HEAD
    Ha, mum le dessin devrais se faire à la main en colorisant pixel par pixel...
    Ben non, c'est à ça que sert SelectObject() : un DIB est compatible avec TOUS les DC.

    riadh_ado: NULL, du moment que le troisième est DIB_RGB_COLORS.
    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.

  16. #16
    Membre confirmé Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Par défaut
    Citation Envoyé par Médinoc
    riadh_ado: NULL, du moment que le troisième est DIB_RGB_COLORS.
    Oui je l'essayé ça marchait mais pq on met pDC->GetSafeHdc() si on peut le mettre NULL, vrmt je ne comprend pas bien ce type HDC.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 82
    Par défaut
    Ben non, c'est à ça que sert SelectObject() : un DIB est compatible avec TOUS les DC.
    Je ne comprend pas trop...

  18. #18
    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
    Tu peux utiliser SelectObject() pour sélectionner n'importe quel bitmap créé par CreateDIBSection() dans n'importe quel DC qui accepte qu'on change son bitmap.

    Et les DC "mémoire" sont de ceux-là.

    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
    //Création d'un bitmap 24 bits (ceux comme fait Paint)
    BITMAPINFO bi = {
     { sizeof(BITMAPINFOHEADER), largeur, hauteur, 1, 24, BI_RGB, 0, 0, 0, 0, 0 },
     {{0, 0, 0, 0}}
     };
    LPVOID pDirectAccessBuffer = NULL;
    HBITMAP hBmp = CreateDIBSection( NULL, &bi, DIB_RGB_COLORS, &pDirectAccessBuffer, NULL, 0 );
    HDC hdc = CreateCompatibleDC(NULL);
    HGDIOBJ hOldBmp = SelectObject(hdc, hBmp);
     
    //Dessin
    //...
     
    //Sauvegarde
    //...
     
    //Nettoyage
    SelectObject(hdc, hOldBmp);
    DeleteDC(hdc);
    pDirectAccessBuffer = NULL; //Pas de free
    DeleteObject(hBmp);
    Edit: Ajouté (de mémoire et de doc) les paramètres effectifs de CreateDIBSection().
    Pour créer un bitmap 32 bits à la place de 24 (occupe 33% de place en plus mais sûrement plus rapide d'accès), il suffit de mettre 32 à la place de 24, puisque dans les deux cas, l'image n'a pas de palette.
    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.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 82
    Par défaut
    Cela devient beaucoup plus clair

    Merci à tous pour vos réponse et merci pour la qualité de ta réponse Médinoc !

    Finalement difficile d'utiliser les MFC dans ce cas...

    A+

  20. #20
    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 code que j'ai posté n'utilise même pas les MFC. C'est du pur code utilisant l'API Windows, code qui pourrait marcher en C.
    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.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/06/2012, 15h06
  2. Réponses: 7
    Dernier message: 24/11/2009, 16h41
  3. Mode console par défaut
    Par sekiryou dans le forum Administration système
    Réponses: 5
    Dernier message: 05/03/2004, 06h38
  4. Mode console et MFC ??
    Par G3G3 dans le forum MFC
    Réponses: 7
    Dernier message: 20/02/2004, 17h49
  5. Editeur en mode console
    Par logramme dans le forum C
    Réponses: 5
    Dernier message: 11/06/2002, 13h23

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