Nosotros adaptamos -- mediante el uso de OLE -- el "look&feel" de Word
cuando visualizamos documentos dentro de nuestra aplicación a fin de impedir
al usuario cualquier operación sobre dicho documento (ocultamos todas las
barras de herramientas y la barra de menús y luego ocultamos la barra de
título de la ventana para impedir que la mueva).
Con la versión 2007 de Office, algunos comandos OLE y/o del API de Windows
parecen no surtir efecto y no nos es posible quitar las barras de
herramientas, menús desplegables, barra de título de Word, ... de manera que
el usuario puede acceder a todas las funcionalidades e incluso mover la
ventana de Word dentro de la aplicación. El aspecto del intento de
integración conseguido para Word 2007 (el documento Word contenido en este
ejemplo es distinto al anterior).
Según hemos podido indagar en la web, el problema parece haber surgido al
incluirse en esta nueva versión los conceptos de "Barra de Herramientas de
Acceso Rápido" (la pequeñita de arriba a la izquierda sobre el título de
Word), "Botón de Office" (el botón grande de arriba a la izquierda que
despliega menús) y la "Cinta de Opciones" (los menús desplegables que
muestran más botones). Hemos intentado buscar en la web como solventar esto
aspecto usual de versiones anteriores -- pero hasta ahora no hemos conseguido
nada.
A continuación indico en pseudocódigo los pasos que seguimos para integrar
Word en la aplicación, incluyendo las llamadas al API de Windows:
- Creamos el objeto OLE de automatización OLE para "Word.Application".
- Mediante la propiedad "Caption" del objeto OLE recién creado, cambiamos
el título de la ventana asociada a dicho objeto OLE.
- Usando la función FindWindowExA de la "User32.dll" (API de Windows)
localizamos el handle de la ventana recién abierta.
- Usando la función SetParent de la "User32.dll" (API de Windows) asignamos
como padre de la ventana de Word a la ventana principal de nuestro aplicativo
financiero.
- Usando la función SetForegroundWindow de la "User32.dll" (API de Windows)
ponemos en primer plano la ventana principal de nuestro aplicativo financiero.
- Mediante la asignación de distintas propiedades del objeto OLE creado
para Word:
- Ocultamos Word.
- Impedimos que Word se refresque para que la ejecución de todo lo demás
vaya más rápido (así no repagina ni nada mientras jugamos con el documento).
- Abrimos el documento a mostrar.
- Activamos dicho documento dentro de Word.
- Usando la función GetWindowLongA de la "User32.dll" (API de Windows)
leemos las propiedades de la ventana de Word.
- Usando la función SetWindowLongA de la "User32.dll" (API de Windows)
quitamos de las propiedades de la ventana de Word los botones de minimizar,
maximizar, cerrar, el menú de la esquina superior izquierda (que permite
también todas estas opciones) y la barra de título de la ventana de Word.
- Mediante la asignación de distintas propiedades del objeto OLE creado
para Word:
- Protegemos el documento abierto en Word.
- Cogemos la subventana activa de Word y le aplicamos la vista en modo
"Vista para Impresión".
- Maximizamos dicha subventana dentro del propio Word (por si tenían vista
mosaico o similar).
- Ocultamos las reglas (propiedad "DisplayRulers").
- Para cada barra de herramientas, ponemos su propiedad "Enabled" a 0,
para que no se muestren (los menús desplegables son también una de estas
barras).
- Permitimos que Word se refresque (propiedad "ScreenUpdating").
- Quitamos la barra de scroll horizontal.
- Ponemos el estado de la ventana activa de la aplicación ("WindowState")
a wdWindowStateNormal, porque si está maximizada, no deja redimensionarla.
- Cambiamos el tamaño de la ventana de Word a lo que necesita nuestro
aplicativo financiero.
- Situamos la ventana de Word en la posición que le interesa a nuestro
aplicativo financiero.
- Hacemos visible Word.
- Quitamos la StatusBar de Word.
- Ponemos el zoom de Word a wdPageFitBestFit para que se muestre el
documento a todo lo ancho en el hueco permitido.
- Mostramos la ventana de nuestro aplicativo que contiene a la de Word.
- Usando la función SetWindowPos de la "User32.dll" (API de Windows)
ponemos la ventana de Word arriba según el z-orden sin moverla ni cambiar su
tamaño.
- Usando la función RedrawWindow de la "User32.dll" (API de Windows)
forzamos el repintado de la ventana de Word.que evita que parte de él quede a
veces como borrado hasta que el usuario (usamos los flags RDW_INVALIDATE +
RDW_INTERNALPAINT + RDW_ALLCHILDREN + RDW_UPDATENOW + RDW_ERASENOW)
Leer las respuestas