2011-04-11 9 views
5

Esto sucede con todos los controles ActiveX. Si reposiciono un control ActiveX con DeferWindowPosComportamiento raro de DeferWindowPos

HDWP hdwp = BeginDeferWindowPos(1); 
DeferWindowPos(hdwp, m_pActiveX->GetSafeHwnd(), NULL, left, top, width, height, SWP_NOZORDER); 
EndDeferWindowPos(hdwp); 

que va allí pero luego se mueve/cambia de tamaño para su edad rectángulo vez que haga clic en cualquier lugar dentro del control. Si uso MoveWindow lugar

m_pActiveX->MoveWindow(left, top, width, height); 

esto no sucede.

No ocurre con ningún otro tipo de control, solo con controles ActiveX, pero sucede con todos ellos. Hice una prueba para confirmar esto, creé un nuevo proyecto de control ActiveX y no realicé ningún cambio, y el problema todavía estaba allí.

Respuesta

6

Nunca recibió una respuesta adecuada. Trataré de ayudar un poco aquí.

El problema es que MFC esconde muchos de los problemas con el alojamiento de un control ActiveX dentro de su marco. Específicamente, si ingresa a la llamada MoveWindow, no es simplemente un contenedor de la función Win32 MoveWindow. Llama a las clases de soporte del contenedor de control OLE. Esto básicamente dice que, si tenemos una interfaz de sitio de control, entonces llama a COleControlSite :: MoveWindow, de lo contrario llama al Win32 MoveWindow estándar. Lo mismo ocurre con varias otras funciones de ventana manejadas por CWnd, etc. Por ejemplo, COleControlSite :: SetWindowPos maneja ocultar/mostrar el control, luego llama a COleControlSite :: MoveWindow para moverlo, y finalmente llama a :: SetWindowPos (con las banderas mover/mostrar enmascarado) para manejar el resto.

Una vez dentro de COleControlSite :: MoveWindow, observará que hace varias cosas: llama a SetExtent, actualiza su miembro m_rect interno y luego llama a SetObjectRects.

Pasar por alto estos para los controles ActiveX usando la API Win32 directamente (por ejemplo, a través de DeferWindowPos) hace que algunos de estos pasos cruciales se pierdan. Dependiendo de cómo se distribuye su código, generalmente puede manejarlo usted mismo.

1

¿Cuál es este control ActiveX?

Aparte de eso, considere que DeferWindowPos es para posicionar varias ventanas al mismo tiempo. El concepto es que ingrese el enunciado comenzar, cambie un montón de posiciones de ventana para un nuevo diseño, luego termine para mover y aplicar las nuevas posiciones y tamaños.

Si no está actualizando varias ventanas, considere usar SetWindowPos.

Considere también que puede recibir un mensaje para mover, cambiar el tamaño o cambiar la posición de Windows mientras pospone. Para evitar esto, si eso es lo que sucede, pase el indicador SWP_NOSENDCHANGING en cada llamada al DeferWindowPos para que no se envíe o maneje el mensaje y borre todos los bits en la estructura WINDOWPOS recibida para evitar cambios no deseados.

También es posible que esta llamada falle ... ¿está revisando el valor de retorno?

+0

Hola, gracias por responder. Estoy actualizando varias ventanas, el código que puse fue simplificado y solo fue para ilustrar el problema, no el código fuente exacto. El control ActiveX es un control de vista previa en PDF hecho por Amyuni. DeferWindowPos no falla, sino que vuelve a colocar la ventana, pero después de hacer clic en ella, la ventana 'salta' a su antiguo tamaño y posición.Eso es lo extraño, que se reposiciona, pero luego parece cambiar su posición por sí mismo (una vez que haces clic en él). – sashoalm

+0

Ah, en ese caso, parece que el control en sí mismo está restableciendo su posición cuando se enfoca. Es posible que necesite enviar un correo electrónico a Amyuni para obtener una respuesta definitiva ... – AJG85

+0

Hm, parece que el problema no está con Amyuni, lo mismo sucedió cuando hice un nuevo control ActiveX desde el nuevo asistente de proyecto en VS. Tenía exactamente el mismo problema. Esto podría ser un problema con todos los controles ActiveX. Me pregunto cuál es la diferencia entre mi llamada DeferWindowPos y MoveWindow, podría ser que debería verificar lo que está sucediendo con Spy ++ – sashoalm

Cuestiones relacionadas