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

VBA Access Discussion :

Région dans clGDI+


Sujet :

VBA Access

  1. #1
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 983
    Par défaut Région dans clGDI+
    Bonjour à tous,

    J'utilise la classe GDI+ pour afficher un fond de carte dans un contrôle image.

    Voici mon seuil d'incompétence:

    . Je souhaite effectuer un zoom sur la carte dans un rectangle dessiné à la souris: ce rectangle doit avoir des dimensions proportionnelles à mon contrôle image (MAJ Post: Ce point est OK)

    . Ensuite j'aimerais n'afficher dans le contrôle image que le rectangle sélectionné (sur l'evt MouseUp)

    . L'image dans l'objet oGDI doit donc déborder du cadre du contrôle image. Serait-il possible selon vous de déplacer cette image à la souris pour afficher (avec le zoom déterminé plus haut) d'autres régions de l'image?

    Je ne sais pas si je m'exprime bien, mais je suis à votre disposition pour tout éclaircissement,

    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    Alors oui c'est possible.
    Sur le principe, il faut :
    Créer une image principale de la taille du contrôle (CreateBitmapForControl).
    Charger le fond de carte en mémoire dans une image secondaire (ImgNew)
    Et à chaque rendu :
    Dessiner la portion souhaitée de l'image secondaire vers l'image principale (DrawImg)
    Dessiner tout le reste.
    Injecter l'image principale dans le contrôle (Repaint).

    Pour défiler à la souris, il "suffit" de gérer l'événement mouseMove et de dessiner avec un décalage.

    Pour ne pas s'y perdre, il faut bien structurer le code, avec une procédure de rendu qui sera appelée au besoin à chaque changement de zoom/déplacement.

  3. #3
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 983
    Par défaut Région dans clGDI+
    Bonjour à tous !

    @Arkham46 : Merci pour tes réponses !

    Grâce aux conseils prodigués, j'arrive à un résultat qui me convient, mais je pense qu'il serait bon de préciser le contexte.

    J'ai une base qui contient des artefacts archéologiques qui sont positionnés en mètres avec une précision au cm. Chacun de ces artefacts a des caractéristiques (classe, état, matière...) que je peux filtrer. Le but est de positionner ces artefacts sur une ou des cartes existantes toutes orientées au Nord dont je possède les infos de hauteur/largeur (mètres) et d'origine. Bien sûr la difficulté est les passages de mètres/pixels/twips en tenant compte du point 0 qui est en bas à gauche alors que l'origine de l'objet oGDI se trouve en haut à gauche.

    Sur choix d'une carte qui peut avoir des proportions différentes, je commence par:
    . Appliquer ces proportions au contrôle image (qui s'appelle Fond) (mode découpage)
    . Charger ce fichier dans oGDI
    . Dessiner les axes
    . Afficher les points
    . Sauver le fichier dans un fichier (via GDI+) (test.png à la taille du contrôle image) (donc plus petit et moins précis en résol)
    . Afficher le fichier dans le contrôle Fond

    Lorsque je veux faire un zoom, je dessine une région rectangulaire aux proportions du contrôle Fond (jusqu'ici tout va bien )

    Nom : RégionZoom.PNG
Affichages : 136
Taille : 244,1 Ko

    C'est là que çà se complique!

    Ce que je souhaiterais:
    . Charger en oGDI le fond de carte original (donc sans axes ni nuage de points) (Je pense m'en tirer)
    . Trouver la région dessinée par mon zoom (zone en rouge dans une région nommée "ZoomedRegion") (je pense pouvoir trouver après conversions des unités)
    . l'afficher dans mon contrôle Fond l'objet oGDI "débordant" de mon controle
    . redessiner les axes et le nuage de points (Ces deux derniers points pour conserver la taille des points du nuage)
    . Pouvoir sur un clic/déplacer souris, déplacer mon objet oGDI dans le contrôle image jusqu'aux bornes de l'objet oGDI.

    @Arkham46

    Je comprends ton raisonnement mais je ne sais pas l'appliquer: je maîtrise mal (malgré ton tuto et les exemples mdb) les notions d'images et de région d'un objet oGDI .

    Pour défiler à la souris, il "suffit" de gérer l'événement mouseMove et de dessiner avec un décalage.
    Qu'entends-tu par dessiner? Quelle est la méthode GDI+ à employer?

    Dessiner la portion souhaitée de l'image secondaire vers l'image principale (DrawImg)
    Dans le tuto dont je dispose, L'image est dessinée avec des ScrollBars, est-ce possible sans ? (d'où la question sur le déplacement "à la souris")

    Bien entendu, je ne demande à personne de faire mon boulot, mais des explications seraient les bienvenues.
    Cette classe oGDI est vraiment géniale, mais j'avoue que je navigue en eaux troubles...

  4. #4
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    Dans mon idée, on une procédure de rendu qui "dessine" en fonction de la taille cible, la taille source, le zoom, les positions...
    Et on injecte dans le contrôle le résultat final.

    J'ai l'impression que tu as un dessin "figé", donc difficile à rendre dynamique avec des zoom/déplacement.
    Difficile de donner des conseils sans avoir le code complet.

  5. #5
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 983
    Par défaut Région dans clGDI+
    Difficile de donner des conseils sans avoir le code complet
    C'est vrai mais j'ai dû signer une clause de confidentialité un peu "pointue" et j'en ai déjà trop dit !

    Dans mon idée, on une procédure de rendu qui "dessine" en fonction de la taille cible, la taille source, le zoom, les positions...
    Pourrais-tu me donner un exemple de la syntaxe requise?

    J'ai l'impression que tu as un dessin "figé"
    Si je comprends bien "figé", j'ai effectivement dans la première image (copie d'écran) chargé une copie du fond de carte mis aux cotes du contrôle image (appelé test.png).

    Maintenant, le but serait de charger une nouvelle image dans oGDI: la carte d'origine avec plus de résol, afficher la portion en rouge dans le contrôle, lui regénérer les axes, points... Et faire en sorte que je puisse me déplacer dedans, voire effectuer un autre zoom.

    Un "peu" de code quand même:
    Choix de la carte (liste déroulante):
    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
     
    Option Compare Database
    Option Explicit
     
    Private WithEvents oGdi As clGdiplus ' Classe pour utilisation de gdiplus
    ' Facteur de zoom
    Private gZoom As Single
    ' Ratio Largeur/hauteur
    Public RatioImg As Single
    Public leRatioW As Double, leRatioH As Double
    ' Coordonnées de sélection
    Private gX1 As Long, gY1 As Long
    Private gX2 As Long, gY2 As Long
     
    Public Sub FondCarte_AfterUpdate()
        Dim rep, chem As String
        chem = Dir(CurrentProject.Path & "\test.*")
     
        ' Libération de la classe au lancement de la fonction
        Set oGdi = Nothing
        'supprime le Fichier temporaire
        If chem <> "" Then Kill CurrentProject.Path & "\" & chem
        'Instanciation objet GDI
        Set oGdi = New clGdiplus
     
        'Redim origine ctl Fond & Détail
        Fond.Picture = ""
        txtZoom = 1
        Fond.Width = 14175: Fond.Height = 7369
        Me.Section("Détail").Height = 7937
     
        'Mise aux proportions du fond de carte & section détail
        rep = CSetProportions
        If EstOuvert("F_ParamCarto") = False Then
            DoCmd.MoveSize , 150, , Me.Section(0).Height + Me.Section(1).Height + Me.Section(2).Height + 2 + CM2Twips(1.5)
        End If
     
        'Dessine les axes sur le fond de carte
        CDrawAxes
     
        'Dessine les points (cercle)sur le fond de carte
        CDrawDots
     
        'Sauve le fichier tempo
        CSave
     
        'Charge le fichier tempo
        CRepaint
     
        'Affiche les commandes latérales
        ShowLatComs
    End Sub
     
    Function CSetProportions() As Boolean
        Dim laLargeur As Long, laHauteur As Long, HTDetail As Long, HTFond As Long, LGFond As Long, leRatioImgFic As Long
        Dim LGFondPx As Long, HTFondPx As Long, nbTwipsPerPix As Single
     
        CSetProportions = False
        If Nz(FondCarte, "") = "" Then
            MsgBox ("Fond de carte requis.")
            FondCarte.SetFocus
            FondCarte.Dropdown
            Exit Function
            Else
            CSetProportions = True
        End If
     
        'Chargement de l'image depuis le fichier
        oGdi.LoadFile (FondCarte.Column(1))
     
        ' Largeur en pixels de l'image
        laLargeur = oGdi.ImageWidth
     
        ' Hauteur en pixels de l'image
        laHauteur = oGdi.ImageHeight
     
        'Calcul des ratios pour redim contrôle Fond
        'x/l = H/L  => x = (H*l)/L
        HTFond = (laHauteur * Fond.Width) / laLargeur
        If HTFond > Me.Section("Détail").Height Then
            Me.Section("Détail").Height = HTFond + CM2Twips(1)
            Fond.Height = HTFond
            Else
            Fond.Height = HTFond
            Me.Section("Détail").Height = HTFond + CM2Twips(1)
        End If
     
        'Calcul des ratios pour redim image aux cotes du contrôle
     
        'ratio horizontal à appliquer à l'image pour affichage
        nbTwipsPerPix = GetTwipPerPix("X")
        LGFond = Fond.Width / nbTwipsPerPix
        leRatioW = LGFond / laLargeur
     
        'ratio vertical à appliquer à l'image pour affichage
        nbTwipsPerPix = GetTwipPerPix("Y")
        HTFond = Fond.Height / nbTwipsPerPix
        leRatioH = HTFond / laHauteur
        RatioImg = Forms!F_Carto!Fond.Height / Forms!F_Carto!Fond.Width
     
        'Mise à l'échelle de oGdi
        oGdi.ScaleI Round(leRatioW, 4), Round(leRatioH, 4)
     
    End Function
     
    Sub CDrawAxes()
        Dim LgImg As Long, HtImg As Long, Abs0 As String, Ord0 As String
        Dim coulMarge As Long, lgMarge As Long, coulUnit As Long, coulUnitSecondary As Long, Pas As Single, PasPix As Long
        Dim lgCarte As Long, htCarte As Long, origCarteX As Long, origCarteY As Long, cpt As Long, nbTwipsPerPix As Single
        Dim X As Long
        Dim HasGrille As String, HasSecGrille As String, coulGrille As Long, coulSecGrille As Long, tailleSecGrille As Single, tailleGrille As Single, transpSecGrille As Integer, transpGrille As Integer
     
     
        LgImg = oGdi.ImageWidth
        HtImg = oGdi.ImageHeight
        lgCarte = FondCarte.Column(2)
        htCarte = FondCarte.Column(3)
        Abs0 = FondCarte.Column(5)
        Ord0 = FondCarte.Column(6)
        Pas = 0
     
        lgMarge = CLng(Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Marge Carto'"), 50))
        coulMarge = CLng(Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Couleur marge Carto'"), vbYellow))
        coulUnit = Nz(CLng(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Couleur Unités grille'")), vbBlack)
        coulUnitSecondary = CLng(Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Couleur Unités grille secondaire'"), vbBlack))
        HasGrille = Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Grille Carto'"), "Oui")
        HasSecGrille = Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Grille Carto secondaire'"), "Oui")
        If HasGrille = "Oui" Then
            coulGrille = CLng(Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Grille Carto Couleur'"), 13553358))
            tailleGrille = CDec(Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Grille Carto Taille (1-10)'"), 2))
            transpGrille = CInt(Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Grille Carto Transparence (1-250)'"), 100))
        End If
        If HasSecGrille = "Oui" Then
            coulSecGrille = CLng(Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Grille Carto secondaire Couleur'"), 13553358))
            tailleSecGrille = CDec(Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Grille Carto secondaire Taille (1-10)'"), 13553358))
            transpSecGrille = CInt(Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Grille Carto secondaire Transparence (1-250)'"), 150))
        End If
     
        'Lissage
        oGdi.SmoothingMode = GdipSmoothingAntialias
     
        'Absysses
        oGdi.DrawLine 0, 0, 0, HtImg, coulMarge, lgMarge, , 150
        'Ordonnées
        oGdi.DrawLine 0, HtImg, LgImg, HtImg, coulMarge, lgMarge, , 150
        'Origine
        oGdi.DrawLine 0, HtImg, lgMarge, HtImg - lgMarge, coulUnit, 2
        'Coordonnées Origine depuis le point 0
        oGdi.DrawText Abs0, 12, "Arial", 25, HtImg - 10
        oGdi.DrawText Ord0, 12, "Arial", 20, HtImg - 28
     
     
        'Unités absisses
        Pas = LgImg / (CLng(lgCarte) - CLng(Abs0)) ' en Px (1Pas=1mètre)
        nbTwipsPerPix = GetTwipPerPix("X")
        cpt = 0
     
        For X = CLng(Abs0) To lgCarte
            If X Mod (50) = 0 Then
                If X = CLng(Abs0) Then GoTo SuivantX
                'Dessine une barre secondaire
                cpt = cpt + 1
                PasPix = Pas * cpt * 50
                oGdi.DrawLine PasPix, HtImg - (lgMarge / 2), PasPix, HtImg - (lgMarge / 2) - 2, coulUnitSecondary, 1
                'Affichage conditionnel de la grille secondaire
                 If HasSecGrille = "Oui" And X Mod (100) <> 0 Then
                    oGdi.DrawLine PasPix, 0, PasPix, HtImg - (lgMarge / 2), coulSecGrille, tailleSecGrille, GdipDashDASHDOTDOT, transpSecGrille
                End If
                'Barre principale
                If X Mod (100) = 0 Then
                    oGdi.DrawLine PasPix, HtImg - (lgMarge / 2) - 3, PasPix, HtImg - (lgMarge / 2) + 2, coulUnit, 1
                    oGdi.DrawText str(X), 10, "Arial", PasPix, HtImg - 8
                    'Affichage conditionnel de la grille principale
                     If HasGrille = "Oui" Then
                        oGdi.DrawLine PasPix, 0, PasPix, HtImg - (lgMarge / 2), coulGrille, tailleGrille, GdipDashDASH, transpGrille
                    End If
                End If
             End If
    SuivantX:
        Next X
     
        'Unités ordonnées
        Pas = HtImg / (CLng(htCarte) - CLng(Ord0)) ' en Px (1Pas=1mètre)
        nbTwipsPerPix = GetTwipPerPix("Y")
        cpt = 0
        'For x = htCarte To CLng(Ord0) Step -1
        For X = CLng(Ord0) To htCarte
            If X Mod (50) = 0 Then
                If X = CLng(Ord0) Then GoTo SuivantY
                'Dessine une barre secondaire
                cpt = cpt + 1
                PasPix = Pas * cpt * 50
                oGdi.DrawLine (lgMarge / 2) - 2, HtImg - PasPix, (lgMarge / 2) + 2, HtImg - PasPix, coulUnitSecondary, 1
                'Affichage conditionnel de la grille secondaire
                 If HasSecGrille = "Oui" And X Mod (100) <> 0 Then
                    oGdi.DrawLine (lgMarge / 2), HtImg - PasPix, LgImg, HtImg - PasPix, coulSecGrille, tailleSecGrille, GdipDashDASHDOTDOT, transpSecGrille
                End If
                'Barre principale
                If X Mod (100) = 0 Then
                    oGdi.DrawLine (lgMarge / 2) - 3, HtImg - PasPix, (lgMarge / 2) + 2, HtImg - PasPix, coulUnit, 1
                    'Affichage conditionnel de la grille principale
                     If HasGrille = "Oui" Then
                        oGdi.DrawLine (lgMarge / 2), HtImg - PasPix, LgImg, HtImg - PasPix, coulGrille, tailleGrille, GdipDashDASH, transpGrille
                    End If
                    oGdi.DrawText str(X), 10, "Arial", (lgMarge / 2) + 20, HtImg - PasPix
                End If
             End If
    SuivantY:
        Next X
     
    '   oGdi.DrawLine 0, 0, LgImg, HtImg, 255, 10, GdipDashDASH, 50
    '   oGdi.DrawLine 0, HtImg, LgImg, 0, 65280, 10, GdipDashDASHDOTDOT, 50
     
     
     
        Fin:
    End Sub
     
    Sub CDrawDots()
        Dim rst As Recordset, strSQL As String, PasX As Single, PasY As Single
        Dim LgImg As Long, HtImg As Long, Abs0 As String, Ord0 As String, lgCarte As Long, htCarte As Long
        Dim CoordX As Long, CoordY As Long, HasCoord As String, coordTaille As Long, ptsTaille As Long
     
        LgImg = oGdi.ImageWidth
        HtImg = oGdi.ImageHeight
        lgCarte = FondCarte.Column(2)
        htCarte = FondCarte.Column(3)
        Abs0 = FondCarte.Column(5)
        Ord0 = FondCarte.Column(6)
        PasX = 0: PasY = 0
     
        'Affichage des coordonnées
        ptsTaille = Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Points Taille'"), "Oui")
        HasCoord = Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Points coordonnées'"), "Oui")
        If HasCoord = "Oui" Then
            coordTaille = Nz(DLookup("CPAValeur", "T_ParamCarto", "CPAFonction='Points Taille Police'"), "Oui")
        End If
        'Unités absisses
        PasX = LgImg / (CLng(lgCarte) - CLng(Abs0)) ' en Px (1Pas=1mètre)
     
        'Unités ordonnées
        PasY = HtImg / (CLng(htCarte) - CLng(Ord0)) ' en Px (1Pas=1mètre)
     
        'Lissage
        oGdi.SmoothingMode = GdipSmoothingAntialias
     
        'Parcours des artefacts filtrés
        strSQL = "Rq_Localisation"
     
        Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
     
        With rst
            Do While .EOF = False
                CoordX = (!XLR - CDec(Abs0)) * PasX
                CoordY = HtImg - (!YLR - CDec(Ord0)) * PasY
     
                oGdi.DrawEllipse CoordX, CoordY, ptsTaille, ptsTaille, TypeEllipseCenter, Nz(!CLACol, 0), vbBlue, 1
                If HasCoord = "Oui" Then oGdi.DrawText "[" & !XLR & ";" & !YLR & "]", coordTaille, "Arial", CoordX, CoordY + 8
                .MoveNext
            Loop
            .Close
        End With
        Set rst = Nothing
    End Sub
     
    Sub CSave()
        'sauve
        oGdi.SaveFile (oGdi.ApplicationPath & "test.png")
    End Sub
     
    Sub CRepaint()
        ' Libération de la classe
        Set oGdi = Nothing
        'Instanciation objet GDI
        Set oGdi = New clGdiplus
     
        'Chargement de l'image depuis le fichier test.png
        oGdi.LoadFile (oGdi.ApplicationPath & "test.png")
     
        'Affichage ds la contrôle Fond
        oGdi.RepaintNoFormRepaint Me.Fond
     
        Me.Repaint
    End Sub
     
    Sub ShowLatComs()
        'cdes zoom
        Commande9.Visible = False
        txtZoom = 1: txtZoom.Visible = False
        Commande10.Visible = False
        XLR.Visible = True: YLR.Visible = True
        ZoomOn.Visible = True
    End Sub
     
    Private Sub Fond_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If ZoomOn = True And Shift = 1 Then
            Zooming = True
            gX1 = oGdi.CtrlToImgX(X, Me.Fond)
            gY1 = oGdi.CtrlToImgY(Y, Me.Fond)
            ZoomFromX = Twips2CoordsX(X)
            ZoomFromY = Twips2CoordsY(Y)
        End If
    End Sub
     
    Private Sub Fond_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim rep, RatioImg As Single
     
        If Nz(FondCarte, "") = "" Then Exit Sub
     
        rep = Dir(CurrentProject.Path & "\test.*")
        If rep = "" Then Exit Sub
        'Affichage coordonnées / carte
        XLR = Twips2CoordsX(X)
        YLR = Twips2CoordsY(Y)
        'si ZoomOn dessin rectangle
        RatioImg = Fond.Height / Fond.Width
        If ZoomOn = True And Shift = 1 And Zooming = True Then
            gX2 = oGdi.CtrlToImgX(X, Me.Fond)
            gY2 = gY1 + ((gX2 - gX1) * RatioImg)  'oGdi.CtrlToImgY(Y, Me.Fond)
            Render
            oGdi.RepaintFast Me.Fond
        End If
    End Sub
     
    Private Sub Fond_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim RatioImg As Single
        If ZoomOn And Shift = 1 Then
            'Dessine le rectangle de Zoom aux proportions du ctl Fond
            RatioImg = Fond.Height / Fond.Width
            ZoomToX = Twips2CoordsX(X * leRatioW)
            ZoomToY = Twips2CoordsY(Y * leRatioH)
            gX2 = oGdi.CtrlToImgX(X, Me.Fond)
            gY2 = oGdi.CtrlToImgY(Y, Me.Fond)
            gY2 = gY1 + ((gX2 - gX1) * RatioImg)
            Render
            oGdi.RepaintNoFormRepaint Me.Fond
            Zooming = False
            RectFromX = gX1: RectFromY = gY1
            RectToX = gX2: RectToY = gY2
            'Affiche la région zommée dans Fond
            LoadZoom
        End If
    End Sub
     
    Sub LoadZoom()
        Dim CoordImgX1 As Long, CoordImgY1 As Long, CoordImgX2 As Long, CoordImgY2 As Long
        Stop
    End Sub
    J'en suis à la dernière procédure qui applique le zoom qui devrait, comme mentionné plus haut: charger une nouvelle image dans oGDI: la carte d'origine avec plus de résol, afficher la portion en rouge dans le contrôle, lui regénérer les axes, points... Et faire en sorte que je puisse me déplacer dedans sans avoir à lui appliquer des ScrollBars (déplacement "à la souris"), voire effectuer un autre zoom.

  6. #6
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 983
    Par défaut Région dans clGDI+
    Okay, je reviens sur ma saga "Zoom" d'un objet GDI+.

    Dans mon post précédant, j'ai présenté ma démarche qui semble convenir jusqu'à l'étape de la sélection d'une région à zoomer.

    Le zoom est déclenché par l'appui sur la le bouton-poussoir "loupe" et une sélection d'une région avec appui simultané de la touche shift.

    Sur le "MouseUp" (fin de sélection) je finis par appeler la procédure LoadZoom qui me pose problème:

    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
    Sub LoadZoom()
        Dim CoordImgX1 As Long, CoordImgY1 As Long, CoordImgX2 As Long, CoordImgY2 As Long, leRatioImgW As Double, leRatioImgH As Double
     
        'Vide le contrôle Fond
        oGdi.FillColor vbWhite
        oGdi.RepaintNoFormRepaint Me.Fond
     
        ' Libération de la classe au lancement de la fonction
        Set oGdi = Nothing
     
        'Instanciation objet GDI
        Set oGdi = New clGdiplus
        'Chargement de l'image depuis le fichier
        oGdi.LoadFile (FondCarte.Column(1))
     
        ' Charge le fichier image dans l'image secondaire
        With oGdi.ImgNew("CarteOrig")
            .LoadFile FondCarte.Column(1)
        End With
     
        'Dessine l'image
        'Mise "au ratio" des coordonnées de la sélection sur la nouvelle image (question: comment récupérer les coord de la région?)
        CoordImgX1 = gX1 / leRatioW: CoordImgY1 = gY1 / leRatioH
        CoordImgX2 = gX2 / leRatioW: CoordImgY2 = gY2 / leRatioH
        leRatioImgW = leRatioW  '(CoordImgX2 - CoordImgX1) / oGdi.ImageWidth / leRatioW
        leRatioImgH = leRatioH  '(CoordImgY2 - CoordImgY1) / oGdi.ImageHeight / leRatioH
        'sauve
        oGdi.SaveFile (oGdi.ApplicationPath & "testZoom.png")
     
        'Sauve l'image
        oGdi.WorldPush
        'Mise à l'échelle de la portion zoomée
        oGdi.WorldScale Round(leRatioImgW, 4), Round(leRatioImgH, 4)
        oGdi.WorldPush
        oGdi.WorldTranslate (-1) * (CoordImgX1), (-1) * (CoordImgY1), True
        ' oGdi.WorldTranslate (-1) * (CoordImgX1) * Round(leRatioImgW, 4), (-1) * (CoordImgY1) * Round(leRatioImgW, 4), True
        'Dessine l'image
        oGdi.DrawImg "CarteOrig", 0, 0, , , , GdipSizeModeClip, GdipAlignTopLeft
     
        'Affichage ds le contrôle Fond
        oGdi.RepaintNoFormRepaint Me.Fond
     
    End Sub
    oGdi représentait jusqu'alors une image-fichier mis aux dimensions du contrôle-image.
    Je charge ensuite l'image-fichier d'origine avec la resol maxi dont je dispose.
    CoordImgX1 , CoordImgY1 , CoordImgX2, CoordImgY2 contiennent les coordonnées en pixels des coins haut-gauche et bas-droit de ma sélection avec l'échelle de cette image.
    J'essaie ensuite d'afficher dans le contrôle la portion zoomée:
    le WorldScale a l'air de fonctionner mais le WorldTranslate me pose problème: j'ai essayé avec les 2 solutions ci-dessus mais le résultat affiche invariablement cette région qui se trouve au Nord-Est de ma sélection:
    Nom : RégionZoomResult.PNG
Affichages : 125
Taille : 35,5 Ko

    Mon erreur se situe-t-elle
    . dans le WorldScale (je ne crois pas)
    . dans le WorldTranslate ?
    . dans le DrawImg ?

    La doc du WorldTransLate me semble pourtant claire quant aux paramètres. Est-ce que la région "CarteOrig" doit être affectée après le WorldScale?

    Merci de vos réponses.

  7. #7
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 983
    Par défaut Région dans clGDI+
    J'avance dans mon raisonnement, pardonnez-moi si j'ai l'air de radoter

    Je commence à soupçonner que ma gestion des images secondaires n'est pas bonne.

    Je suspends momentanément ce thread et reviendrai vers vous pour de futures questions, je n'en doute pas !

  8. #8
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    Voilà un exemple de ce que j'essayais d'expliquer.

    Tests_Map.zip

    CTRL + clic souris pour définir le rectangle d'affichage
    clic souris pour déplacer la carte
    double-clic pour réinitialiser la carte globale

    Dans la procédure de rendu il y a tout le dessin : la carte de fond, des axes, des cercles...
    Seul le rectangle de sélection est à part.

    J'utilise beaucoup les matrices, je trouve que c'est bien pour ce genre de conversions (mètres sur le fond de carte <=> pixels sur le fond de carte <=> pixels sur le contrôle...).
    D'ailleurs je ne redimensionne pas non plus le contrôle en fonction du ratio de l'image, c'est la matrice de dessin (DrawMatrix) qui me dit où est la carte sur l'image et fait les conversions depuis l'image du contrôle vers la carte de fond.

    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
    Option Compare Database
    Option Explicit
     
    Private WithEvents oGdi As clGdiplus
    Private Const cMargeX As Long = 50
    Private Const cMargeY As Long = 50
    ' Taille de la carte de fond en mètres
    Private gXM As Long
    Private gYM As Long
    ' Coordonnées de clic et sélection (en pixel sur l'image du contrôle)
    Private gX As Single, gY As Single
    Private gX1 As Single, gY1 As Single
    Private gX2 As Single, gY2 As Single
    ' Coordonnées source sur la carte (en pixel sur l'image de fond)
    Private gMapX1 As Single, gMapY1 As Single
    Private gMapX2 As Single, gMapY2 As Single
    ' Noms des matrices de conversion
    Private Const cPxIToM As String = "PxIToM"
    Private Const cMToPxI As String = "MToPxI"
    Private Const cPxCToPxI As String = "PxCToPxI"
    Private Const cPxIToPxC As String = "PxIToPxC"
     
    Private Sub Form_Load()
    Set oGdi = New clGdiplus
    oGdi.CreateBitmapForControl Me.Image1
    oGdi.SmoothingMode = GdipSmoothingAntialias
    oGdi.TextRenderingHint = GdipClearTypeGridFit
    oGdi.ImgObject = Me.Image1
    LoadMap
    Render
    Draw
    End Sub
     
    Private Sub LoadMap()
    With oGdi.ImgNew("fond_base")
        .LoadFile oGdi.ApplicationPath & "france-physical-map-large.jpg"
        gXM = 15000
        gYM = 12450
        oGdi.MatrixNew cPxIToM
        oGdi.MatrixScale cPxIToM, 1, -1
        oGdi.MatrixTranslate cPxIToM, 0, .ImageHeight
        oGdi.MatrixScale cPxIToM, gXM / .ImageWidth, gYM / .ImageHeight
        oGdi.MatrixNew cMToPxI, oGdi.matrix(cPxIToM)
        oGdi.MatrixInvert cMToPxI
        resetZoomDecalage
    End With
    End Sub
     
    Private Sub Render()
    oGdi.Clear vbWhite
    ' Dessin du fond de carte
    oGdi.ImgClone oGdi.img("fond_base"), "fond", gMapX1, gMapY1, gMapX2, gMapY2 ' On clone le fond découpé
    oGdi.DrawImg "fond", cMargeX, 0, oGdi.ImageWidth - 1, oGdi.ImageHeight - 1 - cMargeY ' Et on le dessine
    updateMatrix
    ' Test de positionnement en mètres (par ex. Paris est à, environ, 9000 M du bord gauche et 8250 M du bord bas
    renderCircle 9000, 8250 ' Paris
    renderCircle 8700, 7200 ' Orléans
    ' Axe
    Dim lMinMetreX As Single
    Dim lMaxMetreX As Single
    Dim lMetreIntervalX As Single
    Dim lPosMetreX As Single
    Dim lPosPixelX As Single
    Dim lCptX As Long
    lMinMetreX = 0
    lMaxMetreX = oGdi.ImageWidth - 1
    convertCoordPxControlToMeterMap lMinMetreX, 0
    convertCoordPxControlToMeterMap lMaxMetreX, 0
    lMetreIntervalX = (lMaxMetreX - lMinMetreX) / 20
    oGdi.DrawLine cMargeX, oGdi.ImageHeight - 1 - cMargeY, oGdi.ImageWidth, oGdi.ImageHeight - 1 - cMargeY
    For lPosMetreX = lMinMetreX To lMaxMetreX Step lMetreIntervalX
        lPosPixelX = lPosMetreX
        convertCoordMeterMapToPxControl lPosPixelX, 0
        If lPosPixelX > cMargeX Then
            oGdi.DrawLine lPosPixelX, oGdi.ImageHeight - 1 - cMargeY - 3, lPosPixelX, oGdi.ImageHeight - 1 - cMargeY + 3
            oGdi.DrawText Round(lPosMetreX), 12, , CLng(lPosPixelX), oGdi.ImageHeight - 20 - IIf(lCptX Mod 2, 0, 20), , , HorzAlignCenter, VertAlignCenter
        End If
        lCptX = lCptX + 1
    Next
     
    Dim lMinMetreY As Single
    Dim lMaxMetreY As Single
    Dim lMetreIntervalY As Single
    Dim lPosMetreY As Single
    Dim lPosPixelY As Single
    Dim lCpt As Long
    lMinMetreY = 0
    lMaxMetreY = oGdi.ImageHeight - 1
    convertCoordPxControlToMeterMap 0, lMinMetreY
    convertCoordPxControlToMeterMap 0, lMaxMetreY
    lMetreIntervalY = (lMaxMetreY - lMinMetreY) / 20
    oGdi.DrawLine cMargeX, 0, cMargeX, oGdi.ImageHeight - 1 - cMargeY
    For lPosMetreY = lMinMetreY To lMaxMetreY Step lMetreIntervalY
        lPosPixelY = lPosMetreY
        convertCoordMeterMapToPxControl 0, lPosPixelY
        If lPosPixelY < oGdi.ImageHeight - 1 - cMargeY Then
            oGdi.DrawLine cMargeX - 3, lPosPixelY, cMargeX + 3, lPosPixelY
            oGdi.DrawText Round(lPosMetreY), 12, , 0, CLng(lPosPixelY) - 6, cMargeX, CLng(lPosPixelY) + 6, HorzAlignRight, VertAlignCenter
        End If
        lCpt = lCpt + 1
    Next
    '------------------------------------------------------------
    ' Instruction finale
    ' Conserve le dessin complet en mémoire (pour dessin plus rapide du rectangle de sélection,...)
    oGdi.ImageKeep
    End Sub
     
    Private Sub renderCircle(pX As Single, pY As Single)
    Dim lx As Single, ly As Single
    Dim lR As Single
    lR = 20
    convertVectorPxMapToPxControl lR, 0
    lx = pX
    ly = pY
    convertCoordMeterMapToPxControl lx, ly
    oGdi.DrawEllipse lx, ly, lR, lR, TypeEllipseCenter, , vbRed, 2
    End Sub
     
    Private Sub Draw(Optional pFast As Boolean)
    If pFast Then
        oGdi.RepaintFast
    Else
        oGdi.RepaintNoFormRepaint
    End If
    End Sub
     
    Private Sub resetZoomDecalage()
        gMapX1 = 0
        gMapY1 = 0
        gMapX2 = oGdi.img("fond_base").ImageWidth - 1
        gMapY2 = oGdi.img("fond_base").ImageHeight - 1
    End Sub
     
    Private Sub updateMatrix()
    ' Matrice de passage des coordonnées contrôle vers l'image source du fond
    oGdi.MatrixNew cPxCToPxI, oGdi.img("fond").DrawMatrix ' Matrice de dessin du fond
    oGdi.MatrixTranslate cPxCToPxI, gMapX1, gMapY1 ' Qu'on décale pour se ramener à la portion découpée
    ' Matrice inverse fond => contrôle
    oGdi.MatrixNew cPxIToPxC, oGdi.matrix(cPxCToPxI)
    oGdi.MatrixInvert cPxIToPxC
    End Sub
     
    ' Fonction d'aides aux conversions
    Private Sub convertCoordPxControlToPxMap(lx As Single, ly As Single)
    oGdi.MatrixTransformPointSingle lx, ly, cPxCToPxI
    End Sub
    Private Sub convertCoordPxMapToMeterMap(lx As Single, ly As Single)
    oGdi.MatrixTransformPointSingle lx, ly, cPxIToM
    End Sub
    Private Sub convertCoordPxControlToMeterMap(lx As Single, ly As Single)
    oGdi.MatrixTransformPointSingle lx, ly, cPxCToPxI, cPxIToM
    End Sub
    Private Sub convertCoordPxMapToPxControl(lx As Single, ly As Single)
    oGdi.MatrixTransformPointSingle lx, ly, cPxIToPxC
    End Sub
    Private Sub convertCoordMeterMapToPxMap(lx As Single, ly As Single)
    oGdi.MatrixTransformPointSingle lx, ly, cMToPxI
    End Sub
    Private Sub convertCoordMeterMapToPxControl(lx As Single, ly As Single)
    oGdi.MatrixTransformPointSingle lx, ly, cMToPxI, cPxIToPxC
    End Sub
    Private Sub convertVectorPxControlToPxMap(lx As Single, ly As Single)
    oGdi.MatrixTransformVectorSingle lx, ly, cPxCToPxI
    End Sub
    Private Sub convertVectorPxMapToMeterMap(lx As Single, ly As Single)
    oGdi.MatrixTransformVectorSingle lx, ly, cPxIToM
    End Sub
    Private Sub convertVectorPxControlToMeterMap(lx As Single, ly As Single)
    oGdi.MatrixTransformVectorSingle lx, ly, cPxCToPxI, cPxIToM
    End Sub
    Private Sub convertVectorPxMapToPxControl(lx As Single, ly As Single)
    oGdi.MatrixTransformVectorSingle lx, ly, cPxIToPxC
    End Sub
    Private Sub convertVectorMeterMapToPxMap(lx As Single, ly As Single)
    oGdi.MatrixTransformVectorSingle lx, ly, cMToPxI
    End Sub
    Private Sub convertVectorMeterMapToPxControl(lx As Single, ly As Single)
    oGdi.MatrixTransformVectorSingle lx, ly, cMToPxI, cPxIToPxC
    End Sub
     
     
    Private Sub oGdi_ImgMouseDblClick(pRegion As String, Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = acLeftButton Then
        resetZoomDecalage
        Render
        Draw
    End If
    End Sub
     
    Private Sub oGdi_ImgMouseDown(pRegion As String, Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = acLeftButton Then
        If Shift = acCtrlMask Then
            gX1 = X
            gY1 = Y
            gX = X
            gY = Y
        ElseIf Shift = 0 Then
            gX = X
            gY = Y
        End If
    ElseIf Button = acRightButton Then
     
    End If
    End Sub
     
    Private Sub oGdi_ImgMouseMove(pRegion As String, Button As Integer, Shift As Integer, X As Single, Y As Single)
        If Button = acLeftButton Then
            If Shift = acCtrlMask Then
                If (X - gX) > (Y - gY) Then
                    gX2 = X
                    gY2 = gY1 + oGdi.img("fond_base").ImageHeight / oGdi.img("fond_base").ImageWidth * (gX2 - gX1 + 1) - 1
                Else
                    gY2 = Y
                    gX2 = gX1 + oGdi.img("fond_base").ImageWidth / oGdi.img("fond_base").ImageHeight * (gY2 - gY1 + 1) - 1
                End If
                ' Dessin du rectangle par dessus le dessin complet sauvegardé
                oGdi.ImageReset
                oGdi.DrawRectangle gX1, gY1, gX2, gY2
                oGdi.RepaintFast
            ElseIf Shift = 0 Then
                Dim lDeltaX As Single, lDeltaY As Single
                lDeltaX = gX - X
                lDeltaY = gY - Y
                convertVectorPxControlToPxMap lDeltaX, lDeltaY
                gMapX1 = gMapX1 + lDeltaX
                gMapY1 = gMapY1 + lDeltaY
                gMapX2 = gMapX2 + lDeltaX
                gMapY2 = gMapY2 + lDeltaY
                gX = X
                gY = Y
                Render
                Draw True
            End If
        End If
        Dim lx As Single, ly As Single
        Dim lLog As String
        lx = X: ly = Y
        lLog = "Pixels contrôle  : " & lx & " x " & ly
        convertCoordPxControlToPxMap lx, ly
        lLog = lLog & vbCrLf & "Pixels fond : " & lx & " x " & ly
        convertCoordPxMapToMeterMap lx, ly
        lLog = lLog & vbCrLf & "Mètres fond : " & lx & " x " & ly
        Me.txtLog = lLog
        Me.txtLog.SelLength = 0
    End Sub
     
    Private Sub oGdi_ImgMouseUp(pRegion As String, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim lX1 As Single, lY1 As Single, lX2 As Single, lY2 As Single
    If Button = acLeftButton Then
        If Shift = acCtrlMask Then
            gMapX1 = gX1
            gMapY1 = gY1
            gMapX2 = gX2
            gMapY2 = gY2
            convertCoordPxControlToPxMap gMapX1, gMapY1
            convertCoordPxControlToPxMap gMapX2, gMapY2
        End If
        Render
        Draw
    End If
    End Sub

  9. #9
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 983
    Par défaut Région dans clGDI+
    Merci Arkham46 !

    Je vais étudier çà religieusement!

    'Faut dire que cette classe clGDI+, si elle est puissante, me donne pas mal de migraines!

    Je n'en comprends pas bien les méthodes, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oGdi.DrawImg "CarteOrig", x1, y1, x2, y2, , GdipSizeModeClip, GdipAlignTopLeft
    devrait "injecter" l'image secondaire "CarteOrig" dans l'image principales dans le carré de coordonnées (x1,y1) (x2,y2) et ce, dans le coin haut/gauche, n'est-ce pas ?

    Est-ce que je devrais passer (x1,y1) (x2,y2) à l'échelle de CarteOrig (plus grand) ou du contrôle récepteur (plus petit) ?

  10. #10
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 983
    Par défaut Région dans clGDI+
    Je viens d'essayer ton exemple de base: soit dit en passant BEAU TRAVAIL !!!

    J'ai peut-être des objectifs trop ambitieux mais si j'ai bien compris, tu travailles à partir d'une carte qui comporte toutes les infos (points rouges).
    . Je dispose d'une carte vierge grosse résol, que je commence par afficher sur le contrôle image.
    . Ensuite je dispose dessus les axes, grille(s), points remarquables...

    Ce que je souhaite, c'est que même si je perds de la résol sur la carte en zoomant, mes éléments soient de nouveau disposés dessus sans perte, parce qu'ensuite ils devront être interactifs par clic dessus pour afficher des données (et que c'est "plus joli" )
    . Lors d'un zoom je souhaite donc charger la grosse carte et afficher les éléments dessus mais en positionnant, comme toi, le rectangle sélectionné dans les marques du contrôle image.

    Enfin, je vais me pencher sur tes méthodes en espérant que je pourrais contourner les matrices avec lesquelles je ne suis pas à l'aise.

    Merci encore Arkham!

  11. #11
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Le drawImg prend bien la cible en coordonnées.
    Tente un oGdi.worldReset avant le repaint pour être sûr que les transformations ne s'appliquent pas une deuxième fois au rendu à l'écran (de mémoire je ne sais plus si c'est le cas).

    Mais dans mon exemple les cercles sont dessinés dynamiquement, ils ne sont pas sur le fichier image de base.
    J'adapte le rayon du cercle (donc le cercle suit plus ou moins le zoom), mais on peut garder un rayon fixe.

    Si tu ne veux pas utiliser les matrices, tu peux toujours faire des calculs avec des multiplications, additions...
    Mais il est dans tous les cas utiles d'avoir des fonctions de conversion (genre pixels vers mètre...), ça facilite la tâche.
    Sinon tu as le même calcul à des dizaines d'endroits et au moindre changement il faut repasser partout.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/07/2018, 05h55
  2. fusion des région dans une image
    Par titou08 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 03/12/2010, 19h12
  3. Ajout de régions dans un code Java
    Par manu f dans le forum Eclipse
    Réponses: 1
    Dernier message: 23/03/2010, 14h38
  4. [Portal 9iAS] : ordre des items dans une région
    Par melitta dans le forum Oracle
    Réponses: 8
    Dernier message: 21/10/2004, 15h01

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