Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

RTF vers imprimante

7 réponses
Avatar
Driss HANIB
Bonjour à tous

Je voudrai permettre à un utilisateur de créer un morceau de texte et le
mettre en forme (couleur, taille de texte, gras italique, centré..) puis
sauvegarder ce texte mis en forme l'imprimer.
Seulement je veux utiliser un aperçu avant impression que j'ai créé, pour
pouvoir insérer ce texte mis en forme, parmi d'autres textes, gérés
différemment..

Je pensais utiliser un RTF Box (on trouve sur le net des mini traitements de
texte en VB6), puis récupérer les balises de mise en forme et les
transformer en balises "maison" avec lesquelles je piloterai mon impression
et donc je sauvegarderai tout cela dans une BDD access.

Question y-a-t'il un moyen d'interpréter ces données issues du RTF ?
Quelq'un a-t'il déjà creusé cette voie ?

Merci pour vos lumières

Driss

7 réponses

Avatar
LE TROLL
Bonjour Driss,

J'ai déjà utilisé des RTF, la structure est proche de celle d'un fichier
doc, toutefois a priori ça irait plus vite de lancer Word, car ça répond
sans programmation à tout ce que tu veux (mise en forme, impression,
aperçu)...

--
Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Driss HANIB" a écrit dans le message de
news:
Bonjour à tous

Je voudrai permettre à un utilisateur de créer un morceau de texte et le
mettre en forme (couleur, taille de texte, gras italique, centré..) puis
sauvegarder ce texte mis en forme l'imprimer.
Seulement je veux utiliser un aperçu avant impression que j'ai créé, pour
pouvoir insérer ce texte mis en forme, parmi d'autres textes, gérés
différemment..

Je pensais utiliser un RTF Box (on trouve sur le net des mini traitements
de texte en VB6), puis récupérer les balises de mise en forme et les
transformer en balises "maison" avec lesquelles je piloterai mon
impression et donc je sauvegarderai tout cela dans une BDD access.

Question y-a-t'il un moyen d'interpréter ces données issues du RTF ?
Quelq'un a-t'il déjà creusé cette voie ?

Merci pour vos lumières

Driss



Avatar
Driss HANIB
Salut LE TROLL

tu as raison sur le principe, mais l'intérêt pour moi est de permettre à
l'utilisateur de définir lui même la mise en forme d'un texte et ensuite
d'intéger ce texte dans dans d'uatres qu'il ne maitrise pas et j'utilise
aussi une DLL maison qui pilote l'imprimante et aussi avec un Aperçu avant
impression.
je cherche donc à "interpréter" la mise en forme crée dans rtfbox et lma
retranscrire en mes commandes imprimantes (ou je gère emplacement, format
caractèes , tableaux etc..).
J'ai entre temps trouver une début de commencement de la structure du
fichier rtf : reste à moi à justement créer l'interpreteur maison : je pense
faire une classe qui lira en temps réel un texte rtf (donc avec les balises)

Driss

"LE TROLL" <le a écrit dans le message de news:

Bonjour Driss,

J'ai déjà utilisé des RTF, la structure est proche de celle d'un
fichier doc, toutefois a priori ça irait plus vite de lancer Word, car ça
répond sans programmation à tout ce que tu veux (mise en forme,
impression, aperçu)...

--
Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Driss HANIB" a écrit dans le message de
news:
Bonjour à tous

Je voudrai permettre à un utilisateur de créer un morceau de texte et le
mettre en forme (couleur, taille de texte, gras italique, centré..) puis
sauvegarder ce texte mis en forme l'imprimer.
Seulement je veux utiliser un aperçu avant impression que j'ai créé, pour
pouvoir insérer ce texte mis en forme, parmi d'autres textes, gérés
différemment..

Je pensais utiliser un RTF Box (on trouve sur le net des mini traitements
de texte en VB6), puis récupérer les balises de mise en forme et les
transformer en balises "maison" avec lesquelles je piloterai mon
impression et donc je sauvegarderai tout cela dans une BDD access.

Question y-a-t'il un moyen d'interpréter ces données issues du RTF ?
Quelq'un a-t'il déjà creusé cette voie ?

Merci pour vos lumières

Driss






Avatar
Patrick
Bonjour
Il existe des gens qui ont déjà travaillé sur ce type de gestion.
Le plus simple est de ne pas interpréter le RTF, mais de laisser le controle
le faire pour toi.
En cherchant sur internet, on trouve des programmes qui permettent
d'imprimer un RTF

voici un petit exemple de code que j'ai adapté pour faire exactement la même
chose (aperçu et impression d'un document) :

Dans la feuille ModRTFPrint, tu met juste un controle RTFRichtextbox utilisé
pour mettre le texte formaté
Obj est une picturebox

If Left(Text, 6) = "{rtf1" Then
' texte RTF (courrier)
Start = 0
While Start < Len(mvarText) + 1
Start = PrintRTFEcran(Obj, Text, Start, X + PosXEnCours, Y,
TXEnCours, TY, Y + TY - 850)
If mvarNbCol > 1 Then
PosXEnCours = PosXEnCours + TXEnCours + mvarEspaceCol
Obj.CurrentY = Y
If PosXEnCours >= TX Then Start = Len(mvarText) + 1
Else
Obj.CurrentY = Y + TY
Start = Len(mvarText) + 1
End If
Wend
Else
' Texte normal


'The RichTextBox provides you with a simple printing function, but this tip
shows
'you how to add margins to your print outs for a more professional look.
'Add this code to a module:

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 Const EM_SETTARGETDEVICE As Long = WM_USER + 72
Private Const PHYSICALOFFSETX As Long = 112
Private Const PHYSICALOFFSETY As Long = 113

Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal
nIndex As Integer) As Long
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 Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal
lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As
Long, ByVal lpInitData As Long) As Long

Public Function PrintRTFEcran(Obj As PictureBox, Text As String, CharDebut
As Long, Left As Long, Top As Long, Width As Long, ByRef Height As Long,
PageHeight As Long) As Long
Dim fr As FormatRange
Dim rcDrawTo As Rect
Dim rcPage As Rect
Dim TextLength As Long
Dim r As Long

RTF.TextRTF = Text
If RTF.Text = "" Then
Unload Me
Height = 0
Exit Function
End If

' Start a print job to get a valid Printer.hDC
Obj.ScaleMode = vbTwips

' Set printable area rect
rcPage.Left = 0
rcPage.Top = 0
rcPage.Right = Printer.ScaleWidth
rcPage.Bottom = Printer.ScaleHeight

' Set rect in which to print (relative to printable area)
rcDrawTo.Left = Left
rcDrawTo.Top = Top
rcDrawTo.Right = Left + Width
rcDrawTo.Bottom = Top + Height

' Set up the print instructions
fr.hdc = Obj.hdc ' Use the same DC for measuring and rendering
fr.hdcTarget = Obj.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 = CharDebut ' Indicate start of text through
fr.chrg.cpMax = -1 ' end of the text

' impression sur la page actuelle
PrintRTFEcran = SendMessage(RTF.hWnd, EM_FORMATRANGE, True, fr)
Height = fr.rc.Bottom - Top

If PrintRTFEcran >= Len(RTF.Text) Then PrintRTFEcran = 0

' Allow the RTF to free up memory
r = SendMessage(RTF.hWnd, EM_FORMATRANGE, False, ByVal CLng(0))
Unload Me

End Function

Pour une impression vers l'imprimant, rien de plus compliqué : il suffit de
remplacer Obj par printer, et d'adapter un peu le code...

Bon courage

"Driss HANIB" a écrit dans le message de news:

Bonjour à tous

Je voudrai permettre à un utilisateur de créer un morceau de texte et le
mettre en forme (couleur, taille de texte, gras italique, centré..) puis
sauvegarder ce texte mis en forme l'imprimer.
Seulement je veux utiliser un aperçu avant impression que j'ai créé, pour
pouvoir insérer ce texte mis en forme, parmi d'autres textes, gérés
différemment..

Je pensais utiliser un RTF Box (on trouve sur le net des mini traitements
de texte en VB6), puis récupérer les balises de mise en forme et les
transformer en balises "maison" avec lesquelles je piloterai mon
impression et donc je sauvegarderai tout cela dans une BDD access.

Question y-a-t'il un moyen d'interpréter ces données issues du RTF ?
Quelq'un a-t'il déjà creusé cette voie ?

Merci pour vos lumières

Driss



Avatar
driss hanib
Salut Patrick

Merci pour ta réponse.
Je vais tester ta version, mais le seule point qui peut gêner est que
j'intègre ces données dans un autre texte et donc je dois aussi gerer le
fait que le texte peut dépasser le bas de la page et donc gérer le saut de
page.
Je vais voir cependant comment "travaille" ta source..

Merci

Driss
"Patrick" a écrit dans le message de news:
%
Bonjour
Il existe des gens qui ont déjà travaillé sur ce type de gestion.
Le plus simple est de ne pas interpréter le RTF, mais de laisser le
controle le faire pour toi.
En cherchant sur internet, on trouve des programmes qui permettent
d'imprimer un RTF

voici un petit exemple de code que j'ai adapté pour faire exactement la
même chose (aperçu et impression d'un document) :

Dans la feuille ModRTFPrint, tu met juste un controle RTFRichtextbox
utilisé pour mettre le texte formaté
Obj est une picturebox

If Left(Text, 6) = "{rtf1" Then
' texte RTF (courrier)
Start = 0
While Start < Len(mvarText) + 1
Start = PrintRTFEcran(Obj, Text, Start, X + PosXEnCours, Y,
TXEnCours, TY, Y + TY - 850)
If mvarNbCol > 1 Then
PosXEnCours = PosXEnCours + TXEnCours + mvarEspaceCol
Obj.CurrentY = Y
If PosXEnCours >= TX Then Start = Len(mvarText) + 1
Else
Obj.CurrentY = Y + TY
Start = Len(mvarText) + 1
End If
Wend
Else
' Texte normal


'The RichTextBox provides you with a simple printing function, but this
tip shows
'you how to add margins to your print outs for a more professional look.
'Add this code to a module:

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 Const EM_SETTARGETDEVICE As Long = WM_USER + 72
Private Const PHYSICALOFFSETX As Long = 112
Private Const PHYSICALOFFSETY As Long = 113

Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long,
ByVal nIndex As Integer) As Long
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 Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal
lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As
Long, ByVal lpInitData As Long) As Long

Public Function PrintRTFEcran(Obj As PictureBox, Text As String, CharDebut
As Long, Left As Long, Top As Long, Width As Long, ByRef Height As Long,
PageHeight As Long) As Long
Dim fr As FormatRange
Dim rcDrawTo As Rect
Dim rcPage As Rect
Dim TextLength As Long
Dim r As Long

RTF.TextRTF = Text
If RTF.Text = "" Then
Unload Me
Height = 0
Exit Function
End If

' Start a print job to get a valid Printer.hDC
Obj.ScaleMode = vbTwips

' Set printable area rect
rcPage.Left = 0
rcPage.Top = 0
rcPage.Right = Printer.ScaleWidth
rcPage.Bottom = Printer.ScaleHeight

' Set rect in which to print (relative to printable area)
rcDrawTo.Left = Left
rcDrawTo.Top = Top
rcDrawTo.Right = Left + Width
rcDrawTo.Bottom = Top + Height

' Set up the print instructions
fr.hdc = Obj.hdc ' Use the same DC for measuring and rendering
fr.hdcTarget = Obj.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 = CharDebut ' Indicate start of text through
fr.chrg.cpMax = -1 ' end of the text

' impression sur la page actuelle
PrintRTFEcran = SendMessage(RTF.hWnd, EM_FORMATRANGE, True, fr)
Height = fr.rc.Bottom - Top

If PrintRTFEcran >= Len(RTF.Text) Then PrintRTFEcran = 0

' Allow the RTF to free up memory
r = SendMessage(RTF.hWnd, EM_FORMATRANGE, False, ByVal CLng(0))
Unload Me

End Function

Pour une impression vers l'imprimant, rien de plus compliqué : il suffit
de remplacer Obj par printer, et d'adapter un peu le code...

Bon courage

"Driss HANIB" a écrit dans le message de news:

Bonjour à tous

Je voudrai permettre à un utilisateur de créer un morceau de texte et le
mettre en forme (couleur, taille de texte, gras italique, centré..) puis
sauvegarder ce texte mis en forme l'imprimer.
Seulement je veux utiliser un aperçu avant impression que j'ai créé, pour
pouvoir insérer ce texte mis en forme, parmi d'autres textes, gérés
différemment..

Je pensais utiliser un RTF Box (on trouve sur le net des mini traitements
de texte en VB6), puis récupérer les balises de mise en forme et les
transformer en balises "maison" avec lesquelles je piloterai mon
impression et donc je sauvegarderai tout cela dans une BDD access.

Question y-a-t'il un moyen d'interpréter ces données issues du RTF ?
Quelq'un a-t'il déjà creusé cette voie ?

Merci pour vos lumières

Driss







Avatar
Patrick
C'est géré dans la source
PrintRTFEcran retourne l'indice du dernier caractère imprimé
si tu veut reprendre sur la page suivante, il faut reprendre à partir de cet
indice en le donnant en parametres CharDebut


"driss hanib" a écrit dans le message de news:

Salut Patrick

Merci pour ta réponse.
Je vais tester ta version, mais le seule point qui peut gêner est que
j'intègre ces données dans un autre texte et donc je dois aussi gerer le
fait que le texte peut dépasser le bas de la page et donc gérer le saut de
page.
Je vais voir cependant comment "travaille" ta source..

Merci

Driss
"Patrick" a écrit dans le message de news:
%
Bonjour
Il existe des gens qui ont déjà travaillé sur ce type de gestion.
Le plus simple est de ne pas interpréter le RTF, mais de laisser le
controle le faire pour toi.
En cherchant sur internet, on trouve des programmes qui permettent
d'imprimer un RTF

voici un petit exemple de code que j'ai adapté pour faire exactement la
même chose (aperçu et impression d'un document) :

Dans la feuille ModRTFPrint, tu met juste un controle RTFRichtextbox
utilisé pour mettre le texte formaté
Obj est une picturebox

If Left(Text, 6) = "{rtf1" Then
' texte RTF (courrier)
Start = 0
While Start < Len(mvarText) + 1
Start = PrintRTFEcran(Obj, Text, Start, X + PosXEnCours, Y,
TXEnCours, TY, Y + TY - 850)
If mvarNbCol > 1 Then
PosXEnCours = PosXEnCours + TXEnCours + mvarEspaceCol
Obj.CurrentY = Y
If PosXEnCours >= TX Then Start = Len(mvarText) + 1
Else
Obj.CurrentY = Y + TY
Start = Len(mvarText) + 1
End If
Wend
Else
' Texte normal


'The RichTextBox provides you with a simple printing function, but this
tip shows
'you how to add margins to your print outs for a more professional look.
'Add this code to a module:

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 Const EM_SETTARGETDEVICE As Long = WM_USER + 72
Private Const PHYSICALOFFSETX As Long = 112
Private Const PHYSICALOFFSETY As Long = 113

Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long,
ByVal nIndex As Integer) As Long
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 Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal
lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As
Long, ByVal lpInitData As Long) As Long

Public Function PrintRTFEcran(Obj As PictureBox, Text As String,
CharDebut As Long, Left As Long, Top As Long, Width As Long, ByRef Height
As Long, PageHeight As Long) As Long
Dim fr As FormatRange
Dim rcDrawTo As Rect
Dim rcPage As Rect
Dim TextLength As Long
Dim r As Long

RTF.TextRTF = Text
If RTF.Text = "" Then
Unload Me
Height = 0
Exit Function
End If

' Start a print job to get a valid Printer.hDC
Obj.ScaleMode = vbTwips

' Set printable area rect
rcPage.Left = 0
rcPage.Top = 0
rcPage.Right = Printer.ScaleWidth
rcPage.Bottom = Printer.ScaleHeight

' Set rect in which to print (relative to printable area)
rcDrawTo.Left = Left
rcDrawTo.Top = Top
rcDrawTo.Right = Left + Width
rcDrawTo.Bottom = Top + Height

' Set up the print instructions
fr.hdc = Obj.hdc ' Use the same DC for measuring and rendering
fr.hdcTarget = Obj.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 = CharDebut ' Indicate start of text through
fr.chrg.cpMax = -1 ' end of the text

' impression sur la page actuelle
PrintRTFEcran = SendMessage(RTF.hWnd, EM_FORMATRANGE, True, fr)
Height = fr.rc.Bottom - Top

If PrintRTFEcran >= Len(RTF.Text) Then PrintRTFEcran = 0

' Allow the RTF to free up memory
r = SendMessage(RTF.hWnd, EM_FORMATRANGE, False, ByVal CLng(0))
Unload Me

End Function

Pour une impression vers l'imprimant, rien de plus compliqué : il suffit
de remplacer Obj par printer, et d'adapter un peu le code...

Bon courage

"Driss HANIB" a écrit dans le message de news:

Bonjour à tous

Je voudrai permettre à un utilisateur de créer un morceau de texte et le
mettre en forme (couleur, taille de texte, gras italique, centré..) puis
sauvegarder ce texte mis en forme l'imprimer.
Seulement je veux utiliser un aperçu avant impression que j'ai créé,
pour pouvoir insérer ce texte mis en forme, parmi d'autres textes, gérés
différemment..

Je pensais utiliser un RTF Box (on trouve sur le net des mini
traitements de texte en VB6), puis récupérer les balises de mise en
forme et les transformer en balises "maison" avec lesquelles je
piloterai mon impression et donc je sauvegarderai tout cela dans une BDD
access.

Question y-a-t'il un moyen d'interpréter ces données issues du RTF ?
Quelq'un a-t'il déjà creusé cette voie ?

Merci pour vos lumières

Driss











Avatar
Driss HANIB
Merc Patrick

je n'avais effectivement pas vu toute la source
Je regarde

Driss

"Patrick" a écrit dans le message de news:

C'est géré dans la source
PrintRTFEcran retourne l'indice du dernier caractère imprimé
si tu veut reprendre sur la page suivante, il faut reprendre à partir de
cet indice en le donnant en parametres CharDebut


"driss hanib" a écrit dans le message de news:

Salut Patrick

Merci pour ta réponse.
Je vais tester ta version, mais le seule point qui peut gêner est que
j'intègre ces données dans un autre texte et donc je dois aussi gerer le
fait que le texte peut dépasser le bas de la page et donc gérer le saut
de page.
Je vais voir cependant comment "travaille" ta source..

Merci

Driss
"Patrick" a écrit dans le message de news:
%
Bonjour
Il existe des gens qui ont déjà travaillé sur ce type de gestion.
Le plus simple est de ne pas interpréter le RTF, mais de laisser le
controle le faire pour toi.
En cherchant sur internet, on trouve des programmes qui permettent
d'imprimer un RTF

voici un petit exemple de code que j'ai adapté pour faire exactement la
même chose (aperçu et impression d'un document) :

Dans la feuille ModRTFPrint, tu met juste un controle RTFRichtextbox
utilisé pour mettre le texte formaté
Obj est une picturebox

If Left(Text, 6) = "{rtf1" Then
' texte RTF (courrier)
Start = 0
While Start < Len(mvarText) + 1
Start = PrintRTFEcran(Obj, Text, Start, X + PosXEnCours, Y,
TXEnCours, TY, Y + TY - 850)
If mvarNbCol > 1 Then
PosXEnCours = PosXEnCours + TXEnCours + mvarEspaceCol
Obj.CurrentY = Y
If PosXEnCours >= TX Then Start = Len(mvarText) + 1
Else
Obj.CurrentY = Y + TY
Start = Len(mvarText) + 1
End If
Wend
Else
' Texte normal


'The RichTextBox provides you with a simple printing function, but this
tip shows
'you how to add margins to your print outs for a more professional look.
'Add this code to a module:

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 Const EM_SETTARGETDEVICE As Long = WM_USER + 72
Private Const PHYSICALOFFSETX As Long = 112
Private Const PHYSICALOFFSETY As Long = 113

Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long,
ByVal nIndex As Integer) As Long
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 Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal
lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As
Long, ByVal lpInitData As Long) As Long

Public Function PrintRTFEcran(Obj As PictureBox, Text As String,
CharDebut As Long, Left As Long, Top As Long, Width As Long, ByRef
Height As Long, PageHeight As Long) As Long
Dim fr As FormatRange
Dim rcDrawTo As Rect
Dim rcPage As Rect
Dim TextLength As Long
Dim r As Long

RTF.TextRTF = Text
If RTF.Text = "" Then
Unload Me
Height = 0
Exit Function
End If

' Start a print job to get a valid Printer.hDC
Obj.ScaleMode = vbTwips

' Set printable area rect
rcPage.Left = 0
rcPage.Top = 0
rcPage.Right = Printer.ScaleWidth
rcPage.Bottom = Printer.ScaleHeight

' Set rect in which to print (relative to printable area)
rcDrawTo.Left = Left
rcDrawTo.Top = Top
rcDrawTo.Right = Left + Width
rcDrawTo.Bottom = Top + Height

' Set up the print instructions
fr.hdc = Obj.hdc ' Use the same DC for measuring and rendering
fr.hdcTarget = Obj.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 = CharDebut ' Indicate start of text through
fr.chrg.cpMax = -1 ' end of the text

' impression sur la page actuelle
PrintRTFEcran = SendMessage(RTF.hWnd, EM_FORMATRANGE, True, fr)
Height = fr.rc.Bottom - Top

If PrintRTFEcran >= Len(RTF.Text) Then PrintRTFEcran = 0

' Allow the RTF to free up memory
r = SendMessage(RTF.hWnd, EM_FORMATRANGE, False, ByVal CLng(0))
Unload Me

End Function

Pour une impression vers l'imprimant, rien de plus compliqué : il suffit
de remplacer Obj par printer, et d'adapter un peu le code...

Bon courage

"Driss HANIB" a écrit dans le message de news:

Bonjour à tous

Je voudrai permettre à un utilisateur de créer un morceau de texte et
le mettre en forme (couleur, taille de texte, gras italique, centré..)
puis sauvegarder ce texte mis en forme l'imprimer.
Seulement je veux utiliser un aperçu avant impression que j'ai créé,
pour pouvoir insérer ce texte mis en forme, parmi d'autres textes,
gérés différemment..

Je pensais utiliser un RTF Box (on trouve sur le net des mini
traitements de texte en VB6), puis récupérer les balises de mise en
forme et les transformer en balises "maison" avec lesquelles je
piloterai mon impression et donc je sauvegarderai tout cela dans une
BDD access.

Question y-a-t'il un moyen d'interpréter ces données issues du RTF ?
Quelq'un a-t'il déjà creusé cette voie ?

Merci pour vos lumières

Driss















Avatar
Patrick
Pour info, c'est un source que j'ai adapté, mais trouvé sur un site
en cherchant "imprimer RTF" dans google

"Driss HANIB" a écrit dans le message de news:
%
Merc Patrick

je n'avais effectivement pas vu toute la source
Je regarde

Driss

"Patrick" a écrit dans le message de news:

C'est géré dans la source
PrintRTFEcran retourne l'indice du dernier caractère imprimé
si tu veut reprendre sur la page suivante, il faut reprendre à partir de
cet indice en le donnant en parametres CharDebut


"driss hanib" a écrit dans le message de news:

Salut Patrick

Merci pour ta réponse.
Je vais tester ta version, mais le seule point qui peut gêner est que
j'intègre ces données dans un autre texte et donc je dois aussi gerer le
fait que le texte peut dépasser le bas de la page et donc gérer le saut
de page.
Je vais voir cependant comment "travaille" ta source..

Merci

Driss
"Patrick" a écrit dans le message de
news: %
Bonjour
Il existe des gens qui ont déjà travaillé sur ce type de gestion.
Le plus simple est de ne pas interpréter le RTF, mais de laisser le
controle le faire pour toi.
En cherchant sur internet, on trouve des programmes qui permettent
d'imprimer un RTF

voici un petit exemple de code que j'ai adapté pour faire exactement la
même chose (aperçu et impression d'un document) :

Dans la feuille ModRTFPrint, tu met juste un controle RTFRichtextbox
utilisé pour mettre le texte formaté
Obj est une picturebox

If Left(Text, 6) = "{rtf1" Then
' texte RTF (courrier)
Start = 0
While Start < Len(mvarText) + 1
Start = PrintRTFEcran(Obj, Text, Start, X + PosXEnCours, Y,
TXEnCours, TY, Y + TY - 850)
If mvarNbCol > 1 Then
PosXEnCours = PosXEnCours + TXEnCours + mvarEspaceCol
Obj.CurrentY = Y
If PosXEnCours >= TX Then Start = Len(mvarText) + 1
Else
Obj.CurrentY = Y + TY
Start = Len(mvarText) + 1
End If
Wend
Else
' Texte normal


'The RichTextBox provides you with a simple printing function, but this
tip shows
'you how to add margins to your print outs for a more professional
look.
'Add this code to a module:

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 Const EM_SETTARGETDEVICE As Long = WM_USER + 72
Private Const PHYSICALOFFSETX As Long = 112
Private Const PHYSICALOFFSETY As Long = 113

Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long,
ByVal nIndex As Integer) As Long
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 Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal
lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As
Long, ByVal lpInitData As Long) As Long

Public Function PrintRTFEcran(Obj As PictureBox, Text As String,
CharDebut As Long, Left As Long, Top As Long, Width As Long, ByRef
Height As Long, PageHeight As Long) As Long
Dim fr As FormatRange
Dim rcDrawTo As Rect
Dim rcPage As Rect
Dim TextLength As Long
Dim r As Long

RTF.TextRTF = Text
If RTF.Text = "" Then
Unload Me
Height = 0
Exit Function
End If

' Start a print job to get a valid Printer.hDC
Obj.ScaleMode = vbTwips

' Set printable area rect
rcPage.Left = 0
rcPage.Top = 0
rcPage.Right = Printer.ScaleWidth
rcPage.Bottom = Printer.ScaleHeight

' Set rect in which to print (relative to printable area)
rcDrawTo.Left = Left
rcDrawTo.Top = Top
rcDrawTo.Right = Left + Width
rcDrawTo.Bottom = Top + Height

' Set up the print instructions
fr.hdc = Obj.hdc ' Use the same DC for measuring and rendering
fr.hdcTarget = Obj.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 = CharDebut ' Indicate start of text through
fr.chrg.cpMax = -1 ' end of the text

' impression sur la page actuelle
PrintRTFEcran = SendMessage(RTF.hWnd, EM_FORMATRANGE, True, fr)
Height = fr.rc.Bottom - Top

If PrintRTFEcran >= Len(RTF.Text) Then PrintRTFEcran = 0

' Allow the RTF to free up memory
r = SendMessage(RTF.hWnd, EM_FORMATRANGE, False, ByVal CLng(0))
Unload Me

End Function

Pour une impression vers l'imprimant, rien de plus compliqué : il
suffit de remplacer Obj par printer, et d'adapter un peu le code...

Bon courage

"Driss HANIB" a écrit dans le message de
news:
Bonjour à tous

Je voudrai permettre à un utilisateur de créer un morceau de texte et
le mettre en forme (couleur, taille de texte, gras italique, centré..)
puis sauvegarder ce texte mis en forme l'imprimer.
Seulement je veux utiliser un aperçu avant impression que j'ai créé,
pour pouvoir insérer ce texte mis en forme, parmi d'autres textes,
gérés différemment..

Je pensais utiliser un RTF Box (on trouve sur le net des mini
traitements de texte en VB6), puis récupérer les balises de mise en
forme et les transformer en balises "maison" avec lesquelles je
piloterai mon impression et donc je sauvegarderai tout cela dans une
BDD access.

Question y-a-t'il un moyen d'interpréter ces données issues du RTF ?
Quelq'un a-t'il déjà creusé cette voie ?

Merci pour vos lumières

Driss