Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Edytor może tworzyć różne typy widoków. Jednym z przykładów jest okno edytora kodu. Innym jest projektant formularzy.
Widok z wieloma kartami to widok posiadający wiele kart. Na przykład edytor HTML ma dwie karty w dolnej części: Projektowanie i Źródło, z których każdy jest widokiem logicznym. Widok projektu wyświetla renderowaną stronę internetową, a drugi wyświetla kod HTML, który składa się ze strony internetowej.
Uzyskiwanie dostępu do widoków fizycznych
Widoki fizyczne hostują obiekty widoku dokumentu, z których każdy reprezentuje widok danych w buforze, na przykład kod lub formularz. W związku z tym każdy obiekt widoku dokumentu ma widok fizyczny (identyfikowany przez coś znanego jako ciąg widoku fizycznego) i zazwyczaj pojedynczy widok logiczny.
W niektórych przypadkach widok fizyczny może mieć co najmniej dwa widoki logiczne. Niektóre przykłady to edytor z podzielonym oknem z widokami obok siebie lub projektant formularzy, który ma widok graficzny interfejsu użytkownika/projektu i widok kodu za formularzem.
Aby umożliwić edytorowi dostęp do wszystkich dostępnych widoków fizycznych, należy utworzyć unikatowy ciąg widoku fizycznego dla każdego typu obiektu widoku dokumentu, który może utworzyć fabryka edytora. Na przykład fabryka edytora Visual Basic może tworzyć obiekty widoku dokumentu dla okna kodu oraz okna projektanta formularzy.
Tworzenie widoków z wieloma zakładkami
Chociaż obiekt widoku dokumentu musi być skojarzony z widokiem fizycznym za pomocą unikatowego ciągu widoku fizycznego, można umieścić wiele kart w widoku fizycznym, aby umożliwić wyświetlanie danych na różne sposoby. W tej konfiguracji z wieloma kartami wszystkie karty są skojarzone z tym samym fizycznym ciągiem widoku, ale każda karta ma inny identyfikator GUID widoku logicznego.
Aby utworzyć dla edytora widok z wieloma kartami, zaimplementuj interfejs IVsMultiViewDocumentView, a następnie przypisz każdej utworzonej karcie inny identyfikator GUID widoku logicznego (LogicalViewID).
Edytor HTML programu Visual Studio jest przykładem edytora z widokiem z wieloma kartami. Ma ona karty Projektowanie i Źródło . Aby to włączyć, z każdą kartą skojarzono inny widok logiczny: na karcie LOGICALVIEWID_TextView i na karcie Źródło.
Określając odpowiedni widok logiczny, pakiet VSPackage może uzyskać dostęp do widoku odpowiadającego określonemu celowi, takie jak projektowanie formularza, edytowanie kodu lub debugowanie kodu. Jednak jeden z okien musi być identyfikowany przez ciąg NULL i musi odpowiadać podstawowemu widokowi logicznemu (LOGVIEWID_Primary).
W poniższej tabeli wymieniono dostępne wartości widoku logicznego i ich użycie.
| LOGVIEWID GUID | Zalecane użycie |
|---|---|
LOGVIEWID_Primary |
Domyślny/podstawowy widok fabryki edytora. Wszystkie fabryki edytorów muszą obsługiwać tę wartość. Ten widok musi używać ciągu NULL jako fizycznego ciągu widoku. Co najmniej jeden widok logiczny musi być ustawiony na tę wartość. |
LOGVIEWID_Debugging |
Widok debugowania. Zwykle LOGVIEWID_Debugging odnosi się do tego samego widoku co LOGVIEWID_Code. |
LOGVIEWID_Code |
Widok uruchomiony poleceniem Wyświetl kod. |
LOGVIEWID_Designer |
Widok uruchomiony przez polecenie Wyświetl formularz. |
LOGVIEWID_TextView |
Widok edytora tekstu. Jest to widok, który zwraca IVsCodeWindow, z którego można uzyskać dostęp do IVsTextView. |
LOGVIEWID_UserChooseView |
Monituje użytkownika o wybranie widoku do użycia. |
LOGVIEWID_ProjectSpecificEditor |
Przekazane przez okno dialogowe Otwórz za pomocą do OpenItem gdy użytkownik wybierze wpis "(Edytor domyślny projektu)". |
Chociaż identyfikatory GUID widoku logicznego są rozszerzalne, można użyć tylko identyfikatorów GUID widoku logicznego zdefiniowanych w pakietach VSPackage.
Po zamknięciu program Visual Studio zachowuje identyfikator GUID fabryki edytora i ciągi widoku fizycznego skojarzone z oknem dokumentu, dzięki czemu można go użyć do ponownego otwierania okien dokumentów po ponownym otwarciu rozwiązania. Tylko okna otwarte po zamknięciu rozwiązania są utrwalane w pliku rozwiązania (suo). Te wartości odpowiadają wartościom VSFPROPID_guidEditorType i VSFPROPID_pszPhysicalView przekazanym w parametrze propid w metodzie GetProperty .
Example
Ten fragment kodu ilustruje, w jaki sposób TextView obiekt jest używany do uzyskiwania dostępu do widoku, który implementuje IVsCodeWindow element. W takim przypadku usługa SVsUIShellOpenDocument jest używana do wywoływania OpenDocumentViaProject i żądania LOGVIEWID_TextView, które uzyskuje wskaźnik do ramki okna. Wskaźnik do obiektu widoku dokumentu jest uzyskiwany przez wywołanie GetProperty i określenie wartości VSFPROPID_DocView. Z obiektu widoku dokumentu QueryInterface wywoływana jest funkcja IVsCodeWindow. W tym przypadku oczekuje się, że zostanie zwrócony edytor tekstów, a więc obiekt widoku dokumentu zwrócony w metodzie GetProperty jest oknem kodu.
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;
}