Un problème avec un code Multi DPI PrinterPageWidth

Programmation d'applications complexes
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Un problème avec un code Multi DPI PrinterPageWidth

Message 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
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

A mon avis, il faut déjà regarder si tes deux imprimantes ont la même résolution par défaut.
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message 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:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message 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é)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Marche pas 0 X 3 DPI, et pour le FAX : 200 X 200 DPI
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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 
Répondre