Cómo: Implementar el seguimiento en el código
Para realizar un seguimiento de un elemento OLE, debe controlar determinados eventos relacionados con el elemento, como hacer clic en el elemento o actualizar la vista del documento. En todos los casos, es suficiente declarar un objeto CRectTracker temporal y manipular el elemento mediante este objeto.
Cuando un usuario selecciona un elemento o inserta un objeto con un comando de menú, debe inicializar el seguimiento con los estilos adecuados para representar el estado del elemento OLE. En la tabla siguiente se describen las convenciones usadas por el ejemplo OCLIENT. Para más información sobre estos estilos, consulte CRectTracker
.
Estilos y estados de contenedor del elemento OLE
Estilo mostrado | Estado del elemento OLE |
---|---|
Borde punteado | El elemento está vinculado. |
Borde sólido | El elemento está insertado en el documento. |
Controladores de tamaño | El elemento está seleccionado actualmente. |
Borde sombreado | El elemento está actualmente activo en contexto. |
El patrón de sombreado se superpone sobre el elemento | El servidor del elemento está abierto. |
Puede controlar esta inicialización fácilmente mediante un procedimiento que comprueba el estado del elemento OLE y establece los estilos adecuados. La función SetupTracker
que se encuentra en el ejemplo OCLIENT muestra la inicialización del seguimiento. Los parámetros de esta función son la dirección del seguimiento, pTracker; el puntero al elemento de cliente relacionado con el seguimiento, pItem; y un puntero a un rectángulo, pTrueRect. Para un ejemplo más completo de esta función, vea el ejemplo OLE OCLIENT de MFC.
En el ejemplo de código SetupTracker se presenta una sola función; las líneas de la función se intercalan con la explicación de las características de la función:
void CMainView::SetupTracker(CRectTracker* pTracker, CRectItem* pItem,
CRect* pTrueRect)
El seguimiento se inicializa estableciendo el tamaño mínimo y borrando el estilo del seguimiento.
// set minimum size for our OLE items
pTracker->m_sizeMin.cx = 8;
pTracker->m_sizeMin.cy = 8;
pTracker->m_nStyle = 0;
Las líneas siguientes comprueban si el elemento está seleccionado actualmente y si el elemento está vinculado al documento o está insertado en él. Los identificadores de cambio de tamaño ubicados en el interior del borde se agregan al estilo, lo que indica que el elemento está seleccionado actualmente. Si el elemento está vinculado al documento, se usa el estilo de borde de puntos. Si el elemento está insertado, se usa un borde sólido.
// setup resize handles if item is selected
if (pItem == m_pSelection)
pTracker->m_nStyle |= CRectTracker::resizeInside;
// put correct border depending on item type
if (pItem->GetType() == OT_LINK)
pTracker->m_nStyle |= CRectTracker::dottedLine;
else
pTracker->m_nStyle |= CRectTracker::solidLine;
El código siguiente superpone el elemento con un patrón sombreado si el elemento está abierto actualmente.
// put hatching over the item if it is currently open
if (pItem->GetItemState() == COleClientItem::openState ||
pItem->GetItemState() == COleClientItem::activeUIState)
{
pTracker->m_nStyle |= CRectTracker::hatchInside;
}
Después, puede llamar a esta función cada vez que se tenga que mostrar el seguimiento. Por ejemplo, llame a esta función desde la función OnDraw
de la clase de vista. Esto actualiza la apariencia del seguimiento cada vez que se vuelve a dibujar la vista. Para obtener un ejemplo completo, vea la función CMainView::OnDraw
del ejemplo OLE OCLIENT de MFC.
En la aplicación, se producirán eventos que requieren código de seguimiento, como el cambio de tamaño, el movimiento o la detección de aciertos. Estas acciones suelen indicar que se está intentando agarrar o mover el elemento. En estos casos, deberá decidir qué se ha agarrado: un identificador de cambio de tamaño o una parte del borde entre los identificadores de cambio de tamaño. El controlador de mensajes OnLButtonDown
es un buen lugar para probar la posición del mouse en relación con el elemento. Llame a CRectTracker::HitTest
. Si la prueba devuelve algo además de CRectTracker::hitOutside
, el elemento se cambia de tamaño o se mueve. Por lo tanto, debe realizar una llamada a la función miembro Track
. Vea la función CMainView::OnLButtonDown
del ejemplo OLE OCLIENT de MFC para un ejemplo completo.
La clase CRectTracker
proporciona varias formas de cursor diferentes que se usan para indicar si se está llevando a cabo una operación de movimiento, cambio de tamaño o arrastre. Para controlar este evento, compruebe si el elemento que se encuentra actualmente bajo el mouse está seleccionado. Si es así, realice una llamada a CRectTracker::SetCursor
, o llame al controlador predeterminado. El ejemplo siguiente procede del ejemplo OLE OCLIENT de MFC:
BOOL CMainView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (pWnd == this && m_pSelection != NULL)
{
// give the tracker for the selection a chance
CRectTracker tracker;
SetupTracker(&tracker, m_pSelection);
if (tracker.SetCursor(this, nHitTest))
return TRUE;
}
return CScrollView::OnSetCursor(pWnd, nHitTest, message);
}
Consulte también
Seguimiento: Implementar el seguimiento en la aplicación OLE