Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Impression sur imprimante

4 réponses
Avatar
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 );

4 réponses

Avatar
Christian ASTOR
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)
Avatar
Roger
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é
Avatar
Roger
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 );
Avatar
Christian ASTOR
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