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

VB.NET Discussion :

Generation de .EMF avec GDI+ [Débutant]


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant DUT informatique
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant DUT informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 23
    Points
    23
    Par défaut Generation de .EMF avec GDI+
    Bonsoir,

    Voila je post car j'ai un problème (en général c'est plutôt une cause répandue pour post )
    J'essaye de générer une image vectoriel en .EMF avec GDI sous VB.NET que j'ai construite au prealable avec GDI.
    Pour la création de l'image pas de problème (enfin c'est qu'un rectangle ... avec un magnifique dégradé Bleu et blanc quand meme ! ).
    Le probleme se pose au niveau de la sauvegarde.
    Quand je sauvegarde mon magnifique rectangle dans un fichier .emf , cela me crée bel et bien le fichier avec une entête qui m'a l'air correct ( j'ai regardé ce qu'il y avais dedans avec EMFParser ), mais le reste est désespérément vide.
    Il faut dire que j'ai trouver pas mal de doc sur le sujet mais presque exclusivement en C# et donc j'ai essayer tant bien que mal de faire la traduction en VB.NET.

    Voici les sources ( j'utilise Visual Basic Express 2008) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Protected Overrides Sub OnPaint(ByVal pe As PaintEventArgs)
            Dim g As Graphics = pe.Graphics
            Dim rect As New Rectangle(50, 30, 100, 100)
            Dim lBrush As New LinearGradientBrush(rect, Color.Blue, Color.White, LinearGradientMode.BackwardDiagonal)
            g.FillRectangle(lBrush, rect)
            Dim path As String = "C:\Users\Darty\Desktop\Painted.emf"
            Dim img As Metafile = New Metafile(path, g.GetHdc()) 
            Dim ig As Graphics = Graphics.FromImage(img)
            ig.Dispose()
            img.Dispose()
            g.ReleaseHdc()
            g.Dispose()
        End Sub

    Quelqu'un saurai me dire pourquoi la sauvegarde ne marche pas et éventuellement m'aiguiller vers la solution ?

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    tu aurais pu te répondre dans ton 1er topic
    pour convertir du c# au vb.net (ou l'inverse) il existe des convertisseurs : Convert C# to VB.NET - A free code conversion tool - developer Fusion

    je ne sais pas ce qu'est un emf, mais tente de faire du draw plus tard dans le code, et pour etre sur après la ligne 8 et après la ligne 9, voir si c'est pas ca le soucis ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour Shask.

    Bon pour ton code le probleme est que tu utilises l'event paint de ton form qui se refrachit des millliers de fois...Alors le metafile tu le crees et tu le "destroy" autant...ca c'est la mauvaise utilisation de l'event paint.
    Plus le g.Dispose() qui ne doit pas exister dans cet event.......
    Il faut :
    -faire le dessin du metafile à l'exterieur de l'event paint
    -le sauvegarder...
    -le recharger et l'afficher....
    voici un premier code qui fait :
    - le dessin du metafile à l'exterieur de l'event paint dans un fichier sur disque
    - le recharge et l'affiche dans un picturebox
    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
     
    Imports System
    Imports System.Windows.Forms
    Imports System.Text.ASCIIEncoding
    Imports System.Drawing.Imaging
    Imports System.IO
     
     
    Public Class frmEmf1
        Private pathApp As String = Directory.GetCurrentDirectory & "\"
        'Nom du fichier de sauvegarde
        Private FileName1 As String = "test.emf"
     
        Sub New()
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        End Sub
        'cree un metafile et le sauvegarde
        Private Sub btnDrawSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDrawSave.Click
            Dim tempGr As Graphics = Me.PictureBox1.CreateGraphics()
            Dim intPtrHdc As IntPtr = tempGr.GetHdc()
     
            '1/cree un fichier sur disque
            Dim myMetaFile As Metafile = New Metafile(pathApp & FileName1, intPtrHdc)
     
            '2/ objet graphics a partir du metafile
            Dim emfGr As Graphics = Graphics.FromImage(myMetaFile)
     
            '3/dessine dessus
            emfGr.FillEllipse(Brushes.Yellow, 0, 0, 100, 100)
            emfGr.DrawEllipse(Pens.Black, 0, 0, 100, 100)
            emfGr.DrawArc(New Pen(Color.Red, 10), 20, 20, 60, 60, 30, 120)
     
            '' Cree des commentaires à ajouter-eventuellement dans
            ''le fichier.
            'Dim encoderASC As New System.Text.ASCIIEncoding()
            'Dim metaComment As Byte() = {CByte(AscW("T")), CByte(AscW("e")), CByte(AscW("s")), CByte(AscW("t"))}
            'emfGr.AddMetafileComment(metaComment)
     
            ' Dispose de emfGr
            emfGr.Dispose()
     
            ' Release handle & dispose du tempGr.
            tempGr.ReleaseHdc(intPtrHdc)
            tempGr.Dispose()
            '
     
            '4/ Dispose de myMetaFile puisque il est sur disque
            myMetaFile.Dispose()
        End Sub
        'Charge le metafile cree ci-dessus et l'affiche dans un picturebox
        Private metaFileToDisplay As String = String.Empty
     
        Private Sub btnLoadDrawMetafile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadDrawMetafile.Click
     
            Dim dlg As OpenFileDialog = New OpenFileDialog
            dlg.CheckFileExists = True
            dlg.Filter = "fichiers(*.emf)|*.emf"
            If dlg.ShowDialog = Windows.Forms.DialogResult.OK Then
                metaFileToDisplay = dlg.FileName
                If Len(FileName1) = 0 Then
                    MessageBox.Show("select file please...")
                    Return
                Else
                    'demande  à picturebox de se rafraichir.......
                    Me.PictureBox1.Invalidate()
                End If
            End If
     
        End Sub
        'event paint de rafraichaissement du picturebox
        Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
            If metaFileToDisplay Is String.Empty Then Return
     
            Using mf As Metafile = New Metafile(metaFileToDisplay)
                e.Graphics.DrawImage(mf, New Point(0, 0))
            End Using
        End Sub
    End Class
    voici un deuxieme code qui fait :
    - le dessin du metafile en memoire (pas sur disque)
    à l'exterieur de l'event paint
    - l'affiche immediatement dans un picturebox
    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
     
    Imports System
    Imports System.Windows.Forms
    Imports System.Text.ASCIIEncoding
    Imports System.Drawing.Imaging
    Imports System.IO
    Public Class frmEmf2
        'fichier MetaFile
        Private myMetaFile As Metafile = Nothing
        Sub New()
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        End Sub
        'cree un metafile dans  un MemoryStream (en memoire)
        Private Sub btnDraw_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDraw.Click
            Dim tempGr As Graphics = Me.PictureBox1.CreateGraphics()
            Dim intPtrHdc As IntPtr = tempGr.GetHdc()
            Dim ms As MemoryStream = New MemoryStream
     
            '1/ cree un fichier en memoire 
            myMetaFile = New Metafile(ms, intPtrHdc)
     
            '3/ objet graphics a partir du metafile
            Dim emfGr As Graphics = Graphics.FromImage(myMetaFile)
     
            'dessine dessus
            emfGr.FillEllipse(Brushes.Yellow, 0, 0, 100, 100)
            emfGr.DrawEllipse(Pens.Black, 0, 0, 100, 100)
            emfGr.DrawArc(New Pen(Color.Red, 10), 20, 20, 60, 60, 30, 120)
     
     
            ' Dispose de emfGr
            emfGr.Dispose()
     
            ' Release handle & dispose du tempGr.
            tempGr.ReleaseHdc(intPtrHdc)
            tempGr.Dispose()
            '
     
            ' Pas de Dispose du myMetaFile mais plutot....
            ' demande  à picturebox de se rafraichir.......
            PictureBox1.Invalidate()
        End Sub
        'event paint de rafraichaissement du picturebox
        Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
            If myMetaFile Is Nothing Then Return
     
            Using mf As Metafile = myMetaFile
                e.Graphics.DrawImage(mf, New Point(0, 0))
            End Using
        End Sub
    End Class
    pour verifier que c'est un format vectoriel et non raster , tu as MS Word word (inserer une image) ou mieux MS Visio....
    bon code.......................

  4. #4
    Membre à l'essai
    Homme Profil pro
    Etudiant DUT informatique
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant DUT informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 23
    Points
    23
    Par défaut
    @Pol63 : Merci, je doit avouer que je ne connaissais pas ce genre d'outil mais j'imagine que sa doit être relativement approximatif. A tester tout de même

    @MABROUKI : Un GRAND merci a toi pour tes explication, il faut dire que je ne connaissais pas du tout VB.NET il y a 2 jour, tu m'a été d'une grande aide dans la compréhension de mon problème
    Je pensais que que nativement VB.NET gérer le fait de faire des repaint seulement lors d'une modification de la drawbox

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Shask Voir le message
    mais j'imagine que sa doit être relativement approximatif. A tester tout de même
    ca peut arriver certes mais c'est pas forcément courant, les 2 langages se compilent sur le même lanage intermédiaire, et il y a une correspondance réelle sur 95% du code
    il reste quelques mots clés qui n'existent que sur un langage et pas l'autre

    Citation Envoyé par Shask Voir le message
    Je pensais que que nativement VB.NET gérer le fait de faire des repaint seulement lors d'une modification de la drawbox
    une application windows forms se base sur gdi+, qui commence à dater
    sur windows xp, déplacer un fenetre au dessus d'une autre fait que l'évent paint est lancé en continu sur la fenetre du dessous
    sur vista/7 gdi+ est encapsulé dans le bureau directX, et il y a une mise en cache qui fait que l'event paint est peu levé
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. generation du java d'un model EMF avec ANT
    Par annerobert dans le forum ANT
    Réponses: 1
    Dernier message: 07/11/2006, 11h49
  2. [Vb.NET]Clignotement involontaire avec GDI+
    Par bicou13 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/05/2006, 17h12
  3. [VB NET] Petit probléme simpliste avec GDI+ !
    Par archimed111 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/05/2006, 09h17
  4. Generation de div avec code javascript
    Par partyboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/03/2006, 10h19
  5. Dessiner un repere avec GDI ?
    Par djiwalloo dans le forum MFC
    Réponses: 19
    Dernier message: 12/10/2004, 11h57

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