[win32] Problème Impression

Problème Impression [win32] - C - Programmation

Marsh Posté le 08-11-2005 à 17:29:41    

Bonjour,  
J'ai visiblement un soucis lié au Device quand j'imprime une liste ...  
La sortie dans un PDF est tout a fait correcte mais si je selectionne l'imprimante la taille des caractères du titre et le cadre déssinés sont démesurés !!!  
Comment faire face à ce Pb ?  
La proc de test est toute simple est la suivante

Code :
  1. void Imprimer (HWND hwnd, HDC hdcprint, int nb_mvt, int nb_selected, OPERATION *mvt)
  2. {
  3. TEXTMETRIC  tm;
  4. RECT rc;
  5. LOGFONT lf;
  6. LOGPEN  lp;
  7. POINT pt;
  8. static HPEN stylo;
  9. static HFONT font1;
  10. static short cxChar, cyChar;
  11. static xPage, yPage;
  12. char szBuffer[100];
  13. char temp[10];
  14.                   GetTextMetrics (hdcprint, &tm);
  15.                   cxChar = tm.tmAveCharWidth;
  16.                   cyChar = tm.tmHeight + tm.tmExternalLeading;
  17.      xPage = GetDeviceCaps (hdcprint, HORZRES);
  18.                   yPage = GetDeviceCaps (hdcprint, VERTRES);
  19.          
  20.    rc.left   = 2*cxChar;
  21.              rc.right  = xPage - rc.left;
  22.    rc.top    =  cyChar;
  23.              rc.bottom = yPage-cyChar;
  24.    if (nb_selected == 1) {
  25.                StartPage (hdcprint);
  26.                stylo = CreatePen(PS_SOLID, 5, RGB(255,0,0));
  27.                SelectObject (hdcprint, stylo);
  28.                Rectangle(hdcprint, rc.left, rc.top, rc.right, rc.bottom); 
  29.                DeleteObject (stylo);
  30.                font1=CreateFont(30,0,0,0,700, FALSE,FALSE,FALSE,0,OUT_DEFAULT_PRECIS,
  31.                      CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,
  32.                      "Comic Sans MS" );
  33.                SelectObject (hdcprint, font1);
  34.                SetTextColor (hdcprint, RGB(0, 0, 255));
  35.                SetBkMode (hdcprint, TRANSPARENT);
  36.                strcpy(szBuffer, "Test d'Edition des Mouvements" );
  37.      rc.top = 2*cyChar;
  38.                DrawText(hdcprint,szBuffer,strlen(szBuffer),&rc,DT_CENTER);
  39.                DeleteObject (font1);
  40.      MoveToEx (hdcprint, rc.left, rc.top+(3*cyChar), NULL);
  41.      LineTo (hdcprint, rc.right, rc.top+(3*cyChar));
  42.    }
  43.              if (nb_selected == nb_mvt)
  44.                EndPage (hdcprint);
  45. }


Merci d'avance.

Reply

Marsh Posté le 08-11-2005 à 17:29:41   

Reply

Marsh Posté le 13-11-2005 à 17:18:13    

Pour moi le problème est là:
 

Code :
  1. font1=CreateFont(30, // -> la taille dépend du DC (mode mapping MM_TEXT)
  2. 0,0,0,700, FALSE,FALSE,FALSE,0,OUT_DEFAULT_PRECIS,
  3. CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,
  4. "Comic Sans MS" );


La taille de la police doit être calculée en fonction de la résolution du DC. La MSDN donne la formule de conversion à partir de la taille en point que tu souhaites pour ta police. Voir la section "Police de caractères" de la MSDN. La formule met en jeu GetDeviceCaps(LOGPIXELY) et un ratio 72 si j'ai bonne mémoire.
 
Il doit exister une fonction CreatePointFont ou alors est-ce en MFC ? Enfin bref cherche dans la MSDN.
 
Edit: non CreatePointFont est dans les MFC pas dans la Win32. La formule dont j'ai parlé:

nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);


La page de la MSDN
 
Mais en regardant le code en détail, j'ai détecté un autre problème potentiel :
 

Code :
  1. SelectObject (hdcprint, stylo);
  2. Rectangle(hdcprint, rc.left, rc.top, rc.right, rc.bottom); 
  3. DeleteObject (stylo); // <- Windows peut entrer dans un état instable


La bonne façon de faire (de mémoire):

Code :
  1. HFONT styloPrecedent = (HFONT)SelectObject(hdcprint, stylo);
  2. Rectangle(hdcprint, rc.left, rc.top, rc.right, rc.bottom);
  3. // Restaure le stylo précédent avant de détruire notre stylo
  4. SelectObject(hdcprint, styloPrecedent);
  5. // Détruit le stylo devenu inutile sans risque pour l'environnement
  6. DeleteObject(stylo);
  7. // Le stylo est détruit. L'indiquer de manière formelle pour détecter une
  8. // utilisation ultérieure de l'objet GDI.
  9. stylo = NULL;


Message édité par slash33 le 13-11-2005 à 17:40:14
Reply

Marsh Posté le 13-11-2005 à 18:23:37    

Bonsoir,
J'ai effectivement resolu le problème avec la formule preconisée dans MSDN

Code :
  1. nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);


J'ai également pris bonne note de ta remarque sur le "stylo"
 
Encore merci.
@+.

Reply

Marsh Posté le 14-11-2005 à 11:37:39    

A noter que les MFC avec la classe CDC règlent ce problème pour toi (mais rajoute en complexité, ce qui fait qu'on pas si on a gagne au change...)
 
Ravi d'avoir pu t'aider.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed