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 );
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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)
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)
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
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é
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é
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
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 );
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 );
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
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
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.
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.