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

Vos contributions VB6 Discussion :

Positionnement et taille du texte à l'impression [En attente]


Sujet :

Vos contributions VB6

  1. #1
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 936
    Points : 1 285
    Points
    1 285
    Par défaut Positionnement et taille du texte à l'impression
    Bonjour à tous,

    Mon problème concerne mon logiciel de CAO CiDess, programmé en Visual Basic 5 SP3.

    Ce logiciel permet de dessiner des circuits imprimés; ceux-ci sont ensuite imprimés sur du papier spécial pour réaliser des cartes électroniques par photogravure. Pour la prochaine version que je suis en train de terminer, j'ai ajouté la possibilité pour l'utilisateur d'insérer du texte parmi les composants et les pistes.

    J'ai rencontré pas mal de soucis mais j'ai réussi à faire quasiment tout ce que je voulais (hormis la possibilité de retourner le texte comme dans un miroir).

    Il me reste cependant un gros problème que je ne suis pas arrivé à résoudre au bout de plusieurs jours d'essais et de recherches : lors de l'impression du texte, le positionnement du texte et la taille du texte ne correspondent pas, il y a un décalage entre le circuit imprimé dessiné à l'écran et celui imprimé.

    Ce qui est étrange est que tous les autres éléments graphiques sont imprimés correctement, à la bonne place et à la bonne échelle. Le WYSIWYG fonctionne sauf pour le texte.

    Voici une copie d'écran suivie d'un scan d'une page imprimée :





    A des fins de débuggage, j'ai ajouté dans le code du dessin et de l'impression du texte le traçage :
    - d'un rectangle correspondant à la position et à la taille calculée via .TextWidth et .TextHeight,
    - d'une croix fine bleue correspondant au centre du texte
    - d'une croix fine rouge correspondant au début du texte (top left)
    - d'une croix noire faite avec des pistes coïncidant à l'écran à la croix fine bleue
    - d'une croix noire faite avec des pistes coïncidant à l'écran à la croix fine rouge
    on constate que le condensateur, le circuit intégré et les pistes sont au bon endroit, mais pas le texte.

    Voici le code source en question :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
        Option Explicit
     
        Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
        Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
        Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
        Private Const LF_FACESIZE = 32
        Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal lpString As String, ByVal nCount As Long) As Long ' or Boolean
        Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As TEXTSIZE) As Long
     
        Private Type TEXTSIZE
            X As Long
            Y As Long
        End Type
     
        Private Type LOGFONT
            lfHeight As Long
            lfWidth As Long
            lfEscapement As Long
            lfOrientation As Long
            lfWeight As Long
            lfItalic As Byte
            lfUnderline As Byte
            lfStrikeOut As Byte
            lfCharSet As Byte
            lfOutPrecision As Byte
            lfClipPrecision As Byte
            lfQuality As Byte
            lfPitchAndFamily As Byte
            lfFaceName As String * LF_FACESIZE
        End Type
     
        'Position du texte :
        Public X As Integer, Y As Integer
        Public Angle As Integer
        Public Split As Boolean
        Public Face As Integer
     
        ' Signification particuliere de Face et Split pour le texte :
        '
        ' Split = False
        ' Face = 1 : Texte en CU1, lisible quand on regarde le côté cuivre 1
        ' Face = 2 : Texte en CU2, lisible quand on regarde le côté cuivre 2
        ' Face = 3 : Texte en CU1 et CU2, lisible quand on regarde chaque côté
        '
        ' Split = True
        ' Face = 1 : Texte en CU1, lisible par transparence quand on regarde de l'autre côté
        ' Face = 2 : Texte en CU2, lisible par transparence quand on regarde de l'autre côté
        ' Face = 3 : Texte en CU1 et CU2, lisible quand on regarde chaque côté (idem split = false)
     
        'Texte :
        Public Valeur As String
     
        'Mode de texte :
        Public Lien As Integer
     
        'Police de caractère :
        Public FName As String
        Public FSize As Single
        Public FBold As Boolean
        Public FItalic As Boolean
        Public FStrikethru As Boolean
        Public FUnderline As Boolean
        Public FTransparent As Boolean
     
        'Vrai si l'objet est sélectionné :
        Public Selected As Boolean
     
    Public Sub Dess(Ctrl, Couleurs() As Long, Layers() As Boolean, Echelle As Single, BarreX As Integer, BarreY As Integer, XAmin As Integer, YAmin As Integer, XAmax As Integer, YAmax As Integer)
        Dim CoulNoire As Long
        Dim Retourne As Boolean
        Dim TxtH As Integer
        Dim TxtW As Integer
        Dim TempX1 As Integer, TempY1 As Integer
        Dim TempX2 As Integer, TempY2 As Integer
        Dim TempX3 As Integer, TempY3 As Integer
        Dim TempX4 As Integer, TempY4 As Integer
        Dim COSS As Single
        Dim SINS As Single
        Dim SX As Integer, SY As Integer
        '---------
        Dim font As LOGFONT
        Dim prevFont As Long
        Dim hFont As Long
        Dim ret As Long
        '---------
     
        Select Case Face
        Case 3:
            Retourne = False
            CoulNoire = Couleurs(4) 'CU1 et CU2
        Case 2:
            Retourne = False
            CoulNoire = Couleurs(1)    'CU2
        Case 1:
            Retourne = True
            CoulNoire = Couleurs(0)    'CU1
        End Select
     
        'MISE A JOUR DE VALEUR :
        If Lien = 0 Then Valeur = Data_Auteur
        If Lien = 1 Then Valeur = Data_Mail
        If Lien = 2 Then Valeur = Data_Organisation
        If Lien = 3 Then Valeur = Data_Siteweb
        If Lien = 4 Then Valeur = Data_Projet
        If Lien = 5 Then Valeur = Data_Carte
        If Lien = 6 Then Valeur = Data_Date
        If Lien = 7 Then Valeur = Data_Version
     
        'MODIFICATION : FSIZE est maintenant en pixels
     
        If (Face = 1 And Layers(0)) Or (Face = 2 And Layers(1)) Or (Face = 3 And (Layers(0) Or Layers(1))) Then
            'Calcul de la taille du texte :
            Ctrl.FillColor = CoulNoire
            Ctrl.ForeColor = CoulNoire
            'En règle générale, vous devrez modifier la propriété FontName avant de définir les
            'attributs de taille et de style à l’aide des propriétés FontSize, FontBold, FontItalic,
            'FontStrikethru et FontUnderline. Toutefois, si vous affectez aux polices TrueType une
            'taille inférieure à 8 points, vous devrez commencer par définir la taille à l’aide de la
            'propriété FontSize, puis définir la propriété FontName, et enfin redéfinir la taille à
            'l’aide de la propriété FontSize. En effet, l’environnement Microsoft Windows utilise une
            'police différente pour les polices TrueType dont la taille est inférieure à 8 points.
            '1 point de police = 1/72ième de pouce
     
            'FSize est en "pixels écran" :
            Ctrl.FontSize = FSize * Echelle * Screen.TwipsPerPixelY / (20 * CoefZoom1N)
            Ctrl.FontName = FName
            Ctrl.FontBold = FBold
            Ctrl.FontItalic = FItalic
            Ctrl.FontStrikethru = FStrikethru
            Ctrl.FontUnderline = FUnderline
            Ctrl.FontTransparent = FTransparent
            Ctrl.FontSize = FSize * Echelle * Screen.TwipsPerPixelY / (20 * CoefZoom1N)
            Debug.Print "Textecuivre " & Chr$(34) & Valeur & Chr$(34) & " " & Format(FSize) & "pixels -> " & Format(Ctrl.FontSize) & "points = " & Format(FSize * Echelle * Screen.TwipsPerPixelY / (20 * CoefZoom1N))
            TxtW = Ctrl.TextWidth(Valeur)
            TxtH = Ctrl.TextHeight(Valeur)
            SX = TxtW / (2 * Echelle)
            SY = TxtH / (2 * Echelle)
            'Calcul des coordonnées :
            COSS = Cos(-Angle * 1.74532925199433E-02)
            SINS = Sin(-Angle * 1.74532925199433E-02)
            TempX1 = X - SX * COSS + SY * SINS
            TempY1 = Y - SX * SINS - SY * COSS
            TempX2 = X + SX * COSS + SY * SINS
            TempY2 = Y + SX * SINS - SY * COSS
            TempX3 = X - SX * COSS - SY * SINS
            TempY3 = Y - SX * SINS + SY * COSS
            TempX4 = X + SX * COSS - SY * SINS
            TempY4 = Y + SX * SINS + SY * COSS
            If Ctrl.DrawMode = 13 Then
                '---------
                ' Windows expects the font size to be in pixels and to be negative if you are specifying the character height you want.
                font.lfHeight = -FSize * Echelle / CoefZoom1N
                Debug.Print " -> " & Format(font.lfHeight) & "pixels" & vbCrLf
                'font.lfWidth
                font.lfEscapement = Angle * 10
                font.lfOrientation = Angle * 10
                If FBold Then
                    font.lfWeight = 700
                Else
                    font.lfWeight = 400
                End If
                font.lfItalic = FItalic
                font.lfUnderline = FUnderline
                font.lfStrikeOut = FStrikethru
                'font.lfCharSet
                'font.lfOutPrecision
                'font.lfClipPrecision
                'font.lfQuality
                'font.lfPitchAndFamily
                font.lfFaceName = FName & Chr$(0)
                hFont = CreateFontIndirect(font)
                prevFont = SelectObject(Ctrl.hdc, hFont)
                '---------
                Ctrl.CurrentX = (TempX1 - BarreX) * Echelle
                Ctrl.CurrentY = (TempY1 - BarreY) * Echelle
                Ctrl.FontTransparent = FTransparent
                Ctrl.Print Valeur
                '---------
                ' Clean up by restoring original font.
                ret = SelectObject(Ctrl.hdc, prevFont)
                ret = DeleteObject(hFont)
                '---------
                '******************* A DES FINS DE MISE AU POINT *******************
                'Affichage du rectangle de sélection :
                Ctrl.Line ((TempX2 - BarreX) * Echelle, (TempY2 - BarreY) * Echelle)-((TempX1 - BarreX) * Echelle, (TempY1 - BarreY) * Echelle)
                Ctrl.Line ((TempX1 - BarreX) * Echelle, (TempY1 - BarreY) * Echelle)-((TempX3 - BarreX) * Echelle, (TempY3 - BarreY) * Echelle)
                Ctrl.Line ((TempX4 - BarreX) * Echelle, (TempY4 - BarreY) * Echelle)-((TempX2 - BarreX) * Echelle, (TempY2 - BarreY) * Echelle)
                Ctrl.Line ((TempX3 - BarreX) * Echelle, (TempY3 - BarreY) * Echelle)-((TempX4 - BarreX) * Echelle, (TempY4 - BarreY) * Echelle)
                'Affichage de CurrentX et CurrentY :
                Ctrl.FillColor = RGB(255, 50, 50)
                Ctrl.ForeColor = RGB(255, 50, 50)
                SX = 20
                Ctrl.Line ((TempX1 - BarreX) * Echelle + SX, (TempY1 - BarreY) * Echelle)-((TempX1 - BarreX) * Echelle - SX, (TempY1 - BarreY) * Echelle)
                Ctrl.Line ((TempX1 - BarreX) * Echelle, (TempY1 - BarreY) * Echelle + SX)-((TempX1 - BarreX) * Echelle, (TempY1 - BarreY) * Echelle - SX)
                'Affichage de X et Y :
                Ctrl.FillColor = RGB(50, 50, 255)
                Ctrl.ForeColor = RGB(50, 50, 255)
                Ctrl.Line ((X - BarreX) * Echelle + SX, (Y - BarreY) * Echelle)-((X - BarreX) * Echelle - SX, (Y - BarreY) * Echelle)
                Ctrl.Line ((X - BarreX) * Echelle, (Y - BarreY) * Echelle + SX)-((X - BarreX) * Echelle, (Y - BarreY) * Echelle - SX)
                '*******************************************************************
            Else
                'Il faut gérer le pb du draw mode avec le texte pour localiser le texte lors de l'édition :
                Ctrl.Line ((TempX2 - BarreX) * Echelle, (TempY2 - BarreY) * Echelle)-((TempX1 - BarreX) * Echelle, (TempY1 - BarreY) * Echelle)
                Ctrl.Line ((TempX1 - BarreX) * Echelle, (TempY1 - BarreY) * Echelle)-((TempX3 - BarreX) * Echelle, (TempY3 - BarreY) * Echelle)
                Ctrl.Line ((TempX4 - BarreX) * Echelle, (TempY4 - BarreY) * Echelle)-((TempX2 - BarreX) * Echelle, (TempY2 - BarreY) * Echelle)
                Ctrl.Line ((TempX3 - BarreX) * Echelle, (TempY3 - BarreY) * Echelle)-((TempX4 - BarreX) * Echelle, (TempY4 - BarreY) * Echelle)
            End If
        End If
    End Sub
     
    Public Sub Trace(Ctrl, Couleurs() As Long, Layers() As Boolean, Echelle As Double, DecalageX As Double, DecalageY As Double)
        'Ctrl est le contrôle où tracer le composant
        '
        'Couleurs(0) est la couleur du layer CU1
        'Couleurs(1) est la couleur du layer CU2
        'Couleurs(2) est la couleur du layer SOL
        'Couleurs(3) est la couleur du layer TXT
        'Couleurs(4) est la couleur du layer CU1&2
        '
        'Layers(0) est vrai si on doit tracer le layer CU1
        'Layers(1) est vrai si on doit tracer le layer CU2
        'Layers(2) est vrai si on doit tracer le layer SOL
        'Layers(3) est vrai si on doit tracer le layer TXT
        '
        'Les coordonnées graphiques sont :
        '(X * Echelle + DecalageX, Y * Echelle + DecalageY)
     
        Dim CoulNoire As Long
        Dim cpt As Integer
        Dim cx As Integer, cy As Integer
        Dim Hyp As Single
        Dim Retourne As Boolean
        Dim TxtH As Double
        Dim TxtW As Double
        Dim TempX1 As Integer, TempY1 As Integer
        Dim TempX3 As Integer, TempY3 As Integer
        Dim TempX4 As Integer, TempY4 As Integer
        Dim TempX5 As Integer, TempY5 As Integer
        Dim TempX2 As Long, TempY2 As Long
        Dim COSS As Single
        Dim SINS As Single
        Dim SX As Integer, SY As Integer
        Dim FSizeImpr As Integer 'FSize en pixels imprimante
        '---------
        Dim font As LOGFONT
        Dim prevFont As Long
        Dim hFont As Long
        Dim ret As Long
        Dim PrinterHDC As Long
        Dim TPP
        '---------
     
        Select Case Face
        Case 3:
            Retourne = False
            CoulNoire = Couleurs(4) 'CU1 et CU2
        Case 2:
            Retourne = False
            CoulNoire = Couleurs(1)    'CU2
        Case 1:
            Retourne = True
            CoulNoire = Couleurs(0)    'CU1
        End Select
        '
        'MISE A JOUR DE VALEUR :
        If Lien = 0 Then Valeur = Data_Auteur
        If Lien = 1 Then Valeur = Data_Mail
        If Lien = 2 Then Valeur = Data_Organisation
        If Lien = 3 Then Valeur = Data_Siteweb
        If Lien = 4 Then Valeur = Data_Projet
        If Lien = 5 Then Valeur = Data_Carte
        If Lien = 6 Then Valeur = Data_Date
        If Lien = 7 Then Valeur = Data_Version
        '
        If (Face = 1 And Layers(0)) Or (Face = 2 And Layers(1)) Or (Face = 3 And (Layers(0) Or Layers(1))) Then
            FSizeImpr = FSize * Screen.TwipsPerPixelY / Ctrl.TwipsPerPixelY
            '
            Ctrl.FillColor = CoulNoire
            Ctrl.ForeColor = CoulNoire
            'FSizeImpr est en pixels imprimante :
            Ctrl.FontSize = FSizeImpr * 50 * Echelle * Ctrl.TwipsPerPixelY
            '             = FSizeImpr * 1000 * Echelle * Ctrl.TwipsPerPixelY / 20
            Ctrl.FontName = FName
            Ctrl.FontBold = FBold
            Ctrl.FontItalic = FItalic
            Ctrl.FontStrikethru = FStrikethru
            Ctrl.FontUnderline = FUnderline
            Ctrl.FontTransparent = FTransparent
            Ctrl.FontSize = FSizeImpr * 50 * Echelle * Ctrl.TwipsPerPixelY
            Debug.Print "Textecuivre " & Chr$(34) & Valeur & Chr$(34) & " " & Format(FSize) & "pixels ecran -> " & Format(FSizeImpr) & "pixels imprimante -> " & Format(Ctrl.FontSize) & " = " & Format(FSizeImpr * 50 * Echelle * Ctrl.TwipsPerPixelY)
            TPP = Ctrl.TwipsPerPixelY
            Ctrl.Print ""
            TxtW = Ctrl.TextWidth(Valeur) 'En pouces imprimés
            TxtH = Ctrl.TextHeight(Valeur) 'En pouces imprimés
            SX = TxtW / (2 * Echelle) 'Rayon selon X en unités
            SY = TxtH / (2 * Echelle) 'Rayon selon Y en unités
            'Calcul des coordonnées :
            COSS = Cos(-Angle * 1.74532925199433E-02)
            SINS = Sin(-Angle * 1.74532925199433E-02)
            TempX1 = X - SX * COSS + SY * SINS
            TempY1 = Y - SX * SINS - SY * COSS
            TempX5 = X + SX * COSS + SY * SINS
            TempY5 = Y + SX * SINS - SY * COSS
            TempX3 = X - SX * COSS - SY * SINS
            TempY3 = Y - SX * SINS + SY * COSS
            TempX4 = X + SX * COSS - SY * SINS
            TempY4 = Y + SX * SINS + SY * COSS
            'Echelle = 0,001 pour une échelle d'impression de 100%
            'COORDONNEES EN POUCE (PRINTER.SCALEMODE = 5) :
            '   Ctrl.CurrentX = DecalageX + TempX1 * Echelle
            '   Ctrl.CurrentY = DecalageY + TempY1 * Echelle
            'L'API RECLAME DES COORDONNEES EN PIXEL :
            '   NB: Il y a 1440 Twips par pouce
            '   X.Pixels = X.Pouces * 1440 / TwipsPerPixel
            TempX2 = (DecalageX + TempX1 * Echelle) * 1400 / Ctrl.TwipsPerPixelX
            TempY2 = (DecalageY + TempY1 * Echelle) * 1400 / Ctrl.TwipsPerPixelY
     
            '----------------- Impression du texte avec les API ---------------------
            'On ne doit plus utiliser l'objet "Printer", il faut passer par le HDC de l'imprimante :
            PrinterHDC = Printer.hdc 'Ctrl.hdc
            'Initialisation de la police de caractère inclinée :
            'Windows expects the font size to be in pixels and to be negative if you are specifying the character height you want.
            font.lfHeight = FSizeImpr * (1000 * Echelle)
            Debug.Print " -> " & Format(font.lfHeight) & "pixels imprimante = " & Format(FSize * 1000 * Echelle) & vbCrLf
            'font.lfWidth
            font.lfEscapement = Angle * 10
            font.lfOrientation = Angle * 10
            If FBold Then
                font.lfWeight = 700
            Else
                font.lfWeight = 400
            End If
            font.lfItalic = FItalic
            font.lfUnderline = FUnderline
            font.lfStrikeOut = FStrikethru
            'font.lfCharSet
            'font.lfOutPrecision
            'font.lfClipPrecision
            'font.lfQuality
            'font.lfPitchAndFamily
            font.lfFaceName = FName & Chr$(0)
            '
            'Application de la police à l'imprimante :
            hFont = CreateFontIndirect(font)
            prevFont = SelectObject(PrinterHDC, hFont)
            '
            'Impression du texte :
            ret = TextOut(PrinterHDC, TempX2, TempY2, Valeur, Len(Valeur))
            '
            'Suppression de la police sur l'imprimante :
            ret = SelectObject(PrinterHDC, prevFont)
            ret = DeleteObject(hFont)
            '------------------------------------------------------------------------
     
            '******************* A DES FINS DE MISE AU POINT *******************
            'Les coordonnées graphiques sont :
            '(X * Echelle + DecalageX, Y * Echelle + DecalageY)
            'Affichage du rectangle de sélection :
            Ctrl.Line (TempX5 * Echelle + DecalageX, TempY5 * Echelle + DecalageY)-(TempX1 * Echelle + DecalageX, TempY1 * Echelle + DecalageY)
            Ctrl.Line (TempX1 * Echelle + DecalageX, TempY1 * Echelle + DecalageY)-(TempX3 * Echelle + DecalageX, TempY3 * Echelle + DecalageY)
            Ctrl.Line (TempX4 * Echelle + DecalageX, TempY4 * Echelle + DecalageY)-(TempX5 * Echelle + DecalageX, TempY5 * Echelle + DecalageY)
            Ctrl.Line (TempX3 * Echelle + DecalageX, TempY3 * Echelle + DecalageY)-(TempX4 * Echelle + DecalageX, TempY4 * Echelle + DecalageY)
            'Affichage de CurrentX et CurrentY :
            Ctrl.FillColor = RGB(255, 50, 50)
            Ctrl.ForeColor = RGB(255, 50, 50)
            Hyp = 0.1
            Ctrl.Line (TempX1 * Echelle + DecalageX + Hyp, TempY1 * Echelle + DecalageY)-(TempX1 * Echelle + DecalageX - Hyp, TempY1 * Echelle + DecalageY), RGB(255, 50, 50)
            Ctrl.Line (TempX1 * Echelle + DecalageX, TempY1 * Echelle + DecalageY + Hyp)-(TempX1 * Echelle + DecalageX, TempY1 * Echelle + DecalageY - Hyp), RGB(255, 50, 50)
            'Affichage de X et Y :
            Ctrl.FillColor = RGB(50, 50, 255)
            Ctrl.ForeColor = RGB(50, 50, 255)
            Ctrl.Line (X * Echelle + DecalageX + Hyp, Y * Echelle + DecalageY)-(X * Echelle + DecalageX - Hyp, Y * Echelle + DecalageY), RGB(50, 50, 255)
            Ctrl.Line (X * Echelle + DecalageX, Y * Echelle + DecalageY + Hyp)-(X * Echelle + DecalageX, Y * Echelle + DecalageY - Hyp), RGB(50, 50, 255)
            '*******************************************************************
        End If
    End Sub
    Remarque : CiDess est une grosse application (16 fichiers CLS, trois modules de code, 38 feuilles, taille totale 1,19Mo), je ne peux pas publier le code complet !

    La procédure Dess est celle utilisée pour le dessin à l'écran, la procédure Trace est celle correspondant à l'impression. J'ai pensé en premier lieu à une erreur de calcul, c'est pour cela que j'avais ajouté l'impression des croix et du rectangle, mais il s'avère que les formules sont justes (les autres éléments utilisent les mêmes formules et sont au bon endroit), le plus déroutant étant le fait que visiblement au niveau de l'impression TextWidth et TextHeight ne fonctionne pas !

    Remarque : j'ai finalement du me résoudre à définir la taille du texte en "pixels écrans", car je me suis rendu compte que windows adaptait la taille du texte pour qu'elle soit équivalente à un nombre ENTIER de pixels; par exemple, si je demande Ctrl.FontSize = 8, en fait Ctrl.FontSize vaux une autre valeur, comme 8,25. Avec l'imprimante, qui possède une résolution beaucoup plus élevée ce problème est quasi insignifiant puisque quand on demande Printer.FontSize = 8 on obtient une valeur 8,04. Même si cela peut paraître bizarre, pour éviter un décalage d'échelle de texte entre l'écran et l'imprimante, il est préférable de choisir une taille de texte correspondant à un nombre entier de pixels sur l'écran.

    J'espère que vous pourrez m'aider; si je ne trouve pas de solution, je compte abandonner les fonctions d'écriture de texte ayant recours à des polices de caractères pour implanter dans CiDess une "police de caractère" maison.

    A bientôt.
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    Les problèmes inhérents aux polices de caractères sont déjà assez complexes, y compris à l'écran (c'est même la raison essentielle des difficultés rencontrées en matière de redimensionnements d'une fenêtre et de ses contrôles pour correspondre à des résolutions différentes).

    Les polices destinées à une imprimante, par ailleurs, ne sont pas toutes les mêmes que celles destinées à un écran (elles sont en outre en général moins nombreuses). Il faut donc veiller à choisir une police commune pour l'écran et pour l'imprimante :

    Choisis en utilisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Command1_Click()
     
        Dim I
        For I = 0 To Printer.FontCount - 1
            List1.AddItem Printer.Fonts(I)
        Next I
     
        For I = 0 To Screen.FontCount - 1
            List2.AddItem Screen.Fonts(I)
        Next I
    End Sub
    Problème supplémentaire si ton appli doit être distribuée : les polices acceptées par l'imprimante dépendent de l'imprimante !!!

    Conseil :

    ajouter à ton appli un module qui, dès son démarrage :
    - fait un inventaire des polices de l'imprimante utilisée
    - cherche une police commune

    Le mieux (pour ne pas trop alourdir), est de rechercher dans un ordre préférentiel parmi les polices les plus utilisées...

    -------------------------------------------------------

    Pourquoi ne pas donner la préférence à l'impression, tout simplement, de ce que tu as dans ta picturebox (puisqu'elle ne contient apparemment que des dessins obtenus par la méthode Print). L'objet Printer acceptant la méthode PaintPicture, celà ne devrait pas poser de problème autre qu'une pixélisation (moins élégante qu'une impression directe) qui ne devrait pas être trop gênante pour un traçage.

    Bon courage.

  3. #3
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 936
    Points : 1 285
    Points
    1 285
    Par défaut SOLUTION
    Bonjour à tous,

    j'ai insisté... et j'ai trouvé

    voici un petit programme qui résout tous les problèmes d'impression de textes et de graphiques à l'écran et à l'imprimante :

    http://www.remylucas.fr/Test_Text.zip

    Ce programme servira de base à tout ceux qui veulent utiliser des fonctions graphiques et texte.

    Des textes et des rectangles sont en mémoire dans un système d'unité "spécial".
    Chaque texte ou rectangle est definit par sa taille, les coordonnées de son centre et un angle de rotation. Le texte est définit aussi par le nom de la police, gras, italique, ect...
    La transparence est correctement gérée par le programme aussi bien à l'écran qu'à l'impression.

    Le bouton Dess permet de dessiner les graphiques à l'écran dans une zone d'image. On peut également choisir un échelle pour l'affichage

    Le bouton Trace permet d'imprimer les graphiques sur l'imprimante de son choix. On peut également choisir un échelle pour l'impression.

    Voici un screenshot de la zone d'image :



    Voici un scan d'une impression papier :



    Toutes les proportions entre l'écran et l'imprimante sont indentiques, c'est ce que je voulais. Les tailles théoriques du texte ne sont pas respectées mais cela est transparent vis à vis de l'utilisateur, qui dessine quelque chose à l'écran et qui veux obtenir la même chose à l'imprimante.

    A bientôt.

    Edit : vous pouvez mettre ce source en téléchargement direct sur le site.
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

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

Discussions similaires

  1. [javascript][IE6] changement automatique taille du texte
    Par MatMeuh dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/12/2008, 12h05
  2. Réponses: 4
    Dernier message: 27/07/2006, 16h08
  3. [JTable] ajuster la taille d'une colonne à la taille du texte
    Par GETah dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 24/02/2005, 11h53
  4. Rotation de texte et impression
    Par rizom dans le forum Langage
    Réponses: 6
    Dernier message: 16/11/2004, 20h46
  5. taille du texte dans un viewport
    Par pitounette dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/07/2002, 12h06

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