Freigeben über


Einzel- und Mehrfachregisterkartenansichten

Ein Editor kann verschiedene Arten von Ansichten erstellen. Ein Beispiel ist ein Code-Editor-Fenster, ein anderes ist ein Formular-Designer.

Eine Ansicht mit mehreren Registerkarten ist eine Ansicht mit mehreren Registerkarten. Der HTML-Editor verfügt beispielsweise über zwei Registerkarten unten: "Entwurf " und " Quelle", jeweils eine logische Ansicht. In der Entwurfsansicht wird eine gerenderte Webseite angezeigt, während der andere html-Code anzeigt, der die Webseite umfasst.

Zugreifen auf physische Ansichten

Physische Ansichten hosten Dokumentansichtsobjekte, die jeweils eine Datenansicht im Puffer darstellen, z. B. Code oder Formular. Dementsprechend verfügt jedes Dokumentansichtsobjekt über eine physische Ansicht (identifiziert durch eine als physische Ansichtszeichenfolge bezeichnete Zeichenfolge) und in der Regel eine einzelne logische Ansicht.

In einigen Fällen kann eine physische Ansicht jedoch zwei oder mehr logische Ansichten haben. Einige Beispiele sind ein Editor, der über ein geteiltes Fenster mit nebeneinander angeordneten Ansichten oder einen Formular-Designer mit einer GUI/Entwurfsansicht und einer CodeBehind-Formularansicht verfügt.

Damit Ihr Editor auf alle verfügbaren physischen Ansichten zugreifen kann, müssen Sie eine eindeutige physische Ansichtszeichenfolge für jeden Typ von Dokumentansichtsobjekten erstellen, den Ihre Editor-Factory erstellen kann. Beispielsweise kann die Visual Basic-Editor-Factory Dokumentansichtsobjekte für ein Codefenster und ein Formular-Designerfenster erstellen.

Erstellen von Ansichten mit mehreren Registerkarten

Obwohl ein Dokumentansichtsobjekt einer physischen Ansicht über eine eindeutige physische Ansichtszeichenfolge zugeordnet werden muss, können Sie mehrere Registerkarten in der physischen Ansicht platzieren, um die Anzeige von Daten auf unterschiedliche Weise zu ermöglichen. In dieser Konfiguration mit mehreren Registerkarten sind alle Registerkarten derselben physischen Ansichtszeichenfolge zugeordnet, aber jede Registerkarte erhält eine andere logische Ansichts-GUID.

Um eine Multi-Tab-Ansicht für einen Editor zu erstellen, implementieren Sie die Schnittstelle IVsMultiViewDocumentView, und ordnen Sie dann jeder erstellten Registerkarte eine andere logische Ansichts-GUID (LogicalViewID) zu.

Der HTML-Editor von Visual Studio ist ein Beispiel für einen Editor mit einer Mehrregisterkartenansicht. Es verfügt über Registerkarten "Entwurf " und " Quelle ". Um dies zu aktivieren, ist jeder Registerkarte eine andere logische Ansicht zugeordnet, LOGICALVIEWID_TextView für die Registerkarte " Entwurf " und LOGICALVIEWID_Code für die Registerkarte " Quelle ".

Durch Angeben der entsprechenden logischen Ansicht kann ein VSPackage auf die Ansicht zugreifen, die einem bestimmten Zweck entspricht, z. B. entwerfen eines Formulars, Bearbeiten von Code oder Debuggen von Code. Eines der Fenster muss jedoch durch die NULL-Zeichenfolge identifiziert werden, und dies muss der primären logischen Ansicht (LOGVIEWID_Primary) entsprechen.

In der folgenden Tabelle sind die verfügbaren logischen Ansichtsoptionen und deren Verwendung aufgeführt.

LOGVIEWID-GUID Empfohlene Verwendung
LOGVIEWID_Primary Standardansicht/primäre Ansicht der Editor-Factory.

Alle Editor-Fabriken müssen diesen Wert unterstützen. Diese Ansicht muss die NULL-Zeichenfolge als physische Ansichtszeichenfolge verwenden. Mindestens eine logische Ansicht muss auf diesen Wert festgelegt werden.
LOGVIEWID_Debugging Debugansicht. In der Regel führt LOGVIEWID_Debugging zu der gleichen Ansicht wie LOGVIEWID_Code.
LOGVIEWID_Code Ansicht gestartet durch den Befehl "Code anzeigen ".
LOGVIEWID_Designer Ansicht gestartet vom Befehl 'Formular anzeigen '.
LOGVIEWID_TextView Text-Editor-Ansicht. Dies ist die Ansicht, die zu IVsCodeWindow zurückkehrt, von der aus Sie auf IVsTextView zugreifen können.
LOGVIEWID_UserChooseView Fordert den Benutzer auf, auszuwählen, welche Ansicht verwendet werden soll.
LOGVIEWID_ProjectSpecificEditor Übergeben vom Dialogfeld „Öffnen mit“ an

OpenItem

wenn der Benutzer den Eintrag "(Project Default Editor)" auswäht.

Obwohl logische Ansichts-GUIDs erweiterbar sind, können Sie nur die logischen Ansichts-GUIDs verwenden, die in Ihrem VSPackage definiert sind.

Beim Herunterfahren behält Visual Studio die GUID der Editor-Factory und die physischen Ansichtszeichenfolgen, die dem Dokumentfenster zugeordnet sind, so dass sie zum erneuten Öffnen von Dokumentfenstern verwendet werden können, wenn die Lösung erneut geöffnet wird. Nur Fenster, die geöffnet sind, wenn eine Lösung geschlossen wird, werden in der Lösungsdatei (SUO) beibehalten. Diese Werte entsprechen den Werten VSFPROPID_guidEditorType und VSFPROPID_pszPhysicalView, die im Parameter propid in der Methode GetProperty übergeben werden.

Example

Dieser Codeausschnitt veranschaulicht, wie das TextView-Objekt verwendet wird, um auf eine Ansicht zuzugreifen, die IVsCodeWindow implementiert. In diesem Fall wird der SVsUIShellOpenDocument-Dienst zum Aufrufen OpenDocumentViaProject und zur Anforderung LOGVIEWID_TextView verwendet, um einen Zeiger auf einen Fensterrahmen abzurufen. Ein Zeiger auf das Dokumentansichtsobjekt wird durch Aufrufen GetProperty und Angeben eines Werts von VSFPROPID_DocViewabgerufen. Aus dem Dokumentansichtsobjekt wird QueryInterface für IVsCodeWindow aufgerufen. In diesem Fall wird erwartet, dass ein Text-Editor zurückgegeben wird, und daher ist das in der GetProperty Methode zurückgegebene Dokumentansichtsobjekt ein Codefenster.

HRESULT CFindTool::GotoFileLocation(const WCHAR * szFile, long iLine, long iStart, long iLen)
{
  HRESULT hr;
  if (NULL == szFile || !*szFile)
    return E_INVALIDARG;

  if (iLine == -1L)
    return S_FALSE;

  VSITEMID                  itemid;
  VARIANT                   var;
  RECT                      rc;
  IVsUIShellOpenDocument *  pOpenDoc    = NULL;
  IVsCodeWindow *           pCodeWin    = NULL;
  IVsTextView *             pTextView   = NULL;
  IVsUIHierarchy *          pHierarchy  = NULL;
  IVsWindowFrame *          pFrame      = NULL;
  IUnknown *                pUnk        = NULL;
  IVsHighlight *            pHighlight  = NULL;

  IfFailGo(CGlobalServiceProvider::HrQueryService(SID_SVsUIShellOpenDocument, IID_IVsUIShellOpenDocument, (void **)&pOpenDoc));
  IfFailGo(pOpenDoc->OpenDocumentViaProject(szFile, LOGVIEWID_TextView, NULL, &pHierarchy, &itemid, &pFrame));
  pFrame->Show();
  VariantInit(&var);
  IfFailGo(pFrame->GetProperty(VSFPROPID_DocView, &var));
  if (VT_UNKNOWN != var.vt) { hr = E_FAIL; goto Error; }
  pUnk = V_UNKNOWN(&var);
  if (NULL != pUnk)
  {
    IfFailGo(pUnk->QueryInterface(IID_IVsCodeWindow, (void **)&pCodeWin));
    if (SUCCEEDED(hr = pCodeWin->GetLastActiveView(&pTextView)) ||
        SUCCEEDED(hr = pCodeWin->GetPrimaryView(&pTextView)) )
    {
      pTextView->SetSelection(iLine, iStart, iLine, iStart + iLen);
      // uncover selection
      IfFailGo(pTextView->QueryInterface(IID_IVsHighlight, (void**)&pHighlight));
      IfFailGo(SUCCEEDED(pHighlight->GetHighlightRect(&rc)));
      UncoverSelectionRect(&rc);
    }
  }

Error:
  CLEARINTERFACE(pHighlight);
  CLEARINTERFACE(pTextView);
  CLEARINTERFACE(pCodeWin);
  CLEARINTERFACE(pUnk);
  CLEARINTERFACE(pFrame);
  CLEARINTERFACE(pOpenDoc);
  CLEARINTERFACE(pHierarchy);
  RedrawWindow(m_hwndResults, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN);
  return hr;
}