Page 1 sur 1

copier du texte formatté

Publié : lun. 23/mai/2005 16:31
par Dr. Dri
je n'ai trouvé nulle part comment copier (dans le presse papier) du texte formatté... manuellement bien entendu...

par exemple je voudrais copier
"texte" en Arial souligné 18

des pistes avec les api peut-être ?

Dri

Publié : lun. 23/mai/2005 16:40
par Heis Spiter
Peut-être une piste, l'éditeur de PureBasic le fait...

Publié : lun. 23/mai/2005 16:44
par Dr. Dri
il fait un simple copier api de l'editor gadget en cours
moi je voudrais le faire sans gadget même invisible

Dri

Publié : lun. 23/mai/2005 17:04
par Anonyme2
Dr. Dri a écrit :il fait un simple copier api de l'editor gadget en cours
moi je voudrais le faire sans gadget même invisible

Dri
J'ai regardé vite fait dans la doc MS

je pense qu'avec l'API SetClipboardData, tu pourras faire ce que tu veux (enfin essaye)

Il faut d'abord utilioser l'API OpenClipboard pour ouvrir le presse papier, puis vider le presse papier avec l'API EmptyClipboard, puis SetClipboardData et enfin l'API CloseClipboard

Publié : lun. 23/mai/2005 17:44
par Progi1984
Et en copiant le pressepapiers, au format RTF ?

Publié : lun. 23/mai/2005 17:53
par Dr. Dri
Progi1984 a écrit :Et en copiant le pressepapiers, au format RTF ?
c'est trop simple pour que j'y pense :lol:
je teste...

sinon je regarderai du côté des pistes de Denis ^^

Dri

[edit]
d'apres un exemple de kiriasse
http://purebasic.hmt-forum.com/viewtopic.php?t=2785

Code : Tout sélectionner

DefType.s

;- sEnTeteRTF
NL= Chr(13) + Chr(10)
sEnTeteRTF = "{\rtf1 \ansi \deftab1134 \deff0 \fs18" + NL
sEnTeteRTF = sEnTeteRTF + "{\fonttbl" + NL
sEnTeteRTF = sEnTeteRTF + "{\f0 \fswiss Arial;}" + NL
sEnTeteRTF = sEnTeteRTF + "{\f1 \froman Times New Roman;}" + NL
sEnTeteRTF = sEnTeteRTF + "}" + NL
sEnTeteRTF = sEnTeteRTF + "{\colortbl" + NL
sEnTeteRTF = sEnTeteRTF + ";" + NL
sEnTeteRTF = sEnTeteRTF + "\red0\green0\blue0;" + NL
sEnTeteRTF = sEnTeteRTF + "\red255\green0\blue0;" + NL
sEnTeteRTF = sEnTeteRTF + "}" + NL

;- sInfoRTF
sInfoRTF = sEnTeteRTF + NL + "{" + NL
sInfoRTF = sInfoRTF + "\plain \cf2 \fs30 \qc \li0 \b TEXTE AU FORMAT RTF" + NL
sInfoRTF = sInfoRTF + "\par" + NL
sInfoRTF = sInfoRTF + "\par"+ NL
sInfoRTF = sInfoRTF + "\plain \f0 \fs20 \cf0 \ql \li100 \ri0 • Ceci est une petite démo qui consiste à afficher du texte au format RTF dans un EditorGadget de PureBasic." + NL
sInfoRTF = sInfoRTF + "\par" + NL
sInfoRTF = sInfoRTF + "\par" + NL
sInfoRTF = sInfoRTF + "\plain \f0 \fs20 \cf0 \ql \li100 \ri100 \b • Caractères gras" + NL
sInfoRTF = sInfoRTF + "\par" + NL
sInfoRTF = sInfoRTF + "\par" + NL
sInfoRTF = sInfoRTF + "\plain \f0 \fs20 \cf0 \ql \li100 \ri100 \i • Caractères en (dr)italique" + NL
sInfoRTF = sInfoRTF + "\par" + NL
sInfoRTF = sInfoRTF + "\par" + NL
sInfoRTF = sInfoRTF + "}}" + NL

;- presse papier
SetClipboardText(sInfoRTF)
MessageRequester("", "copié dans le presse papier")
End
ca ne fonctionne pas :(

je vais donc chercher un peu avec les api...

Dri

Publié : lun. 23/mai/2005 18:37
par nico

Code : Tout sélectionner

; Nico
; PB V3.93, le 23/05/05
; Copier du texte au format RTF
; dans le Presse Papier

Procedure.b SetRichTextClipboard()
  uformat=RegisterClipboardFormat_("Rich Text Format")
  If OpenClipboard_(0)
    EmptyClipboard_()
    chaine$="{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fswiss\fcharset0 Arial}}\uc1\pard\ul\f0\fs36 Texte}" 
    Hmem=GlobalAlloc_(#GPTR,Len(chaine$))
    If Hmem
      *lpmem=GlobalLock_(Hmem)
      If *lpmem
        CopyMemory(chaine$,*lpmem,Len(chaine$))
        If SetClipboardData_(uformat,*lpmem)
          Valeur.b=1
        EndIf 
        GlobalUnLock_(Hmem)
      EndIf 
      GlobalFree_(Hmem)
    EndIf 
    CloseClipboard_() 
  EndIf 
  ProcedureReturn Valeur
EndProcedure 

SetRichTextClipboard() 
J'ai remarqué un truc, si on exécute ce code et on ouvre WordPad et on fait coller, ça marche.
Mais si on fait ensuite un copier d'un autre texte dans Wordpad et on exécute de nouveau le code et on fait un coller, c'est le texte de Wordpad qui s'affiche!

[Edit]
Non, c'est bon je viens de corriger, évidemment si j'oublie de vider le Presse Papier!

[EDIT]
J'ai arrangé le code.
:)

Publié : mar. 24/mai/2005 12:55
par Dr. Dri
oké ton code fonctionne nickel, sauf sur les windows 9x
c'est assez embetant...

Dri

Publié : mar. 24/mai/2005 16:32
par nico
Dès que je pourrais, je ferais des essais sur Win98; je me demande si c'est pas la chaine elle même qui pose problème!

Publié : mer. 25/mai/2005 9:27
par Dr. Dri
je te remercie :D

Dri

Publié : mer. 25/mai/2005 17:29
par nico
Je n'ai pas de bonnes nouvelles!

Toutes les fonctions ont l'air de donner le résultat attendu, mais au final, la chaine n'est pas copié comme on s'y attend.

Je ne sais pas. 8O

Publié : lun. 30/mai/2005 7:33
par ZapMan
Essaye voir avec ça au début du code :

OpenLibrary(#PB_Any,"RICHED32.DLL")

Publié : lun. 30/mai/2005 8:45
par Dr. Dri
les appels d'api ne gèrent pas automatiquement les ouvertures de biblio ?
sinon quelle fonction utiliser dans riched32 ??

Dri

Publié : lun. 30/mai/2005 22:05
par ZapMan
Je sais pas trop....

C'est juste qu'une fois j'ai utilisé un zone texte RTF (dans la fenêtre A propos de.. de SoundEditor) et que ça a refusé de fonctionner jusqu'à ce que j'ajoute cette ligne au début de mon code.

Ca permettrait au moins de voir si W98 à cette DLL en standard ou si il faut lui ajouter. Je ne peux pas faire de test, j'ai XP et chez moi ça marche nickel.