Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los métodos InkStart, InkDraw y InkStop usan construcciones gui de Win32, como contextos de dispositivo y objetos de lápiz. Esto ilustra por qué CGuiPaper es necesario como un nivel independiente de encapsulación. Los aspectos de gui del papel de dibujo se controlan en CGuiPaper. El objeto COPaper solo se envía a los datos de entrada de lápiz.
Otro motivo de diseño para el nivel de encapsulación CGuiPaper es la naturaleza dual de sus métodos InkStart, InkDraw y InkStop . No solo llaman a COPaper para registrar los datos de entrada de lápiz tal como ocurre, sino que también pintan una imagen visual del dibujo a medida que se produce. CGuiPaper mantiene una marca de m_bInkSaving para administrar esta naturaleza dual. Cuando m_bInkSaving es FALSE, la imagen se dibuja en pantalla, pero los datos no se envían a COPaper para su grabación.
Este esquema se usa para volver a pintar cuando el usuario no mueve el mouse, pero los datos de entrada de lápiz de COPaper se vuelven a enviar a CGuiPaper para volver a pintar automáticamente. Se puede indicar a CGuiPaper que establezca la marca m_bInkSaving llamando a su método InkSaving .
En los siguientes fragmentos de código de ejemplo se muestran los métodos InkStart de GUIPAPER. CPP Y RECEPTOR. CPP.
Método InkStart (GUIPAPER). CPP)
HRESULT CGuiPaper::InkStart(
SHORT nX,
SHORT nY)
{
HRESULT hr = E_FAIL;
if (m_nLockKey || (!m_nLockKey && !m_bInkSaving))
{
// Start an ink drawing sequence only if one is not in progress.
if (!m_bInking)
{
// Remember start position.
m_OldPos.x = nX;
m_OldPos.y = nY;
// Delete old pen.
if (m_hPen)
DeleteObject(m_hPen);
// Create and select the new drawing pen.
m_hPen = CreatePen(PS_SOLID, m_nInkWidth, m_crInkColor);
SelectObject(m_hDC, m_hPen);
hr = NOERROR;
// Ask the Paper object to mark the start of the ink drawing
// sequence in the current ink color.
if (m_pIPaper && m_bInkSaving)
{
hr = m_pIPaper->InkStart(
m_nLockKey,
nX,
nY,
m_nInkWidth,
m_crInkColor);
// Capture the Mouse.
SetCapture(m_hWnd);
// We've modified the ink data--it is now "dirty" with
// respect to the compound file image. Set dirty flag.
m_bDirty = TRUE;
}
// Set inking flag to TRUE.
m_bInking = TRUE;
}
}
return hr;
}
Método InkStart (SINK. CPP)
StoClien recibe los datos de dibujo en forma de llamadas a la interfaz IPaperSink conectada en su objeto COPaperSink. Estos métodos corresponden a los métodos InkStart, InkDraw y InkStop similares en CGuiPaper.
STDMETHODIMP COPaperSink::CImpIPaperSink::InkStart(
SHORT nX,
SHORT nY,
SHORT nWidth,
COLORREF crInkColor)
{
// Turn off ink saving to the COPaper object.
m_pBackObj->m_pGuiPaper->InkSaving(FALSE);
// Play the data back to the CGuiPaper for display only.
m_pBackObj->m_pGuiPaper->InkWidth(nWidth);
m_pBackObj->m_pGuiPaper->InkColor(crInkColor);
m_pBackObj->m_pGuiPaper->InkStart(nX, nY);
return NOERROR;
}
Cuando se llama a InkStart en el receptor, llama a CGuiPaper para desactivar el guardado de tinta en COPaper. CoPaper no necesita recibir una copia eco de los datos que está enviando. Cuando se llama a InkDraw en el receptor, simplemente pasa la llamada a CGuiPaper::InkDraw. Cuando se llama a InkStop en el receptor, se llama a CGuiPaper para volver a guardar la entrada de lápiz. El resultado es una reproducción de los datos de entrada de lápiz de COPaper a CGuiPaper solo para su visualización.
Puede probar el comportamiento de StoClien cuando su IPaperSink está desconectado eligiendo la opción Desconectar en el menú Receptor. Como experimento, después de desconectar el receptor, elija Acerca de en el menú Ayuda. Esto mostrará el cuadro de diálogo Acerca de, que abarcará parte del dibujo de StoClien. Haga clic en Aceptar en el cuadro de diálogo Acerca de . Observe que la parte del dibujo que se ha cubierto ha desaparecido. Los datos de dibujo no se pierden, pero parte de la imagen es . El cliente recibió el mensaje de WM_PAINT y emitió el método IPaper::Redraw . Pero como el receptor no estaba conectado, no recibió las llamadas IPaperSink para volver a dibujar el dibujo.
También puede probar este comportamiento minimizando StoClien y restaurandolo. En este caso, se pierde toda la imagen de dibujo y necesita volver a dibujar. Para volver a dibujar la imagen de dibujo después de cualquiera de estas pruebas, use el menú Receptor para volver a conectarse y, a continuación, elija Volver a dibujar en el menú Dibujar.