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 :

Application MFC - MDI - Gestion des couleurs étrange


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut Application MFC - MDI - Gestion des couleurs étrange
    Bonjour, rebonjour pour certains ^^

    Je suis toujours sur le développement de mon application MFC de type MDI qui trace des courbes.

    Ayant régler mon problème de scrollbar, je tombe sur un autre soucis à la X-Files !

    En effet, mon application trace des courbes dans un repère.
    Le repère est stylisé par un rectangle ainsi que de droites verticales et horizontales formant un quadrillage.

    Les intervalles de confiance à 2 sigma (sigma = écart type, cf statique) sont eux en gris.

    Le principe est de voir si la courbe qui est tracée via les paramètres rentrées dans la boite de dialogue est dans le "gabarit" de l'intervalle de confiance à 2 sigma ou en dehors de celui ci.

    A l'écran aucun problème, j'ai pile ce que je veux :

    - Mon repère et le quadrillage sont en noir d'épaisseur de 1 pixel
    - Ma courbe est en noir d'épaisseur de 4 pixels
    - Mon intervalle de confiance est en gris, il correspond au coloriage entre deux droites qui définissent le max et le min de mon intervalle => en gros je colorie sur toute ma surface...

    Par contre à l'impression c'est là c'est du grand Nawak...

    En effet, ce qui devrait être en gris est imprimé en noir O_o

    Ce problème est relativement fâcheux car le but de mon application est justement d'éditer des courbes comparées à un intervalle de confiance calculé indépendamment des valeurs saisies.

    Ma question est donc : comment VC 6 gère-t- il l'impression des niveaux de gris ?

    Où dois-je modifier mon code pour que tout rentre dans l'ordre ?

    Merci d'avance !

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Quelques précisions :

    Avec un crayon définit de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CPen Crayon_Gris; 
    Crayon_Gris.CreatePen(PS_SOLID,1,RGB(211,211,211));
    pDC->SelectObject(&Crayon_Gris);
    A l'écran mon intervalle de confiance est bien tracé en gris mais à l'impression c est du noir...


    Des suggestions ?

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 396
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 396
    Points : 20 507
    Points
    20 507
    Par défaut
    Citation Envoyé par m.olivier.valentin Voir le message

    Par contre à l'impression c'est là c'est du grand Nawak...

    En effet, ce qui devrait être en gris est imprimé en noir O_o
    Aaah les impressions c'est un autre monument de la programmation win32/MFC

    Les impressions c'est également une chose d'assez complexe car avec GetSystemMetrics GetDeviceCaps ( voir le MSDN ) il faut pouvoir déterminer si l'imprimante permet tel ou tel style de tracé...
    Donc il faut fouiller dans le MSDN ;
    Il faut gérer aussi la résolution de l'imprimante avec l'histoire des DPI ou Dot Per Inch
    Donc si tu as un problème de tracé c'est que l'imprimante ne permet pas telle ou telle opération

    Est-ce que tu utilises un Contexte de Périphérique en mémoire ?
    Voir aussi si StretchBlt est bien supportée

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Je précise juste qu'il n'y a QUE la couleur qui n'est pas bonne, le reste c'est parfait, résolution, etc etc....

    Dans quelle fonction il faut que je cherche à faire des modif ? Dans quelle classe se trouve-t-elle ?

    J'ai essayé de regarder avec msdn mais je pense que j avais pas sais les bons mots clés...

    Si vous avez des précisions cela m'aiderait !

    Merci !

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    J'ai fait un petit tour sur msdn ce jour pour regarder le détail de certaines fonctions de ma classe view dérivant de ScrollView.

    Je suis tombé notamment sur le descriptif de OnPreparePrinting et plus particulièrement là dessus :

    The default implementation of this function does nothing. Override this function to allocate any GDI resources, such as pens or fonts, needed specifically for printing.
    Or comme je gère la couleur de mes courbes avec des crayons justement, peut être devrais je déclarer ceux ci dans cette fonction non ?

    Si vous avez des indices pour la résolution de ce problème, je dis pas non...

    Merci d'avance !

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 396
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 396
    Points : 20 507
    Points
    20 507
    Par défaut
    Salut Olivier ce serait plutot avec OnBeginPrinting car cette méthode te fournit un CDC. ( et selon la bible "Programming Windows with MFC" de Jeff Prosise )
    Si tu as des problèmes de couleur je le répète c'est parce que l'imprimante ne supporte pas certaines opérations de tracé...
    tu devrais appeler GetDeviceCaps() pour cela


    When you send output to the printed page, it's generally a mistake to assume anything about the printable area of the pages you'll be printing.

    Even if you know you're printing to, say, an 8½-by-11-inch page, the printable page area will differ for different printers.

    The printable page area can even differ for the same printer and the same paper size depending on which printer driver is being used, and the horizontal and vertical dimensions of the printable page area will be switched if the user opts to print in landscape rather than portrait mode.

    Rather than assume you have a given amount of space to work with, do as HexDump does and call GetDeviceCaps through the CDC pointer provided to CView print functions to determine the printable page area each time you print, or use CPrintInfo::m_rectDraw in your OnPrint function.

    This simple precaution will enable your printing code to work with any printer Windows can throw at it and will greatly reduce the number of problem reports you receive from users.

    As you've already learned, calling GetDeviceCaps with HORZRES and VERTRES parameters returns the horizontal and vertical dimensions of the printable page area. You can pass the following values to GetDeviceCaps to get more information about a printer or other hardcopy device:


    RASTERCAPS Returns a series of bit flags identifying the level of GDI support provided by the printer driver. For example, an RC_BITBLT flag indicates that the printer supports BitBlts, and RC_STRETCHBLT indicates that the printer supports StretchBlts.
    NUMCOLORS Returns the number of colors the printer supports. The return value is 2 for black-and-white printers.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Si tu as des problèmes de couleur je le répète c'est parce que l'imprimante ne supporte pas certaines opérations de tracé...
    Non cela ne vient pas de là : mon imprimante est tout à fait capable de réaliser ce genre de tracer, inutile de continuer sur cette voix...

    Par contre, je veux bien que tu m'expliques pour cette histoire de GetDeviceCaps() parce que je t'avoue que j'ai, semble-t-il, pas tout compris...

    Pour le point que tu soulève sur OnBeginPrinting, je n'en ai aucune idée, si tu penses qu'il faut le faire là et si tu sais comment il faut s'y prendre, je suis tout ouï !

    Encore merci

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 396
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 396
    Points : 20 507
    Points
    20 507
    Par défaut
    eh bien c'est tout simple il faut que tu appelles GetDeviceCaps pour te donner les parametres de l'imprimante ses possibilties c'est explique dans le MSDN.
    Il faut que tu calcules le mode de resolution de l'imprimante les capacites de trace graphique

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    vc6 n'a pas de méthode particulière pour gérer les niveaux de gris,
    la vérité est ailleurs.
    les objets gdi alloués sont bien relâchés après utilisation ?
    je suppose que tu as pensé à regarder le paramétrage de l'imprimante ?
    tu as essayé avec un autre édition ?, genre tu fais une copie écran de ton dessin et tu l'imprime dans paint , ça fonctionne ?

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    tu as essayé avec un autre édition ?, genre tu fais une copie écran de ton dessin et tu l'imprime dans paint , ça fonctionne ?
    oui cela fonctionne sans aucun problème, c'est pour cela que j'ai dit que mon imprimante est tout a fait capable de faire cela...

    donc je suppose que cela vient de mon application et non de l'imprimante.

    les objets gdi alloués sont bien relâchés après utilisation ?
    En fait à part la déclaration de mes crayons (cf ci dessus), mon application ne fait que des pDC->MoveTo() puis pDC->LineTo(). Pour la gestion du texte j'utilise pDC->TextOut()...

    Le problème peut-il venir de là ?

    je suppose que tu as pensé à regarder le paramétrage de l'imprimante ?
    Rha mais enfin, mon imprimante fait ce genre de tracé SANS probleme... Elle fait même bien plus compliqué en temps normal...

    Je pense que cela vient plutôt du fait que mon application communique mal avec l'imprimante... Et là je sais pas quoi faire...

    Normal les couleurs devraient être imprimés en niveau de gris (dans mon cas j ai deux couleurs : du rouge et du gris). Seulement non tout est imprimé en noir !

    Donc comment m'en sortir ?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Bon eh bien je suis toujours bloqué avec ce problème d'impression, cela devient vraiment ennuyant...

    J'ai essayé de trouver des infos sur GetDeviceCaps et sur la gestion des couleurs mais je vois pas comment faire...

    Tout aide est la bienvenue...

    Ps : les réponses du type "ah mais c'est tout simple il faut faire X ou Y" merci mais je préfèrerais plutôt des réponses détaillées pour résoudre mon problème relativement rapidement... MSDN je l'ai fouillé en long, en large et en travers et sans succès !

    MERCI

Discussions similaires

  1. [MFC]MDI - switcher des documents
    Par Nemehy dans le forum MFC
    Réponses: 4
    Dernier message: 30/03/2006, 16h20
  2. [VB] gestion des couleurs des variables de type string
    Par landry005 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 28/03/2006, 14h36
  3. [MDI] gestion des fenêtres
    Par Lenaick dans le forum C++Builder
    Réponses: 12
    Dernier message: 23/02/2006, 18h15
  4. Réponses: 2
    Dernier message: 11/05/2005, 13h23
  5. [Debutant] gestion des couleurs ??
    Par MaxiMax dans le forum OpenGL
    Réponses: 5
    Dernier message: 26/03/2004, 08h34

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