Zobrazení jedné a více karet
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í, které má více karet. Editor HTML má například v dolní části dvě karty: Návrh a Zdroj, přičemž každé je 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 ve vyrovnávací paměti, například kód nebo formulář. Každý objekt zobrazení dokumentu má proto 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í. Některé příklady jsou 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 formulářovým zobrazením.
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 objekty pro zobrazení dokumentu pro okno kódu a okno návrháře formulářů může vytvořit objekty zobrazení dokumentu.
Vytváření zobrazení s více kartami
I když musí být objekt zobrazení dokumentu 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 více 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 IVsMultiViewDocumentView rozhraní a přidružte 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. Obsahuje karty Návrh a Zdroj. Pokud to chcete povolit, je k jednotlivým kartám přidruženo jiné logické zobrazení, pro kartu Návrh a LOGICALVIEWID_Code
pro kartu Zdroj.LOGICALVIEWID_TextView
Zadáním vhodného logického zobrazení má balíček VSPackage přístup k zobrazení, které odpovídá určitému účelu, například návrhu formuláře, úpravě kódu nebo ladění kódu. Některá okna však musí být identifikována ř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 alespoň 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ředaný dialogem Otevřít v aplikaci OpenItem když uživatel zvolí položku (Výchozí editor projektu). |
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é při opětovném otevření řešení znovu otevřít okna dokumentu. 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
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ámec 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 je QueryInterface
volána .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;
}