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 :

Prendre une photo d'une RichTextBox même non affichée en VB.NET


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Points : 26
    Points
    26
    Par défaut Prendre une photo d'une RichTextBox même non affichée en VB.NET
    Bonjour,
    Je souhaite obtenir une image (à mettre dans un picture) d'un RichTRextBox y compris si ce contrôle n'est pas entièrement affiché à l'écran. Le problème est que la méthode DrawToBitmap n'existe pas avec un RichTextBox et qu'en utilisant l'API BitBlt, cela ne fonctionne que si le RichTextBox est entièrement affiché sur l'écran.
    J'ai trouvé une solution qui répond au besoin, qui fonctionne en VB6 (j'ai testé en réinstallant VB6 sous W7) maisn'est même pas compilable en VB.NET (Visual Studio 2013 Community). A toutes fins utiles, je vous donne le source trouvé sur la toile. Si quelqu'un de suffisamment pointu pouvait en faire une "traduction" en VB.NET, ce serait le bonheur.
    Le source suppose que l'on a les contrôles suivants sur le formulaire : RichTextBox1, Picture1 (PictureBox) et un bouton Command1.
    Merci d'avance

    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
       Option Explicit
     
        Private Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
        End Type
     
        Private Type CharRange
            cpMin As Long ' First character of range (0 for start of doc)
            cpMax As Long ' Last character of range (-1 for end of doc)
        End Type
     
        Private Type FormatRange
            hdc As Long ' Actual DC to draw on
            hdcTarget As Long ' Target DC for determining text formatting
            rc As RECT ' Region of the DC to draw to (in twips)
            rcPage As RECT ' Region of the entire DC (page size) (in twips)
            chrg As CharRange ' Range of text to draw (see above declaration)
        End Type
     
        Private Const WM_USER As Long = &H400
        Private Const EM_FORMATRANGE As Long = WM_USER + 57
        Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wp As Long, lp As Any) As Long
     
        Private Sub RTF_TO_PIC(RTF As RichTextBox, Pic As PictureBox)
            Dim fr As FormatRange, NextCharPosition As Long, R As Long
            Dim rcDrawTo As RECT
            Dim rcPage As RECT
     
            Pic.AutoRedraw = False
            Pic.Cls
            Pic.BackColor = vbWhite
     
            ' Set printable area rect
            rcPage.Left = 0
            rcPage.Top = 0
            rcPage.Right = Pic.ScaleWidth
            rcPage.Bottom = Pic.ScaleHeight
     
            ' Set rect in which to print (relative to printable area)
            rcDrawTo.Left = 0
            rcDrawTo.Top = 0
            rcDrawTo.Right = Pic.ScaleWidth
            rcDrawTo.Bottom = Pic.ScaleHeight
     
            fr.hdc = Pic.hdc ' Use the same DC for measuring and rendering
            fr.hdcTarget = Pic.hdc ' Point at printer hDC
            fr.rc = rcDrawTo ' Indicate the area on page to draw to
            fr.rcPage = rcPage ' Indicate entire size of page
            fr.chrg.cpMin = 0 ' Indicate start of text through
            fr.chrg.cpMax = -1 ' end of the text
     
            NextCharPosition = SendMessage(RTF.hwnd, EM_FORMATRANGE, True, fr)
     
            R = SendMessage(RTF.hwnd, EM_FORMATRANGE, False, ByVal CLng(0))
     
            Pic.AutoRedraw = True
        End Sub
     
        Private Sub Command1_Click()
            RTF_TO_PIC RichTextBox1, Picture1
        End Sub

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Voir cette discussion : https://social.msdn.microsoft.com/Fo...xt-to-an-image

    Sinon pas de solution simple : il faudra utiliser des composants du commerce.

    Autre possibilité avec des composants gratuits ou open source : conversion de rtf en pdf, puis de pdf vers une image.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Points : 26
    Points
    26
    Par défaut
    Merci pour la vélocité de la réponse.
    Connais tu un composant open ou gratuit qui ferait le job (RichTextBox "photographiable" ou "PDFable")??

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Rtf to Pdf : Acrobat.dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // code en c#
    Acrobat.dll.Acrobat.AcroAVDocClass acroDoc = new Acrobat.AcroAVDocClass();
    Acrobat.AcroPDDoc pdDoc = null;
     
    acroDoc.Open(strNonPDFFile, strPDFFile);
    pdDoc = (Acrobat.AcroPDDoc)(acroDoc.GetPDDoc());
    pdDoc.Save(Acrobat.PDSaveFlags.PDSaveFull, strPDFFile);
    pdDoc.Close();
    pdDoc = null;
    acroDoc.Close(1);
    acroDoc = null;
    Pdf to image :
    - aussi avec Acrobat, voir : http://www.codeproject.com/Articles/...age-Conversion
    - avec GhostsScript: voir http://www.codeproject.com/Articles/...hostscript-API
    - et probablement d'autres solutions avec, en particulier, ITextSharp.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Points : 26
    Points
    26
    Par défaut
    Merci Graffito. Je creusee de ce côté là.
    Bien amicalement

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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