Zobrazení jedné a více karet

Platí pro:yes Visual Studio Visual Studio pro Mac noVisual Studio noCode

Editor může vytvářet různé typy zobrazení. Jedním z příkladů je okno editoru kódu, další je návrhář formulářů.

Zobrazení s více kartami je zobrazení s více kartami. Například editor HTML má v dolní části dvě karty: Návrh a Zdroj, každé logické zobrazení. V návrhovém zobrazení se zobrazí vykreslená webová stránka, zatímco druhá zobrazí kód HTML, který obsahuje webovou stránku.

Přístup k fyzickým zobrazením

Fyzická zobrazení hostují objekty zobrazení dokumentu, z nichž každá představuje zobrazení dat v vyrovnávací paměti, například kód nebo formulář. Každý objekt zobrazení dokumentu má tedy fyzické zobrazení (identifikované něčím, co se označuje jako řetězec fyzického zobrazení) a obecně jediným logickým zobrazením.

V některých případech ale fyzické zobrazení může mít dvě nebo více logických zobrazení. Mezi příklady patří editor, který má rozdělené okno se zobrazením vedle sebe, nebo návrhář formulářů, který má grafické uživatelské rozhraní nebo návrhové zobrazení a zobrazení s kódem za zobrazením formuláře.

Pokud chcete editoru povolit přístup ke všem dostupným fyzickým zobrazením, musíte vytvořit jedinečný řetězec fyzického zobrazení pro každý typ objektu zobrazení dokumentu, který může objekt pro vytváření editoru vytvořit. Například továrna editoru Visual Basic může vytvářet objekty zobrazení dokumentů pro okno kódu a okno návrháře formulářů.

Vytváření zobrazení s více kartami

I když objekt zobrazení dokumentu musí být přidružený k fyzickému zobrazení prostřednictvím jedinečného řetězce fyzického zobrazení, můžete do fyzického zobrazení umístit několik karet, abyste umožnili zobrazení dat různými způsoby. V této konfiguraci s více kartami jsou všechny karty přidružené ke stejnému řetězci fyzického zobrazení, ale každá karta má jiný identifikátor GUID logického zobrazení.

Pokud chcete vytvořit zobrazení s více kartami pro editor, implementujte rozhraní a přidružte IVsMultiViewDocumentView k jednotlivým kartám, které vytvoříte, jiný identifikátor GUIDLogicalViewID logického zobrazení.

Editor HTML sady Visual Studio je příkladem editoru s více kartami zobrazení. Obsahuje karty Návrh a Zdroj . Chcete-li to povolit, je k jednotlivým kartám přidruženo jiné logické zobrazení, LOGICALVIEWID_TextView pro kartu Návrh a LOGICALVIEWID_Code pro kartu Zdroj .

Zadáním vhodného logického zobrazení může balíček VSPackage přistupovat k zobrazení, které odpovídá určitému účelu, například návrhu formuláře, úpravě kódu nebo ladění kódu. Jeden z oken však musí být identifikován řetězcem NULL a musí odpovídat primárnímu logickému zobrazení (LOGVIEWID_Primary).

Následující tabulka uvádí dostupné hodnoty logického zobrazení a jejich použití.

LOGVIEWID GUID Doporučené použití
LOGVIEWID_Primary Výchozí nebo primární zobrazení objektu pro vytváření editoru

Tuto hodnotu musí podporovat všechny objekty pro vytváření editorů. Toto zobrazení musí jako řetězec fyzického zobrazení použít řetězec NULL. Na tuto hodnotu musí být nastaveno aspoň jedno logické zobrazení.
LOGVIEWID_Debugging Zobrazení ladění. Obvykle se LOGVIEWID_Debugging mapuje na stejné zobrazení jako LOGVIEWID_Code.
LOGVIEWID_Code Zobrazení spuštěné příkazem Zobrazit kód
LOGVIEWID_Designer Zobrazení spuštěné příkazem Formulář zobrazení
LOGVIEWID_TextView Zobrazení textového editoru Toto je zobrazení, které vrací IVsCodeWindow, ze kterého můžete získat přístup IVsTextView.
LOGVIEWID_UserChooseView Vyzve uživatele, aby zvolil, které zobrazení se má použít.
LOGVIEWID_ProjectSpecificEditor Předání dialogového okna Otevřít v aplikaci

OpenItem

když uživatel zvolí položku "(Project default editor)".

I když jsou identifikátory GUID logického zobrazení rozšiřitelné, můžete použít pouze identifikátory GUID logického zobrazení definované v balíčku VSPackage.

Při vypnutí sada Visual Studio zachová identifikátor GUID objektu pro vytváření editoru a řetězce fyzického zobrazení přidružené k oknu dokumentu, aby bylo možné znovu otevřít okna dokumentů při opětovném otevření řešení. V souboru řešení (.suo) se zachovají pouze okna, která jsou otevřená při zavření řešení. Tyto hodnoty odpovídají hodnotám VSFPROPID_guidEditorType a VSFPROPID_pszPhysicalView hodnotám předanými v propid parametru GetProperty v metodě.

Příklad

Tento fragment kódu ukazuje, jak TextView se objekt používá pro přístup k zobrazení, které implementuje IVsCodeWindow. V tomto případě SVsUIShellOpenDocument se služba používá k volání OpenDocumentViaProject a vyžádání LOGVIEWID_TextView, který získá ukazatel na rámeček okna. Ukazatel na objekt zobrazení dokumentu je získán voláním GetProperty a určením hodnoty VSFPROPID_DocView. Z objektu zobrazení dokumentu se QueryInterface volá .IVsCodeWindow V tomto případě se očekává, že se vrátí textový editor, takže objekt zobrazení dokumentu vrácený v GetProperty metodě je okno kódu.

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;
}

Viz také