次の方法で共有


InkStart メソッド

InkStartInkDrawInkStop の各メソッドはすべて、デバイス コンテキストやペン オブジェクトなどの Win32 GUI コンストラクトを使用します。 これは、別のレベルのカプセル化として CGuiPaper が必要な理由を示しています。 描画用紙の GUI の側面は CGuiPaper で処理されます。 COPaper オブジェクトはインク データのみを送信します。

CGuiPaper レベルのカプセル化のもう 1 つの設計上の理由は、 InkStartInkDrawInkStop メソッドの 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 の 同様の InkStartInkDrawInkStop メソッドに対応しています。

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 を最小化してから復元します。 この場合、描画イメージ全体が失われ、再描画が必要になります。 いずれかのテストの後に描画イメージを再描画するには、[シンク] メニューを使用して再接続し、[描画] メニューから [ 再描画 ] を選択します。