Método InkStart
Os métodos InkStart, InkDraw e InkStop usam constructos de GUI do Win32, como contextos de dispositivo e objetos de caneta. Isso ilustra por que o CGuiPaper é necessário como um nível separado de encapsulamento. Os aspectos da GUI do papel de desenho são tratados no CGuiPaper. O objeto COPaper recebe apenas dados de tinta.
Outro motivo de design para o nível de encapsulamento CGuiPaper é a natureza dupla de seus métodos InkStart, InkDraw e InkStop . Eles não só chamam o COPaper para registrar os dados de tinta como eles ocorrem, eles também pintam uma imagem visual do desenho como ele ocorre. CGuiPaper mantém um sinalizador m_bInkSaving para gerenciar essa natureza dupla. Quando m_bInkSaving é FALSE, a imagem é desenhada na tela, mas os dados não são enviados ao COPaper para gravação.
Esse esquema é usado na repintagem quando o usuário não está movendo o mouse, mas os dados de tinta do COPaper estão sendo ressentidos com O CGuiPaper para repintamento automático. O CGuiPaper pode ser orientado a definir o sinalizador m_bInkSaving chamando seu método InkSaving .
Os snippets de código de exemplo a seguir ilustram os métodos InkStart de GUIPAPER. CPP E COLETOR. 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)
O StoClien recebe os dados de desenho na forma de chamadas para a interface IPaperSink conectada em seu objeto COPaperSink. Esses métodos correspondem aos métodos InkStart, InkDraw e InkStop semelhantes em 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;
}
Quando InkStart é chamado no coletor, ele chama CGuiPaper para desativar o salvamento de tinta no COPaper. O COPaper não precisa receber uma cópia ecoada dos dados que está enviando. Quando InkDraw é chamado no coletor, ele simplesmente passa a chamada para CGuiPaper::InkDraw. Quando InkStop é chamado no coletor, CGuiPaper é chamado para ativar novamente o salvamento de tinta. O resultado é uma reprodução dos dados de tinta do COPaper para CGuiPaper somente para exibição.
Você pode testar o comportamento do StoClien quando seu IPaperSink é desconectado escolhendo a opção Desconectar no menu Coletor. Como um experimento, depois de desconectar o coletor, escolha Sobre no menu Ajuda. Isso mostrará a caixa de diálogo Sobre, que cobrirá parte do desenho do StoClien. Clique em OK na caixa de diálogo Sobre. Observe que a parte do desenho que foi coberta agora se foi. Os dados de desenho não são perdidos, mas parte da imagem é. O cliente recebeu a mensagem WM_PAINT e emitiu o método IPaper::Redraw . Mas como o coletor não estava conectado, ele não recebeu as chamadas IPaperSink para repintar o desenho.
Você também pode testar esse comportamento minimizando StoClien e restaurando-o. Nesse caso, toda a imagem de desenho é perdida e precisa ser repintagem. Para repintar a imagem de desenho após qualquer um desses testes, use o menu Coletor para se reconectar e escolha Redesenhar no menu Desenhar.