InkStart メソッド
InkStart、 InkDraw、 InkStop の各メソッドはすべて、デバイス コンテキストやペン オブジェクトなどの Win32 GUI コンストラクトを使用します。 これは、別のレベルのカプセル化として CGuiPaper が必要な理由を示しています。 描画用紙の GUI の側面は CGuiPaper で処理されます。 COPaper オブジェクトはインク データのみを送信します。
CGuiPaper レベルのカプセル化のもう 1 つの設計上の理由は、 InkStart、 InkDraw、 InkStop メソッドの 2 つの性質です。 COPaper を呼び出してインク データの発生を記録するだけでなく、描画の視覚的なイメージを描画します。 CGuiPaper は、このデュアルの性質を管理するためにm_bInkSaving フラグを保持します。 m_bInkSavingが FALSE の場合、画像は画面に描画されますが、記録のためにデータは COPaper に送信されません。
このスキームは、ユーザーがマウスを移動していないが、COPaper のインク データが自動再描画のために CGuiPaper に再送信されている場合に再描画で使用されます。 CGuiPaper は、 InkSaving メソッドを呼び出すことによって、m_bInkSaving フラグを設定するように指定できます。
次のサンプル コード スニペットは、GUIPAPER の InkStart メソッドを示しています。CPP とシンク。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 は、 COPaperSink オブジェクト内の接続された IPaperSink インターフェイスへの呼び出しの形式で描画データを受信します。 これらのメソッドは、CGuiPaper の 同様の InkStart、 InkDraw、 InkStop メソッドに対応しています。
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 が呼び出され、インクの保存が再度オンになります。 その結果、表示専用の CGuiPaper に対する COPaper のインク データの再生が行われます。
[シンク] メニューの [切断] を選択すると、その IPaperSink が切断されたときの StoClien の動作をテストできます。 実験として、シンクを切断した後、[ヘルプ] メニューから [バージョン情報] を選択します。 [バージョン情報] ダイアログ ボックスが表示されます。このダイアログ ボックスには、 StoClien の図面の一部が表示されます。 [バージョン情報] ダイアログ ボックスで [OK] をクリックします。 カバーされた図面の部分がなくなったことに注意してください。 図面データは失われませんが、画像の一部は失われます。 クライアントはWM_PAINT メッセージを受信し、 IPaper::Redraw メソッドを発行しました。 ただし、シンクが接続されていないため、図面を再描画するための IPaperSink 呼び出しを受信しませんでした。
この動作をテストするには、 StoClien を最小化してから復元します。 この場合、描画イメージ全体が失われ、再描画が必要になります。 いずれかのテストの後に描画イメージを再描画するには、[シンク] メニューを使用して再接続し、[描画] メニューから [ 再描画 ] を選択します。