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 :

Problème d'impression Windows XP/Lexmark avec StretchBlt


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut Problème d'impression Windows XP/Lexmark avec StretchBlt
    Bonjour,

    Je rencontre actuellement un problème que je n'arrive pas à résoudre.

    Lors de l'impression d'un dossier, j'utilise la fonction StretchBlt pour imprimer des images s'y trouvant. Celà ne pose aucun soucis avec toutes les imprimantes sous Windows 98/2000 par contre, lorsque je suis sous windows XP, je rencontre une erreur avec les imprimantes Lexmark (et uniquement ces imprimantes)

    voici le code que j'ai :


    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
    void CThumbnail::Print(CDC *pDC)
    {
     
    	CDC SecondDC;
    	int oldMapMode = pDC->SetMapMode( MM_TEXT );
     
    	pDC->GetSafeHdc(); 
    	SecondDC.CreateCompatibleDC( NULL );
     
    	CBitmap *oldBM = SecondDC.SelectObject( &Bmp );
     
     
    	pDC->SetStretchBltMode(COLORONCOLOR );
     
    			if( !pDC->StretchBlt( 
    					VOPos.x, VOPos.y,Size.cx, Size.cy,
    					&SecondDC,	
    					0, 0, VOSize.cx, VOSize.cy,
    					SRCCOPY
    					) ) 
    			{
    				throw( xUnknown("Erreur StretchBlt") );
    			}
     
     
    	pDC->SetMapMode( oldMapMode );
     
    	SecondDC.SelectObject( oldBM );
    	SecondDC.DeleteDC();
     
     
    }
    J'ai essayé pas mal de choses mais rien n'y fait...je n'arrive pas a comprendre pourquoi et ou se trouve le problème. C'est assez urgent et il est important que ce programme fonctionne ave n'importe quelle imprimante, Lexmark compris.

    Quelqu'un a-t-il rencontré ce problème? Y a-t-il quelque chose que j'oublie?

    D'avance, je vous remercie pour vos réponses

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    ce qui me gene dans ta façon de faire c'est la creation de ton 2 dc en memoire :
    ça serait plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SecondDC.CreateCompatibleDC( pdc );
    et apparemment tu ne tiens pas trop compte des capabilités de resolution de l'imprimante .

    voir cet exemple dans la faq:
    http://c.developpez.com/faq/vc/?page...PrintDialgoBox

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Lorsque je mets pDC a la place de NULL...l'image ne veut pas être chargée et elle n'est donc pas imprimée.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    J'ai ajouté la prise en compte des capacités de résolutions de l'imprimante, voici le nouveau 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    CDC SecondDC;
    	int     xScrn, yScrn; 
    	int     nWidth, nHeight;
    	int     nX, nY, nX2, nY2;  
     
    	int oldMapMode = pDC->SetMapMode( MM_TEXT );
     
    	pDC->GetSafeHdc(); 
    	SecondDC.CreateCompatibleDC( pDC );
     
    	xScrn = pDC->GetDeviceCaps(HORZRES);     
        yScrn = pDC->GetDeviceCaps(VERTRES);   
     
    	nX = VOPos.x;
    	nY = VOPos.y;
    	nX2 = VOPos.x + Size.cx;
    	nY2 = VOPos.y + Size.cy;
     
    	if (nX < 0) nX = 0;        
        if (nY < 0) nY = 0;     
        if (nX2 > xScrn) nX2 = xScrn;      
        if (nY2 > yScrn) nY2 = yScrn;      
        nWidth = nX2 - nX;     
        nHeight = nY2 - nY; 
     
     
    	CBitmap *oldBM = SecondDC.SelectObject( &Bmp );
     
    	pDC->SetStretchBltMode(COLORONCOLOR );
     
    			if( !pDC->StretchBlt( 
    					nX, nY,nWidth, nHeight,
    					&SecondDC,	
    					0, 0, VOSize.cx, VOSize.cy,
    					SRCCOPY
    					) ) 
    			{
    				throw( xUnknown("Erreur StretchBlt") );
    			}
     
     
    	pDC->SetMapMode( oldMapMode );
     
    	SecondDC.SelectObject( oldBM );
    	SecondDC.DeleteDC();
    Malheureusement, l'image n'est pas imprimée. Je n'arrive pas a comprendre pourquoi.

  5. #5
    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
    une autre aspect dont il faut tenir compte :
    extrait du lien precedent de la faq:
    Imprimer le bitmap:
    Un problème se pose:
    Le bitmap généré représente un DDB :device-dependent bitmap . Et ce type de bitmap n'est pas imprimable directement ,il faudra le transformer en DIB device-independent bitmap.
    d'où l'utilisation dans mon exemple de la classe CPictureHolder .
    Le même problème sera rencontré avec l'utilisation de la fonction CBitmap::LoadBitmap, pour contourner le problème il faudra faire comme ..
    regarde la partie edition ou on utilise un objet CPictureHolder.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    En effet, et mon image est bien convertie de DIB

    Mon problème ne vient pas de là puisque ce programme fonctionne sans aucun soucis avec n'importe quelle imprimante sous windows 98 et 2000.
    Il fonctionne aussi avec toutes les imprimantes sous windows XP "SAUF" avec les imprimantes Lexmark

  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
    re,
    attention à ça:
    Not all devices support the StretchBlt function. To determine whether a device supports StretchBlt, call the GetDeviceCaps method with the RASTERCAPS index and check the return value for the RC_STRETCHBLT flag.

  8. #8
    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
    tu devrais essayer l'api :StretchDIBits
    ou passer par le cpictureholder pour l'impression

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Bien, j'ai essayé d'utiliser StretchDIBits je suis parvenu a imprimer sans soucis avec une epson mais la lexmark refuse encore et toujours d'imprimer.

  10. #10
    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
    essaie avec le cpictureholder

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Je ne veux pas manipuler mon image, cette partie là fonctionne et ne pose aucun problème. mon image est bien convertie en DIB, aucun soucis par ici...

    Mon soucis c'est que les Lexmark ont oublié le fonctionnement de StretchBlt et autres BitBlt et StretchDIBits avec les drivers pour XP et donc que je ne trouve aucun moyen pour imprimer une simple image avec ces imprimantes sous windows XP...et c'est d'autant plus frustrant que les drivers des Lexmark pour 98/2000 gèrent sans aucun soucis StretchBlt

    Bref, je ne trouve aucune solution pour imprimer mon image sur une Lexmark sous XP...et bien entendu comme toujours dans ces cas là, c'est justement quelque chose auquel je ne peux pas couper.

  12. #12
    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
    essaie un driver compatible HP si c'est possible ...

  13. #13
    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
    c'esr quoi comme printer ?
    une laser ,jet d'encre ?
    tu as essayer de voir avec un driver US ?

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Il y a plusieurs modèles donc je suppose que ça s'applique pour toutes les lexmark (X1150 et P707 sont les modèles que j'ai pu tester)

    Quand aux drivers, j'en ai testé plusieurs mais sans plus de succès

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Bien, j'avance un tout petit peu, cette fois, l'image est imprimée seulement, elle est entièrement noire. Pour celà, j'ai modifié le mode en utilisant DSTINVERT au lieu de SRCCOPY. Donc j'imagine que ce doit être ici qu'il faut que je cherche. Mais ma question est la suivante, est-il possible de combiner plusieurs modes et si oui, quels sont ceux qui seraient les mieux adaptés?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	if( !pDC->StretchBlt( 
    					VOPos.x, VOPos.y,Size.cx, Size.cy,
    					&SecondDC,	
    					0, 0, VOSize.cx, VOSize.cy,
    					DSTINVERT
    					) ) 
    			{
    				throw( xUnknown("Erreur StretchBlt") );
    			}

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    re,
    a mon avis tu fais fausse route.
    fais au moins un essai avec CPictureHolder qu'est ce que tu risques ?

  17. #17
    Membre habitué
    Inscrit en
    Juillet 2003
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 196
    Points : 165
    Points
    165
    Par défaut
    Slt,

    A tout hasard as-tu déjà imprimé une image avec une autre application sur cette imprimante.

Discussions similaires

  1. [Windows 7] problème d'impression avec mon application VB6
    Par PrincessKC dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 16/06/2011, 14h36
  2. Réponses: 1
    Dernier message: 18/02/2009, 13h36
  3. Problème impression avec StretchBlt
    Par michel_bbm dans le forum C
    Réponses: 2
    Dernier message: 04/04/2008, 14h26
  4. Réponses: 2
    Dernier message: 07/08/2007, 11h32
  5. Problème d'impression avec delphi
    Par Bourak dans le forum Langage
    Réponses: 1
    Dernier message: 12/11/2005, 17h13

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