Page 1 sur 1

Un problème avec un code Multi DPI PrinterPageWidth

Publié : dim. 13/nov./2005 20:50
par julien
J'utilise ce code pour pouvoir passer des Centimètres au pixel sur toutes les imprimantes en théorie

Code : Tout sélectionner

Procedure xcm(xcm.f)

result = xcm * (PrinterPageWidth()/21) ; 21cm A4
ProcedureReturn result

EndProcedure


Procedure ycm(xcm.f)

result = xcm * (PrinterPageHeight()/29.7) ; 29,7cm A4
ProcedureReturn result

EndProcedure
Si je prend un rectangle de x cm et de y cm, ça me renvoie :

Sur l'imprimante 1 :
la fonction me retourne :
X = 480
Y = 621
donc un facteur de 1.29375

Sur l'imprimante 2 :
la fonction me retourne :
X = 800
Y = 1015
donc un facteur de 1,26875


Pourquoi on obtient pas la mème chose ?
(sur l'imprimante 2 l'image est déformé)

Merci de votre aide :D

Publié : dim. 13/nov./2005 20:57
par Chris
A mon avis, il faut déjà regarder si tes deux imprimantes ont la même résolution par défaut.

Publié : dim. 13/nov./2005 21:43
par julien
Il me semble (ou alors j'ai pas compris) que c'est le but de ces 2 fonctions, de retourner le nombre de pixels (différent suivant la capacité de résolution) par rapport au centimètre, non ? :roll:

Publié : lun. 14/nov./2005 8:21
par Dr. Dri
DPI = Dots Per Inch
PPP = Points Par Pouce
(c'est les deux pareil =)

Donc il faut passer des pouces aux centimètres et je ne vois pas ca dans tes procédures ^^

Dri ;)

Publié : lun. 14/nov./2005 15:33
par julien
Dr. Dri a écrit :DPI = Dots Per Inch
PPP = Points Par Pouce
(c'est les deux pareil =)

Donc il faut passer des pouces aux centimètres et je ne vois pas ca dans tes procédures ^^

Dri ;)
Ehuu comment tu fais ça ? :roll:

Mais si je part des centimètre ?

En fait je veux imprimer un rectange de 10 cm par 15 cm, sur l'imprimante 1 ça me sort sur papier un rectangle de 10 cm par 15 cm

et sur 'lmprimante 2 (plus recente) ça me sort un rectangle de 10 cm par 14 cm (photo ecrasé)

Publié : lun. 14/nov./2005 16:13
par Chris
PrinterPageWidth() et PrinterPageHeight() renvoient des valeurs différentes selon la résolution en DPI (ou PPP) à laquelle est configurée ton imprimante.

Mais à ma connaissance, PureBasic ne prends pas en charge le règlage ou la récupération de cette résolution.
Tu dois passer par l'Api, et utiliser la structure DEVMODE pour retrouver les règlages de résolution de tes imprimantes

Mais comment faire, alors là, c'est une autre histoire....? :roll:

Déjà, pour en avoir le coeur net, tu peux aller faire un tour dans les propriétés de tes imprimantes, et vérifier si elles travaillent ou non à la même résolution.

Si elles sont identiques, alors il faudra chercher ailleurs.

Publié : lun. 14/nov./2005 16:47
par Chris
Un petit bout de code qui te renvoie la résolution de ton imprimante.

Tu choisis l'imprimante, et tu cliques sur "Ok"

Code : Tout sélectionner

  PrnCap.PRINTDLG : PrnCap\lStructSize = SizeOf(PRINTDLG)
  
  If PrintDlg_(@PrnCap)
    *Mod.DEVMODE
    *Mod = GlobalLock_(PrnCap\hDevMode)
    MessageRequester("Resolution", Str(*Mod\dmYResolution)+" x "+Str(*Mod\dmPrintQuality)+" DPI")
    GlobalFree_(hDevMode)
  EndIf

Publié : lun. 14/nov./2005 17:41
par julien
Marche pas 0 X 3 DPI, et pour le FAX : 200 X 200 DPI

Publié : lun. 14/nov./2005 17:44
par Chris
Bizarre, chez moi, ça marche.

Ca me retourne bien la résolution de l'imprimante telle qu'elle est retournée par les propriétés dans le gestionnaire de Windows.

Publié : lun. 14/nov./2005 22:27
par Backup
les points de l'imprimante correspondent a quoi ? 8O

pas au point typographique par hazrd ?,

pour info un point typographique= (0.376 millimetre) !!
12 points= un "12" ou 1 cicero :D

Publié : jeu. 16/févr./2006 16:11
par LavaLava
Slt,
je fais des recherches sur le DPI des imprimantes et en lisant ton probléme je pense avoir compris ...
La valeur retourné par PrintetPageHeight et Width est le nombre de pixel de la zone imprimable.
Tu as décidé que ta page faisait 210 par 297 mais ce n'est pas le cas pour toutes les imprimantes (imrpimante A3, photo,...).
La longueur de page de ton imprimante 1 et 2 ne doit pas être identique, d'ou la différence de ratio.

Pour connaitre la largeur et hauteur imprimable par ton imprimante il te faut connaitre le DPI et tu fais ton calcul.

Publié : jeu. 16/févr./2006 16:37
par nico
Un code qui te donne toutes les infos nécessaires:

Code : Tout sélectionner

; Printer_Settings - TerryHough - 14 Nov, 2005 
; Based on code from Alberto in 
; PB Forum topic http://forums.purebasic.com/english/viewtopic.php?t=11411 

; Corrected output description, they are device context units not pixels - terryhough 14 Nov, 2005 
Msg$ = "" 
ExamineDesktops() 
Style.l = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget 
Pgm$ = "Printer Settings om Device Units" 
If OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0)-30, Style.l, Pgm$) 
  If PrintRequester() 
    printer_DC.l = StartDrawing(PrinterOutput()) 
    If  printer_DC 
      Msg$ +         "Horizontal DPI = " + Chr(9) + Chr(9) + Str(GetDeviceCaps_(printer_DC,#LOGPIXELSX)) 
      Msg$ + #LF$ +  "Vertical DPI = " + Chr(9) + Chr(9) + Str(GetDeviceCaps_(printer_DC,#LOGPIXELSY)) 
      Msg$ + #LF$ +  "Physical Width = " + Chr(9) + Chr(9) + Str(GetDeviceCaps_(printer_DC,#PHYSICALWIDTH)) 
      Msg$ + #LF$ +  "Physical Height = " + Chr(9) + Chr(9) + Str(GetDeviceCaps_(printer_DC,#PHYSICALHEIGHT)) 
      Msg$ + #LF$ +  "Horizontal Margin = " + Chr(9) + Str(GetDeviceCaps_(printer_DC,#PHYSICALOFFSETX)) 
      Msg$ + #LF$ +  "Vertical Margin = " + Chr(9) + Chr(9) + Str(GetDeviceCaps_(printer_DC,#PHYSICALOFFSETY)) 
      Msg$ + #LF$ +  "Width* = " + Chr(9) + Chr(9) + Str(GetDeviceCaps_(printer_DC,#HORZRES)) 
      Msg$ + #LF$ +  "Height* = " + Chr(9) + Chr(9) + Str(GetDeviceCaps_(printer_DC,#VERTRES)) 
      Msg$ + #LF$ +  "Width in millimeters = " + Chr(9) + Str(GetDeviceCaps_(printer_DC,#HORZSIZE)) 
      Msg$ + #LF$ +  "Height in millimeters = " + Chr(9) + Str(GetDeviceCaps_(printer_DC,#VERTSIZE)) 
      Msg$ + #LF$ + #LF$ + "Same as PB commands PrinterPageWidth() and PrinterPageHeight()" 
      MessageRequester("Printer settings",Msg$,#MB_ICONINFORMATION) 
    EndIf 
    StopDrawing() 
  EndIf 
  Quit = MessageRequester("Printer settings",Msg$,#MB_ICONINFORMATION) 
  Repeat 
    Event = WaitWindowEvent() 
  Until Event = #PB_Event_CloseWindow Or Quit = 1 
EndIf 
End