Freigeben über


InkStart-Methode

InkStart-, InkDraw-und InkStop- Methoden verwenden alle Win32-GUI-Konstrukte wie Gerätekontexte und Stiftobjekte. Dies veranschaulicht, warum CGuiPaper als separate Ebene der Kapselung benötigt wird. Die GUI-Aspekte des Zeichenpapiers werden in CGuiPaper behandelt. Das COPaper-Objekt wird nur Freihanddaten gesendet.

Ein weiterer Entwurfsgrund für die CGuiPaper-Ebene der Kapselung ist die duale Natur ihrer InkStart, InkDrawund InkStop Methoden. Sie rufen nicht nur COPaper auf, die Freihanddaten während des Auftretens aufzuzeichnen, sie zeichnen auch ein visuelles Bild der Zeichnung, während sie auftritt. CGuiPaper behält eine m_bInkSaving Kennzeichnung bei, um diese duale Natur zu verwalten. Wenn m_bInkSaving FALSE ist, wird das Bild auf dem Bildschirm gezeichnet, die Daten werden jedoch nicht zur Aufzeichnung an COPaper gesendet.

Dieses Schema wird beim Aktualisieren verwendet, wenn der Benutzer die Maus nicht bewegt, aber die Freihanddaten von COPaper für die automatische Aktualisierung an CGuiPaper erneut senden. CGuiPaper kann angewiesen werden, das m_bInkSaving Flag festzulegen, indem die InkSaving--Methode aufgerufen wird.

Die folgenden Beispielcodeausschnitte veranschaulichen die InkStart- Methoden von GUIPAPER. CPP UND SINK. CPP.

InkStart-Methode (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-Methode (SINK. CPP)

StoClien erhält die Zeichnungsdaten in Form von Aufrufen der verbundenen IPaperSink Schnittstelle in seinem COPaperSink-Objekt. Diese Methoden entsprechen den ähnlichen InkStart-, InkDraw-und InkStop- Methoden in 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;
  }

Wenn InkStart- in der Spüle aufgerufen wird, ruft sie CGuiPaper auf, um freihand sparen in COPaper zu deaktivieren. COPaper muss keine echoierte Kopie der gesendeten Daten empfangen. Wenn InkDraw in der Spüle aufgerufen wird, wird einfach der Anruf an CGuiPaper::InkDrawübergeben. Wenn InkStop- in der Spüle aufgerufen wird, wird CGuiPaper aufgerufen, um freihand zu sparen. Das Ergebnis ist eine Wiedergabe der Freihanddaten von COPaper in CGuiPaper nur für die Anzeige.

Sie können das Verhalten von StoClien testen, wenn die IPaperSink- getrennt ist, indem Sie die Option "Trennen" im Menü "Senken" auswählen. Wählen Sie als Experiment nach dem Trennen der Spüle im Hilfemenü "Info" die Option "Info" aus. Dadurch wird das Dialogfeld "Info" angezeigt, das einen Teil der zeichnung StoClienabdeckt. Klicken Sie im Dialogfeld "Info" auf "OK". Beachten Sie, dass der Teil der Zeichnung, der abgedeckt wurde, jetzt nicht mehr vorhanden ist. Die Zeichnungsdaten gehen nicht verloren, aber ein Teil des Bilds ist. Der Client hat die WM_PAINT Nachricht empfangen und die IPaper::Redraw-Methode ausgegeben. Aber weil die Spüle nicht verbunden war, erhielt sie nicht die IPaperSink Aufrufe, um die Zeichnung neu zu zeichnen.

Sie können dieses Verhalten auch testen, indem Sie StoClien minimieren und dann wiederherstellen. In diesem Fall geht das gesamte Zeichnungsbild verloren und muss aktualisiert werden. Um das Zeichnungsbild nach einem dieser Tests neu zu zeichnen, verwenden Sie das Menü "Senken", um die Verbindung wiederherzustellen, und wählen Sie dann im Menü "Zeichnen" Neu zeichnen aus.