Compartilhar via


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.