Methode InkStart

InkStart, InkDrawen InkStop methoden maken allemaal gebruik van Win32 GUI-constructies, zoals apparaatcontexten en penobjecten. Dit illustreert waarom CGuiPaper nodig is als een afzonderlijk niveau van inkapseling. De GUI-aspecten van het tekenpapier worden verwerkt in CGuiPaper. Het COPaper-object wordt alleen inktgegevens verzonden.

Een andere ontwerpreden voor het CGuiPaper-niveau van inkapseling is de dubbele aard van de InkStart, InkDrawen InkStop methoden. Ze roepen copaper niet alleen op om de inktgegevens vast te leggen zoals deze zich voordoen, maar ze schilderen ook een visuele afbeelding van de tekening terwijl deze zich voordoet. CGuiPaper houdt een m_bInkSaving vlag om deze dubbele aard te beheren. Wanneer m_bInkSaving ONWAAR is, wordt de afbeelding op het scherm getekend, maar worden de gegevens niet verzonden naar COPaper voor opname.

Dit schema wordt gebruikt bij het opnieuw instellen van de muis wanneer de gebruiker de muis niet beweegt, maar de inktgegevens van COPaper opnieuw worden verzonden naar CGuiPaper voor automatisch opnieuw instellen. CGuiPaper kan worden verteld om de m_bInkSaving vlag in te stellen door de InkSaving methode aan te roepen.

De volgende voorbeeldcodefragmenten illustreren de InkStart methoden van GUIPAPER. CPP EN SINK. CPP.

Methode 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;
  }

InkStart-methode (SINK. CPP)

StoClien de tekeninggegevens ontvangt in de vorm van aanroepen naar de verbonden IPaperSink interface in het COPaperSink-object. Deze methoden komen overeen met de vergelijkbare InkStart, InkDrawen InkStop methoden in 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;
  }

Wanneer InkStart- wordt aangeroepen in de sink, wordt CGuiPaper aangeroepen om inkt opslaan in COPaper uit te schakelen. COPaper hoeft geen echo-kopie te ontvangen van de gegevens die worden verzonden. Wanneer InkDraw- wordt aangeroepen in de sink, wordt de aanroep gewoon doorgegeven aan CGuiPaper::InkDraw. Wanneer InkStop in de sink wordt aangeroepen, wordt CGuiPaper aangeroepen om inktbesparing weer in te schakelen. Het resultaat is een weergave van de inktgegevens van COPaper naar CGuiPaper voor weergave.

U kunt het gedrag van StoClien testen wanneer de IPaperSink is losgekoppeld door de optie Verbinding verbreken te kiezen in het sinkmenu. Als experiment kiest u na het verbreken van de verbinding met de sink de optie Info in het Menu Help. Hiermee wordt het dialoogvenster Info weergegeven, waarin een deel van de tekening van de StoClienwordt behandeld. Klik op OK in het dialoogvenster Info. U ziet dat het gedeelte van de tekening dat is bedekt, nu is verdwenen. De tekeninggegevens gaan niet verloren, maar een deel van de afbeelding is. De client heeft het WM_PAINT bericht ontvangen en de methode IPaper::Redraw uitgegeven. Maar omdat de sink niet is verbonden, heeft deze de IPaperSink niet ontvangen oproepen om de tekening opnieuw te tekenen.

U kunt dit gedrag ook testen door StoClien- te minimaliseren en vervolgens te herstellen. In dit geval gaat de hele tekenafbeelding verloren en moet de tekening opnieuw worden geschilderd. Als u de tekeningafbeelding na een van deze tests opnieuw wilt tekenen, gebruikt u het sinkmenu om opnieuw verbinding te maken en kiest u vervolgens Opnieuw tekenen in het menu Tekenen.