다음을 통해 공유


InkStart 메서드

InkStart, InkDrawInkStop 메서드는 모두 디바이스 컨텍스트 및 펜 개체와 같은 Win32 GUI 구문을 사용합니다. 이는 CGuiPaper가 별도의 캡슐화 수준으로 필요한 이유를 보여 줍니다. 그리기 용지의 GUI 측면은 CGuiPaper에서 처리됩니다. COPaper 개체는 잉크 데이터만 전송됩니다.

CGuiPaper 수준의 캡슐화에 대한 또 다른 디자인 이유는 InkStart, InkDrawInkStop 메서드의 이중 특성입니다. 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)

StoClienCOPaperSink 개체에서 연결된 IPaperSink 인터페이스에 대한 호출 형식으로 그리기 데이터를 받습니다. 이러한 메서드는 CGuiPaper의 유사한 InkStart, InkDrawInkStop 메서드에 해당합니다.

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로 재생합니다.

싱크 메뉴에서 연결 끊기 선택을 선택하여 IPaperSink의 연결이 끊어지면 StoClien의 동작을 테스트할 수 있습니다. 실험으로 싱크의 연결을 끊은 후 도움말 메뉴에서 정보를 선택합니다. 그러면 StoClien 드로잉의 일부를 다루는 정보 대화 상자가 표시됩니다. 정보 대화 상자에서 확인을 클릭합니다. 이제 덮은 드로잉의 부분이 사라졌습니다. 그리기 데이터는 손실되지 않지만 이미지의 일부는 손실됩니다. 클라이언트가 WM_PAINT 메시지를 받고 IPaper::Redraw 메서드를 실행했습니다. 그러나 싱크가 연결되지 않았기 때문에 드로잉을 다시 그리기 위한 IPaperSink 호출을 받지 못했습니다.

StoClien을 최소화한 다음 복원하여 이 동작을 테스트할 수도 있습니다. 이 경우 전체 그리기 이미지가 손실되고 다시 그려야 합니다. 이러한 테스트 중 하나 후에 그리기 이미지를 다시 그리려면 싱크 메뉴를 사용하여 다시 연결한 다음 그리기 메뉴에서 다시 그리기를 선택합니다.