Метод 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 , а затем восстановив его. В этом случае весь рисунок теряется и нуждается в перекраске. Чтобы перерисовать рисунок после любого из этих тестов, используйте меню Приемник для повторного подключения, а затем выберите Перерисовка в меню Рисование.