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 :

Impression d'un formulaire


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Impression d'un formulaire
    Bonsoir !

    J'ai trouver un code sur ce site qui me permet donc d'imprimer un formulaire.

    Le problème c'est que quand je récupère ça dans mon fichier (impression dans un fichier) j'ai uniquement mon formulaire met tout est en noir (sur papier je vous dis pas l'encre gaspillé, j'ai testé...), pas de label, rien, nada 0, que dal, juste du noir...


    Donc voici mon code, j'espères que vous allez pouvoir m'éclairer^^

    Petite précision, si je modifie la taille de mon formulaire, le rectangle noir qui est imprimer est également modifié.

    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
     
    Private Declare Function BitBlt Lib "gdi32.dll" Alias "BitBlt" (ByVal _
       hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As _
       Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal _
       hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
       ByVal dwRop As System.Int32) As Long
        Dim memoryImage As Bitmap
     
     
        Private Sub CaptureScreen()
            Dim mygraphics As Graphics = Me.CreateGraphics()
            Dim s As Size = Me.Size
            memoryImage = New Bitmap(s.Width, s.Height, mygraphics)
            Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
            Dim dc1 As IntPtr = mygraphics.GetHdc
            Dim dc2 As IntPtr = memoryGraphics.GetHdc
            BitBlt(dc2, 0, 0, Me.ClientRectangle.Width, _
               Me.ClientRectangle.Height, dc1, 0, 0, 13369376)
            mygraphics.ReleaseHdc(dc1)
            memoryGraphics.ReleaseHdc(dc2)
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub F_impression_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
    'je remplis les labelsavec des variables
    ...
    ...
     
    'Appel de la procédure
    CaptureScreen()
    PrintDocument1.Print()
     
    End sub
    Merci de votre aide !

  2. #2
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Il te manque ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
     
    e.Graphics.DrawImage(memoryImage, 0, 0)
     
    End Sub
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci de ton aide danyel malheureusement cela n'a rien changé..

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Le rectangle noir peut avoir deux origines, ce qui est sur c'est que le DC de destination ne contient aucune donnée "visible".
    1) Le bitmap source ne contient aucune donnée
    2) il y a un problème dans les coordonnées.

    Je pencherai pour le 2

    Au niveau des coordonnées il s'agit de coordonnées logiques, donc si votre DC n'est pas mapper en mode MM_TEXT les coordonnées logiques ne seront pas les même que les coordonnées de périphérique. Sachant qu'en plus si vous imprimer (même dans un fichier) le DC des imprimantes est réglé en MM_HighEnglish par défaut en GDI+ (0.01 " par unité logique).
    Et il me semble que la fonction ClientRectangle de .Net renvoi des coordonnées de périphérique (presque sur car elle doit être basée sur l'API GetClientRectangle).

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Doucement, j'ai un peu de mal à comprendre ton message Geo2A...

    DC n'est pas mapper en mode MM_TEXT les coordonnées logiques ne seront pas les même que les coordonnées de périphérique
    Déjà là, je suis bloqué^^

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    J'ai trouver un code sur ce site qui me permet donc d'imprimer un formulaire.
    La magie du copier coller ! Le problème avec les API 32, particulièrement celles de la GDI (et Bitblt en est une) c'est qu'il y a un peu de théorie qui va avec ...

    Résumons un peu, mais il faudra que vous approfondissiez, je ne peux pas faire un cours de 10 pages ici.

    Sous windows il y a deux type de coordonnées, les coordonnées de périphérique donc dépendantes du périphérique qui sont exprimées en général en pixel et dont l'origine est en général le coin supérieur gauche du périphérique (l'écran par exemple).
    Il y a ensuite les coordonnées logiques qui elles sont indépendantes du périphérique. Elles sont les paramètres de toutes API GDI qui demande des coordonnées (BitBlt entre autre) . C'est windows qui assure la transformation entre ces deux jeux de coordonnées via les API DpToLp (device p to logical p) et l'inverse LpToDp. Cette transformation est assurée en fonction du mode de mapping du DC que l'utilisateur choisi à l'aide de l'API SetMapMode.
    Il existe plusieurs mode de mapping voici quelques exemples:
    MM_TEXT : une unité logique correspond à une unité de périphérique
    MM_HIMETRIC : Une unité logique correspond à 0.01 mm quelque soit le périphérique
    MM_HIENGLISH : Une unité logique correspond à 0.01 pouce qq soit le périphérique.

    Est-ce plus clair ?

    Dans votre code vous utilisez clientrectangle qui renvoie des coordonnées de périphérique, donc sauf à être en mode MM_TEXT vous ne passer pas les bon paramètres à la fonction BitBlt. Comme les fonction d'impression de la GDI+ prennent toutes dans le mode par défaut des coordonnées en centième de pouce il me semble que le DC des imprimantes est mappé par défaut dans un mode différent de MM_TEXT.

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    C'est un peu plus clair (si j'ai bien compris, enfin je crois ) mais comme vous le dites il n'est pas possible de résumé un cours de 10 pages en 10 lignes.

    Mais si c'est une histoire de coordonnée, comment peut-on expliquer lorsque je modifie les dimensions du formulaire, la taille du rectangle noir qui est imprimé est également modifié...

    Le point de départ en haut à gauche est bien détecté et le point ou finit le formulaire en bas à droite aussi, c'est ce qui est à l'intérieur qui n'apparait pas...


    Je vais continuer à me renseigner sur le printdocument..;

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Mais si c'est une histoire de coordonnée, comment peut-on expliquer lorsque je modifie les dimensions du formulaire, la taille du rectangle noir qui est imprimé est également modifié
    Le problème c'est que c'est lié aussi au DC et bon les API c'est un peu coton, j'ai passé quelques nuits blanches avec rectangles noirs avant de réussir à afficher une image avec ces fonctions (c'était du VB6 à l'époque) et j'avais un bon bouquin !

    Je pense qu'il faut sériés vos problèmes. La première étape serait de se passer de l'imprimante en essayant d'afficher votre bitmap en mémoire sur une feuille ou un picturebox, cela éliminerait un pb et permettrait de vérifier que votre bitmap contient des données. Avec une feuille windows standard vous serez de base en MM_TEXT ce qui élimine aussi la problématique des coordonnées logiques.

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    En faite le problème vient du fait que la procédure est effectuée pendant le chargement du formulaire, or si je créer un bouton et que l'on click dessus le formulaire s'imprime correctement.

    Effectivement en y repensant, c'est normal je veux imprimer un formulaire qui n'est pas encore chargé...

    Merci de votre aide !

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

Discussions similaires

  1. Impression filtre sur formulaire
    Par zut94 dans le forum Access
    Réponses: 6
    Dernier message: 07/03/2006, 16h30
  2. Réponses: 2
    Dernier message: 02/03/2006, 09h38
  3. impression d'un formulaire
    Par plume75 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 11/10/2005, 17h44
  4. impression d'un formulaire
    Par RODIER dans le forum Access
    Réponses: 1
    Dernier message: 04/10/2005, 11h44
  5. impression d'un formulaire
    Par fulgaro dans le forum IHM
    Réponses: 6
    Dernier message: 22/06/2005, 14h43

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