Udostępnij przez


InkStart, metoda

InkStart, InkDrawi InkStop metody używają konstrukcji gui Win32, takich jak konteksty urządzeń i obiekty pióra. Ilustruje to, dlaczego CGuiPaper jest potrzebny jako oddzielny poziom hermetyzacji. Aspekty graficznego papieru rysunkowego są obsługiwane w CGuiPaper. Obiekt COPaper jest wysyłany tylko dane pisma odkowego.

Innym powodem projektowania dla poziomu hermetyzacji CGuiPaper jest podwójny charakter jego InkStart, InkDrawi InkStop metod. Oni nie tylko wywołać COPaper, aby zarejestrować dane pisma odkowego w miarę ich wystąpienia, a także malują wizualny obraz rysunku w miarę ich wystąpienia. CGuiPaper utrzymuje flagę m_bInkSaving, aby zarządzać tym podwójnym charakterem. Gdy m_bInkSaving ma wartość FALSE, obraz jest rysowany na ekranie, ale dane nie są wysyłane do narzędzia COPaper do rejestrowania.

Ten schemat jest używany w przemalowaniu, gdy użytkownik nie przenosi myszy, ale dane pisma odkowego COPaper są wznawiane do CGuiPaper w celu automatycznego przemalowania. CGuiPaper można powiedzieć, aby ustawić flagę m_bInkSaving, wywołując jego InkSaving metody.

Poniższe przykładowe fragmenty kodu ilustrują metody InkStart GUIPAPER. CPP I SINK. CPP.

InkStart, metoda (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, metoda (SINK. CPP)

StoClien odbiera dane rysunku w postaci wywołań połączonego interfejsu IPaperSink IPaperSink w swoim obiekcie COPaperSink. Metody te odpowiadają podobnym metodom InkStart, InkDrawi InkStop metod w 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;
  }

Gdy InkStart jest wywoływana w ujściu, wywołuje narzędzie CGuiPaper, aby wyłączyć zapisywanie pisma oddyskowego w usłudze COPaper. CoPaper nie musi odbierać kopii echem danych, które wysyła. Gdy InkDraw jest wywoływana w ujściu, po prostu przekazuje wywołanie do CGuiPaper::InkDraw. Gdy InkStop jest wywoływana w ujściu, CGuiPaper jest wywoływany w celu włączenia zapisywania pisma odwrotowego. Wynikiem jest odtwarzanie danych pisma odkowego copaper do CGuiPaper tylko do wyświetlania.

Możesz przetestować zachowanie StoClien, gdy jego IPaperSink jest odłączony, wybierając opcję Rozłącz w menu Ujście. W ramach eksperymentu po odłączeniu ujścia wybierz pozycję Informacje z menu Pomoc. Spowoduje to wyświetlenie okna dialogowego Informacje, które będzie obejmować część rysunku StoClien. Kliknij przycisk OK w oknie dialogowym Informacje. Zwróć uwagę, że część rysunku, która została zakryta, już nie istnieje. Dane rysunku nie zostaną utracone, ale część obrazu jest. Klient odebrał komunikat WM_PAINT i wydał metodę IPaper::Redraw. Ale ponieważ ujście nie było połączone, nie otrzymał IPaperSink wywołania w celu przemalowania rysunku.

To zachowanie można również przetestować, minimalizując StoClien, a następnie przywracając je. W tym przypadku cały obraz rysunkowy zostanie utracony i wymaga przemalowania. Aby ponownie zaintować obraz rysunku po jednym z tych testów, użyj menu Ujście, aby ponownie nawiązać połączenie, a następnie wybierz Ponownie rysuj z menu Rysuj.