Поделиться через


Метод InkStart

Методы InkStart, InkDraw и InkStop используют конструкции графического пользовательского интерфейса Win32, такие как контексты устройств и объекты пера. Это иллюстрирует, почему CGuiPaper требуется как отдельный уровень инкапсуляции. Аспекты графического пользовательского интерфейса бумаги для рисования обрабатываются в CGuiPaper. Объект COPaper отправляет только данные рукописного ввода.

Другой причиной инкапсуляции CGuiPaper является двойственная природа методов InkStart, InkDraw и InkStop . Они не только вызывают COPaper для записи данных рукописного ввода по мере их возникновения, но и рисуют визуальное изображение рисунка по мере его возникновения. CGuiPaper сохраняет флаг m_bInkSaving для управления этой двойной природой. Если m_bInkSaving имеет значение FALSE, изображение рисуется на экране, но данные не отправляются в COPaper для записи.

Эта схема используется для перерисовки, когда пользователь не перемещает мышь, но данные рукописного ввода COPaper повторно переносятся в CGuiPaper для автоматической перерисовки. CGuiPaper можно задать флаг m_bInkSaving, вызвав его метод InkSaving .

В следующих примерах фрагментов кода показаны методы InkStart GUIPAPER. CPP И SINK. CPP.

Метод 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 (SINK. CPP)

StoClien получает данные рисования в виде вызовов подключенного интерфейса IPaperSink в своем объекте COPaperSink. Эти методы соответствуют аналогичным методам InkStart, InkDraw и InkStop в 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;
  }

При вызове InkStart в приемнике он вызывает CGuiPaper, чтобы отключить сохранение рукописного ввода в COPaper. COPaper не требуется получать отправляемую копию отправляемых данных. При вызове InkDraw в приемнике он просто передает вызов в CGuiPaper::InkDraw. При вызове InkStop в приемнике вызывается CGuiPaper, чтобы снова включить сохранение рукописного ввода. Результатом является воспроизведение рукописных данных COPaper в CGuiPaper только для отображения.

Вы можете проверить поведение StoClien при отключении IPaperSink , выбрав вариант Отключить в меню Приемник. В качестве эксперимента после отключения приемника выберите в меню Справка пункт О программе. Откроется диалоговое окно О программе, которое будет охватывать часть документа StoClien. Нажмите кнопку ОК в диалоговом окне О программе. Обратите внимание, что часть рисунка, которая была покрыта, теперь удалена. Данные рисования не теряются, но часть изображения . Клиент получил сообщение WM_PAINT и выдал метод IPaper::Redraw . Но так как приемник не был подключен, он не получил вызовы IPaperSink для перерисовки документа.

Вы также можете проверить это поведение, сведя к минимуму StoClien , а затем восстановив его. В этом случае весь рисунок теряется и нуждается в перекраске. Чтобы перерисовать рисунок после любого из этих тестов, используйте меню Приемник для повторного подключения, а затем выберите Перерисовка в меню Рисование.