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

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

Windows Forms Discussion :

[GDI][C# .Net 2] .Net FW 2 est buggué ?! ... ou c'est moi ?


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut [GDI][C# .Net 2] .Net FW 2 est buggué ?! ... ou c'est moi ?
    Hello @ tous ,

    voilà maintenant 3 jours que je galère sur un problème avec GDI+ ...

    Je veux imprimer des champs sur une page, et l'utilisateur peut indiquer la position en mm de ces champs ...

    J'ai donc un printDocument, associé à un boup de code de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
    			e.Graphics.DrawRectangle(Pens.Red, 0, 0, e.MarginBounds.Width, e.MarginBounds.Height);
    			//
    			e.Graphics.PageUnit = GraphicsUnit.Pixel;
    			//
    			e.Graphics.DrawRectangle(Pens.Green, 0, 0, e.MarginBounds.Width, e.MarginBounds.Height);
    		}
    ( J'ai mis "OriginAtMargins" à true ... donc je trace en partant de 0 )

    Avec ce code, je me retrouve avec un gros carré Rouge qui fait bien toute la surface hors-marges ... et un tout petit vert ?!!

    Et je suis en train de me demander pourquoi ?

    Est ce que le "PageUnit" des "MarginBounds" et autres Rect n'est pas le pixel ?
    ( dans ce cas, c'est quoi ? ... le WorldUnit ??? )

    Comment convertir de l'unité utilisée au pixel ? ...

    Je pensais que le fait de changer d'unité dans le PageUnit allait automatiquement faire que je lirais des infos dans cette unité ... ?!

    Voilà, c'est simple à utiliser, mais là je voudrais pouvoir placer précisément des objets, et que ça marche avec toutes les imprimantes, l'aperçu ...

    Merci,
    @+
    Seb.

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut
    Autre truc que je capte pas, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    myGraphic.PageUnit = GraphicsUnit.Millimeter;
     
    Image Sprite = Bitmap.FromFile("mySprite.png"); // 48x48 RGB32 Bitmap
     
    destRect = new RectangleF();
    destRect.X = 15;
    destRect.Y = 20;
    destRect.Width = 10;
    destRect.Height = 10;
     
    srcRect = new RectangleF(0, 0, Sprite.Width, Sprite.Height);
     
    myGraphic.DrawImage(Sprite, destRect, srcRect, GraphicsUnit.Pixel);
    Et bien, je m'attends à obtenir mon bitmap à 15 et 20mm du bord (dans la marge), et qu'il fasse 1cm en taille ... et c'est carrément pas le cas, ou alors il confond les mm avec les cm ...

    NB: j'utilise un preview pour voir ce que ça donne, mais normalement, ça devrait être identique, non ?

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    peut-etre que dans le DrawImage, tu devrais mettre
    GraphicsUnit.Millimeter plutot que pixel ?

    The Monz, Toulouse

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    salut

    peut-etre que dans le DrawImage, tu devrais mettre
    GraphicsUnit.Millimeter plutot que pixel ?

    The Monz, Toulouse
    Merci de ta réponse le Toulousain !
    ( j'y descend ce WE )

    Ce paramètre permet d'indiquer l'unité du srcRect ... donc pour moi, c'est OK comme ça ...

    ... à confirmer ...

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut
    Autre question, dans mon objet "Graphic" ... à quoi correspondent DpiX et DpiY ???

    à la résolution du bitmap, on est d'accord, oui, mais dans quelle unité ? ... en dpi ? ou en fonction de l'unité actuelle du graphic ?

    Soit j'ai vraiment pas compris la logique de tout ça (ce qui est possible !), soit ça me semble un peu bâclée ce GDI+ ... au moins sur ce point précis des unités ...

    Merci de votre aide, @++
    Seb.

    [Edit]

    Les MSDN indiquent :

    The value, in dots per inch, for the horizontal resolution supported by this Graphics.
    ... c'est bien des dpi ... donc déjà pourquoi ce n'est pas fonction de l'unité choisie ???

    Mais alors, quelle est la résolution de l'unité actuelle ??? ... Passer de mes mm aux pixels est possible grâce à DpiX et DpiY, mais ensuite, comment convertir ça dans l'unité actuelle ???

    Tout cela me semble tellement absurde, que je pense vraiment avoir zappé un point important ...

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut GDI = Grosse Depression Inutile ?!
    Bon, je continu mon monologue ...

    Y'a un truc vraiment pas normal ...

    Graphics..::.VisibleClipBounds Property :
    The unit for resulting rectangle is designated by the PageUnit property. The default unit is pixels.
    Hors, quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    myGraphic.PageUnit = GraphicsUnit.Millimeter;
    myGraphic.PageUnit = GraphicsUnit.Inch;
    Rien ne se passe : VisibleClipBounds.width et autre ne change pas de valeur ...

    C'est moi qui déconne sec, ou ces objets sont complètement buggués ???

    HELP ! ...

  7. #7
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    beh, non, je crois que GDI+ marche bien

    Ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Graphics g = this.CreateGraphics();
                float value = g.VisibleClipBounds.Width;
                Trace.WriteLine(value);
                g.PageUnit = GraphicsUnit.Millimeter;
                value = g.VisibleClipBounds.Width;
                Trace.WriteLine(value);
    Me donne 2 valeurs différentes correspondant à la taille dans les unités
    choisies

    Donc, tu dois "mal" utiliser l'objet Graphics

    The Monz, Toulouse

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut
    Arrghhh ...

    Bon, voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
      MessageBox.Show(e.Graphics.VisibleClipBounds.Width.ToString());
      e.Graphics.PageUnit = GraphicsUnit.Millimeter;
      MessageBox.Show(e.Graphics.VisibleClipBounds.Width.ToString());
    }
    Et j'ai la même valeur pour les 2 !!!



    NB: T'es en quelle version du FW ? ...
    Moi, Visual Studio 2005, donc FW .Net v2

  9. #9
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    oui oui, FW 2.0

    The Monz, Toulouse

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut
    Heu ... a tout hasard, tu vois un truc qui cloche dans mon code ???

    NB: c'est un PrintPreviewDialog qui appelle le "print" du document au moment du showdialog() ...

    Bon, y'a vraiment un truc qui cloche ...

    Tu pourrais faire un essai stp : faire un printDocument ( avec le code que j'ai posté comme fonction d'impression ), puis d'ajouter un PrintPreviewDialog ( qui pointe sur ton doc ), et de faire un show :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void bt_PrintPreview_Click(object sender, EventArgs e)
    {
    	printPreview.ShowDialog();
    }
    Je deviens fou je crois !!!

    En tout cas, merci bien de ton aide !!!

  11. #11
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    bon, j'ai essayé, et effectivement, le changement du PageUnit n'a pas l'air d'être pris en compte immédiatement...

    Par contre, il semblerait que si tu fixes ce pageUnit à l'unité qui te convient, tu pourras faire ce que tu veux

    Perso, en passant en millimetre, j'arrive à avoir une valeur différente du cas ou je suis dans une autre unité

    Genre :

    dans le printPage:

    Graphics g = e.Graphics;
    g.PageUnit = GraphicsUnit.Millimeter;
    Trace.Writeline(g.VisibleClipBounds.Width);

    Ce code retournera une valeur différente si je change le GraphicsUnit

    (par contre, dupliquer et copier ces lignes et regarder le résultat ne change rien comme si, l'unité était fixé une "fois" pour toute dès la "première" affectation))

    Voila ma conclusion !

    The Monz, Toulouse

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut
    Ok, truc de fou quoi ...

    Bon, merci beaucoup pour ton aide et ton temps !

    Je vais essayer de m'en sortir avec ces infos ...

    @plouch
    Seb.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/08/2012, 15h30
  2. Quel langage entre vb.net c#.net c++.net java ?
    Par heeedi dans le forum Débuter
    Réponses: 7
    Dernier message: 13/12/2008, 22h53
  3. Participez à la F.A.Q .NET ASP.NET Delphi.NET
    Par Jérôme Lambert dans le forum Contribuez
    Réponses: 0
    Dernier message: 05/12/2008, 01h00
  4. Participez à la F.A.Q .NET ASP.NET VB.NET
    Par Jérôme Lambert dans le forum Contribuez
    Réponses: 0
    Dernier message: 05/12/2008, 01h00
  5. [VB.NET] [VS.NET] Tester si le texte saisi est un entier
    Par San Soussy dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/10/2004, 11h41

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