Impression sur imprimante

Le
Roger
Il y a forcément quelque chose que je n'ai pas encore bien compris
concernant l'utilisation des devices contextes et des bitmaps.
Pourquoi ma solution 1 fonctionne et pourquoi ma solution 2 ne marche pas
(j'édite une page blanche) ?
Merci
****************************************
********** Solution 1 (qui marche): ********** (prd.hDc est le device
contexte de l'imprimante)
larg=GetDeviceCaps(prd.hDC, HORZRES);
haut=GetDeviceCaps(prd.hDC, VERTRES);
SetRect(&rect,larg*marges,haut*marges,larg-(larg*marges*2),haut-(haut*marges*2));
if ( StartDoc( prd.hDC, &di ) > 0 )
{
StartPage( prd.hDC );
Ellipse(prd.hDC,0,0,larg,haut);
DrawText(prd.hDC,"Ceci est une page de test",-1,&rect,DT_SINGLELINE |
DT_VCENTER | DT_CENTER);
EndPage( prd.hDC );
EndDoc( prd.hDC );
}
******************************************
********** Solution 2 (qui ne marche pas): ****************
larg=GetDeviceCaps(prd.hDC, HORZRES);
haut=GetDeviceCaps(prd.hDC, VERTRES);
SetRect(&rect,larg*marges,haut*marges,larg-(larg*marges*2),haut-(haut*marges*2));
hDCmem = CreateCompatibleDC(prd.hDC);
Ellipse(hDCmem,rect.left,rect.top,rect.right,rect.bottom);
DrawText(hDCmem,"Ceci est une page de test",-1,&rect,DT_SINGLELINE |
DT_VCENTER | DT_CENTER);
if ( StartDoc( prd.hDC, &di ) > 0 )
{
StartPage( prd.hDC );
BitBlt(prd.hDC,0,0,larg,haut,hDCmem,0,0,SRCCOPY); // copy hdcMemoire ->
prd.hDC
EndPage( prd.hDC );
EndDoc( prd.hDC );
}
DeleteDC( hDCmem );
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #23678121
Roger a écrit :
Il y a forcément quelque chose que je n'ai pas encore bien compris
concernant l'utilisation des devices contextes et des bitmaps.
Pourquoi ma solution 1 fonctionne et pourquoi ma solution 2 ne marche pas
(j'édite une page blanche) ?



Il faut créer un DC compatible avec l'écran (GetDC(NULL) par ex pour le
screen DC) et y sélectionner une Bitmap compatible
(CreateCompatibleBitmap()-SelectObject())

(+ StretchDIBits() préférable pour blitter vers printer, comme ds la
KB186736)
Roger
Le #23678991
Merci pour la réponse, mais comme je n'ai pas compris la logique je n'ai pas
dû faire exactement ce qu'il fallait car ça ne marche toujours pas.
Ci-dessous la nouvelle solution 2 en essayant d'y intégrer tes remarques:
**************** Solution 2 ***************************
larg=GetDeviceCaps(prd.hDC, HORZRES);
haut=GetDeviceCaps(prd.hDC, VERTRES);
SetRect(&rect,larg*marges,haut*marges,larg-(larg*marges*2),haut-(haut*marges*2));
hbm=CreateCompatibleBitmap(GetDC(NULL), rect.right, rect.bottom); // *****
fonction rajoutée ***********
hDCmem = CreateCompatibleDC(prd.hDC); // **** non modifiée mais j'ai aussi
essayé de la remplacer sans succès par: hDCmem =
CreateCompatibleDC(GetDC(NULL));
SelectObject(hDCmem, hbm); // ********* fonction rajoutée ***********
Ellipse(hDCmem,rect.left,rect.top,rect.right,rect.bottom);
DrawText(hDCmem,"Ceci est une page de test",-1,&rect,DT_SINGLELINE |
DT_VCENTER | DT_CENTER);
if ( StartDoc( prd.hDC, &di ) > 0 )
{
StartPage( prd.hDC );
BitBlt(prd.hDC,0,0,larg,haut,hDCmem,0,0,SRCCOPY); // copy hdcMemoire ->
prd.hDC
EndPage( prd.hDC );
EndDoc( prd.hDC );
}
DeleteDC( hDCmem );
**************************************************************
Concernant la logique je ne vois pas par exemple qu'est-ce que vient faire
le device contexte de l'écran là-dedans.
J'aurais compris qu'il faille par exemple une bitmap rattachée au hDCmem,
mais l'écran je ne vois pas le rapport.
Quant à la fonction StretchDIBits(), autant je comprends à peu près les
paramètre de BitBlt, autant pour StretchDIBits() je ne vois pas comment
initialiser la plupart de ses paramètres.
Désolé
Roger
Le #23679021
Bon entre temps j'ai essayé cette séquence ci-dessous (je prends un bitmap
du contexte de l'imprimante) et cette fois-ci j'obtiens quelque chose.
Mais au lieu d'obtenir un simple tracé de l'ellipse comme dans la solution
1, j'obtiens une ellipse coloriée en blanc à l'intérieur et en noir à
l'extérieur sur toute la page.
Ce qui fait que le micro a mouliné pendant 5mn avant de sortir quelque chose
et le texte "page de test" n'apparaît pas, je suppose qu'il est caché par
l'ellipse.
Si cette méthode ne sait donner que ce résultat là, je préfère la solution
1.
Mais je n'ai peut-être pas fait ce qu'il fallait !...
larg=GetDeviceCaps(prd.hDC, HORZRES);
haut=GetDeviceCaps(prd.hDC, VERTRES);
SetRect(&rect,larg*marges,haut*marges,larg-(larg*marges*2),haut-(haut*marges*2));
hbm=CreateCompatibleBitmap(prd.hDC, rect.right, rect.bottom); // bitmap pour
le device context de l'imprimante
hDCmem = CreateCompatibleDC(prd.hDC);
SelectObject(hDCmem, hbm);
Ellipse(hDCmem,rect.left,rect.top,rect.right,rect.bottom);
DrawText(hDCmem,"Ceci est une page de test",-1,&rect,DT_SINGLELINE |
DT_VCENTER | DT_CENTER);
if ( StartDoc( prd.hDC, &di ) > 0 )
{
StartPage( prd.hDC );
BitBlt(prd.hDC,0,0,larg,haut,hDCmem,0,0,SRCCOPY); // copy hdcMemoire ->
prd.hDC
//StretchDIBits();
EndPage( prd.hDC );
EndDoc( prd.hDC );
}
DeleteDC( hDCmem );
Christian ASTOR
Le #23679341
Roger a écrit :
Quant à la fonction StretchDIBits(), autant je comprends à peu près les
paramètre de BitBlt, autant pour StretchDIBits() je ne vois pas comment
initialiser la plupart de ses paramètres.



Comme cité, voir l'exemple de la KB186736
Publicité
Poster une réponse
Anonyme