IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VS2005][VB.NET] M'assurer d'une impression identique d'une imprimante à l'autre


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Par défaut [VS2005][VB.NET] M'assurer d'une impression identique d'une imprimante à l'autre
    Bonjour,

    Je sais qu'en raison des différences de marges physiques et de résolution (dpi) d'une imprimante à l'autre, je cherche à faire en sorte que mon imprimé ait une position absolue par rapplrt à la marge de gauche et à la marge inférieure quel que soit le périphérique vers lequel j'envoie mon PrintDocument.

    Le code qui suit m'a l'air OK pour obtenir les marges physiques de l'imprimante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        Dim marge_physique_gauche As Single
        Dim marge_physique_haute As Single
        Dim dpiX As Integer
        Dim dpiY As Integer
     
        'API de lecture des capacités de l'imprimante
        Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As IntPtr, ByVal capIndex As Int32) As Int32
     
        Private Const LOGPIXELSX As Integer = 88
        Private Const LOGPIXELSY As Integer = 90
        Private Const PHYSICALOFFSETX As Integer = 112
        Private Const PHYSICALOFFSETY As Integer = 113
     
            'on récupere les marges physiques de l'imprimante
            Dim hdc As IntPtr = e.Graphics.GetHdc
            dpiX = GetDeviceCaps(hdc, LOGPIXELSX)      'résolution horizontale
            dpiY = GetDeviceCaps(hdc, LOGPIXELSY)      'résolution verticale
            marge_physique_gauche = (GetDeviceCaps(hdc, PHYSICALOFFSETX)) / dpiX * 100
            marge_physique_haute = (GetDeviceCaps(hdc, PHYSICALOFFSETY)) / dpiY * 100
            e.Graphics.ReleaseHdc(hdc)
    Cependant, pour m'assurer que la position d'un rectangle hypothétique que je veux placer dans le coin supérieur gauche de ma page soit exactement au même endroit peu importe l'imprimante et sa résolution...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(??,??,<la largeur>,<la hauteur>)
    ...je cherche un algo permettant de calculer un point X,Y de départ qui ne «bougera» pas selon que je l'imprime sur un périphérique gérant une résolution de 1200x1200 dpi ou sur une imprimante à jet d'encre à 360x260 dpi. Quelqu'un a-t-il une idée?

    Merci!
    Anne, citoyenne canadienne
    Informaticienne, altiste et radioamateur... bref, originale
    Lire les règles...
    Un petit rappel: Je ne réponds à aucune question technique posée par MP

  2. #2
    Membre éprouvé
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Par défaut
    Entretemps, je me suis rappelé qu'il est possible de définir des marges fixes avec l'option...

    OriginAtMargins = True
    ...dans les propriétés de mon PrintDocument.

    J'ai donc essayé ceci en mettant en commentaires les lignes pour l'obtention des marges physiques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Try
     
                Dim marges As New Printing.Margins(100, 100, 100, 100)
                PrintDocument1.DefaultPageSettings.Margins = marges
                ' Crée une zone d'impression avec les marges définies ci-haut
     
                Dim rectangle As New Rectangle(0, 0, 400, 80)
                e.Graphics.FillRectangle(Brushes.Cyan, rectangle)
                e.Graphics.DrawRectangle(Pens.Cyan, rectangle)
     
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    Ce code fonctionne parfaitement, et à 1/32 près, j'obtiens une marge uniforme quelle que soit l'imprimante que j'utilise. Cependant, en changeant la ligne Dim marges As New Printing.Margins(100, 100, 100, 100) pour Dim marges As New Printing.Margins(0, 0, 0, 0) (c'est-à-dire des zéros partout), bizarrement mon rectangle s'imprime dans une marge de 2,5 cm de hauteur et 2,5 cm de hauteur, et ce peu importe l'imprimante que j'ai utilisée.

    Normalement, je devrais avoir mon rectangle très près du coin supérieur gauche de ma page, je n'arrive pas à trouver pourquoi. Faut-il réinitialiser les DefaultSettings?
    Anne, citoyenne canadienne
    Informaticienne, altiste et radioamateur... bref, originale
    Lire les règles...
    Un petit rappel: Je ne réponds à aucune question technique posée par MP

  3. #3
    Membre éprouvé
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Par défaut
    J'ai modifié le code de réglage des marges de mon document avec cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    PrintDocument1.PrinterSettings.DefaultPageSettings.Margins = New Printing.Margins(0, 0, 0, 0)
    Mais j'obtiens toujours mon rectangle imprmé avec des marges de 2.5 cm. (1 pouce)

    C'est peut-être pas le bon réglage, encore... Quelqu'un a-t-il une idée???
    Anne, citoyenne canadienne
    Informaticienne, altiste et radioamateur... bref, originale
    Lire les règles...
    Un petit rappel: Je ne réponds à aucune question technique posée par MP

  4. #4
    Membre éprouvé
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Par défaut
    Je crois avoir trouvé une solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
        ' Déclaration des variables
        Dim marge_physique_gauche As Integer
        Dim marge_physique_haute As Integer
        Dim dpiX As Integer
        Dim dpiY As Integer
     
        'API de lecture des capacités de l'imprimante
        Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As IntPtr, ByVal capIndex As Int32) As Int32
     
        Private Const LOGPIXELSX As Integer = 88
        Private Const LOGPIXELSY As Integer = 90
        Private Const PHYSICALOFFSETX As Integer = 112
        Private Const PHYSICALOFFSETY As Integer = 113
     
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
     
            ' Objectif: faire en sorte que ces marges corrigées, calculées
            ' avec les valeurs renvoyées par l'API Windows, soient les mêmes
            ' peu importe l'imprimante.
            Try
     
                'on récupere les marges physiques de l'imprimante
                Dim hdc As IntPtr = e.Graphics.GetHdc
                dpiX = GetDeviceCaps(hdc, LOGPIXELSX)      'résolution horizontale
                dpiY = GetDeviceCaps(hdc, LOGPIXELSY)      'résolution verticale
                marge_physique_gauche = CInt((GetDeviceCaps(hdc, PHYSICALOFFSETX)) / dpiX * 100)
                marge_physique_haute = CInt((GetDeviceCaps(hdc, PHYSICALOFFSETY)) / dpiY * 100)
                e.Graphics.ReleaseHdc(hdc)
     
                Dim reference As Integer = 20
                ' Marge de référence qui, espérons-le, permet de corriger
                ' l'impression sur tout (valeur à ajuster en fonction des tests)
                Dim tempX, tempY As Integer
                If marge_physique_gauche < reference Then
                    tempX = marge_physique_gauche + (reference - marge_physique_gauche)
                Else
                    tempX = reference
                End If
                If marge_physique_haute < reference Then
                    tempY = marge_physique_haute + (reference - marge_physique_haute)
                Else
                    tempY = reference
                End If
                Dim rectangle As New Rectangle(tempX, tempY, 400, 80)
                e.Graphics.FillRectangle(Brushes.Magenta, rectangle)
                e.Graphics.DrawRectangle(Pens.Magenta, rectangle)
                ' Dessine un rectangle de couleur magenta dans le coin supérieur gauche de la feuille
     
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    End Class
    Il ne me reste qu'à optimiser le tout - je suis sûre qu'il y a du code en trop... Qu'en dites-vous?
    Anne, citoyenne canadienne
    Informaticienne, altiste et radioamateur... bref, originale
    Lire les règles...
    Un petit rappel: Je ne réponds à aucune question technique posée par MP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 19
    Dernier message: 09/04/2014, 09h11
  2. Réponses: 11
    Dernier message: 06/12/2005, 08h23
  3. [Afficher une image] Comment afficher une impression écran ?
    Par mnina dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 10/11/2005, 10h30
  4. Updater une base en mettant une date identique
    Par HULK dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/10/2005, 17h05
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo