Transférer du texte au presse-papiers
Pour transférer les données de type texte (type CF_TEXT), il faudra utiliser des fonctions plutôt anciennes, mais compatibilité oblige..
Tout d'abord récupérer un handle sur un bloc
mémoire relogeable pour lequel il faudra indiqué la taille
voulue (classique !)
hMem = GlobalAlloc (GHND, (DWORD) length + 1);
Où length est la taille du texte à envoyer, +1 car il ne faut
pas oublier le NULL à la fin du texte !
Le drapeau GHND permet de mettre la zone mémoire à 0. Il ne sera
donc pas nécessaire de transmettre le caractère NULL.
GHND étant la combinaison de GMEM_MOVEABLE et GMEM_ZEROINIT (Voir chapitre
sur l'allocation mémoire)
Puis, si hMem est différent de 0, demandez un pointeur sur cette mémoire et comme la zone mémoire est relogeable, il faudra que le système la vérouille, sinon le pointeur n'a pas de signification !
lpMem = GlobalLock (hMem);
Vous pourrez ensuite copier la chaîne de caractères dans le tampon.
Puis dévérouillez le bloc mémoire: GlobalUnlock (hMem);
Enfin, indiquez au presse-papiers la zone mémoire contenant les données et le type de données.
En commençant par ouvrir le presse-papiers
BOOL OpenClipboard (HWND);
Il faut impérativement tester la valeur en sortie (contrairement à ce qui pouvait être dit sous Windows 3.1), car une autre application peut-être en train d'accéder au presse-papiers.
Si tout est ok, Vider celui-ci (il y a peut-être déjà des
données):
EmptyClipboard();
Indiquer le type des données et le handle de la zone mémoire
contenant les données:
SetClipboardData (CF_TEXT, hMem);
A partir de
maintenant, il faut considérer que l'application n'est plus propriétaire
de la zone mémoire contenant les données.
Le presse-papiers a effectué une commande de type GlobalReAlloc (hMem,
0L, GMEM_MODIFY | GMEM_SHARE);
Expliquant ainsi qu'à la fin de votre application, les données
soient toujours conservées dans le presse-papiers.
En fait, c'est la fonction EmptyClipboard() qui va détruire le bloc mémoire.
Par conséquent, il faudra considérer que la valeur du handle hMem
est invalide. Il est ainsi préférable de mettre la valeur 0 dans
la variable utilisée pour éviter toutes erreurs ensuite.
hMem = 0;
Il ne faut
surtout pas donner au presse papiers un bloc mémoire vérouillé,
dévérouillez le avant !
Il est tout
à fait possible de passer une valeur NULL à la place de hMem.
Mais il s'agit d'un cas particulier qui sera étudié dans le chapitre
restitution différée.
Puis terminez la communication avec le presse-papiers:
CloseClipboard();
N'oubliez pas
de refermer le presse papiers !
Voici un exemple avec un menu qui propose copier/coller.
Seule la partie copier est programmée, la seconde partie sera étudiée dans le chapitre suivant.
L'option copier place le texte "Hello World..." dans le presse-papiers. Pour vérifier que cela marche, lancez par exemple le bloc note puis faîtes coller dedans. Le texte devrait apparaître !