Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1351 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [win32] Problème Impression

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[win32] Problème Impression

n°1241460
dd92
Posté le 08-11-2005 à 17:29:41  profilanswer
 

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.

mood
Publicité
Posté le 08-11-2005 à 17:29:41  profilanswer
 

n°1244714
slash33
Posté le 13-11-2005 à 17:18:13  profilanswer
 

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
n°1244739
dd92
Posté le 13-11-2005 à 18:23:37  profilanswer
 

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.
@+.

n°1245060
slash33
Posté le 14-11-2005 à 11:37:39  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [win32] Problème Impression

 

Sujets relatifs
sqlplus : problème union 1 to many avec datesproblème de date...
Problème en CSS !![swing] problème de TableModelListener
Probleme d'alignement verttical.Problème avec sscanf
[CSS] Problème de cadre en CSSProbleme de references
Probleme Access: assistant création formulaire ne détecte pas de champProbleme de répertoire
Plus de sujets relatifs à : [win32] Problème Impression


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR