.net - texto - porque no puedo copiar y pegar imagenes en word
¿Cómo funciona Copiar Pegar de texto formateado? (3)
Estoy confundido acerca de lo que implementa la funcionalidad de copiar y pegar. Esto es exactamente con lo que estoy confundido:
Cuando copio texto formateado de MS Word (que usa un lenguaje de marcado diferente al HTML) y lo pego en un editor RTF en un navegador web como gmail o http://www.freerichtexteditor.com/index.php?inc=demo/index el formato se conserva, pero ahora el marcado se convierte en HTML. ¿Cómo pasó esto? ¿Qué se hizo cargo de la conversión?
Y si hubiera pegado este texto en alguna otra aplicación, se convertirá en ese formato. Si copié alguna página html y la pegué en word, habrá una conversión de marcado de HTML a word. De nuevo, ¿cómo?
Luego, si pego este texto formateado copiado en un editor de texto como el Bloc de notas, se perderá todo el formato y se eliminará el marcado. ¿Qué aplicación eliminó el marcado y lo convirtió en texto plano?
Cuando copio texto con formato, ¿qué se copia exactamente en el portapapeles? Soy un programador .NET C #. ¿Cómo programaría esto?
Dos cosas pasan para que esto funcione. Primero, las aplicaciones de origen copian los datos en el portapapeles en múltiples formatos si es posible. Por ejemplo, podría proporcionar formatos HTML, RTF, DOC y texto plano. En segundo lugar, la aplicación de destino está escrita para poder pegar desde múltiples formatos si es posible. Por ejemplo, primero puede buscar RTF y si eso no está disponible, puede pegar texto sin formato y, si ninguno está disponible, no puede pegar en absoluto.
Ha pasado un tiempo desde que usé las funciones del portapapeles, pero si recuerdo correctamente, es posible que la aplicación de origen indique qué formatos puede proporcionar sin hacer la conversión completa y la transferencia de datos al portapapeles. La conversión real solo se realiza cuando otras aplicaciones realmente solicitan los datos del portapapeles en un formato específico.
Hay algunos visores del portapapeles ( clipbrd.exe en win xp, por ejemplo) que puede usar para ver qué datos se almacenan en el portapapeles; este comportamiento se debe a que la aplicación de origen o el destino (que encontrará exactamente en el visor del portapapeles) es compatible con ese tipo de datos, y convertido de manera apropiada.
Los datos en el portapapeles se amplían con los registros de FORMATETC:
http://msdn.microsoft.com/en-us/library/ms682177%28VS.85%29.aspx
El registro FORMATETC contiene como primer campo un miembro cfFormat
que describe el formato del archivo. cfFormat
puede ser un valor predefinido como CF_UNICODETEXT
o CF_BITMAP
o un tipo definido por la aplicación definido por, por ejemplo, Microsoft Word.
Al parecer, en .NET puede consultar el objeto del Clipboard
para averiguar qué formatos de datos contiene:
http://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.aspx
El método que está buscando es Clipboard.SetData
:
Si no conoce el formato de la aplicación de destino, puede almacenar datos en múltiples formatos utilizando este método.
Los datos almacenados con este método se pueden convertir a un formato compatible cuando se recuperan.
Para recuperar datos del Portapapeles en un formato particular, primero use el método ContainsData para determinar si el Portapapeles contiene datos en ese formato antes de recuperarlos con el método GetData
En cuanto a su pregunta concreta, cómo funciona en Word, los enlaces anteriores le darán suficiente información para escribir usted mismo un pequeño visor de portapapeles. Dado que Microsoft Word puede generar archivos HTML, supongo que Word escribe los datos en el portapapeles como texto simple, HTML, RTF y en formato Word.