Udostępnij za pośrednictwem


Widoki z jedną i wieloma kartami

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 z wieloma kartami. 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 projektantem formularzy, który ma widok graficzny interfejs użytkownika/projekt i widok typu "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 Języka Visual Basic może tworzyć obiekty widoku dokumentów dla okna kodu i okna projektanta formularzy.

Tworzenie widoków z wieloma kartami

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 ciągiem widoku fizycznego, ale każda karta ma inny identyfikator GUID widoku logicznego.

Aby utworzyć widok z wieloma kartami dla edytora, zaimplementuj IVsMultiViewDocumentView interfejs, a następnie skojarz inny identyfikator GUID widoku logicznego (LogicalViewID) z każdą utworzoną kartą.

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ć, inny widok logiczny jest skojarzony z każdą kartą na LOGICALVIEWID_TextView karcie Projektowanie i LOGICALVIEWID_Code 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 Widok domyślny/podstawowy 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. LOGVIEWID_Debugging Zazwyczaj mapuje na ten sam widok co LOGVIEWID_Code.
LOGVIEWID_Code Wyświetl uruchomiony przez polecenie Wyświetl kod .
LOGVIEWID_Designer Wyświetl uruchomione przez polecenie Wyświetl formularz .
LOGVIEWID_TextView Widok edytora tekstu. Jest to widok, który zwraca IVsCodeWindowelement , z którego można uzyskać dostęp.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 .

Przykład

Ten fragment kodu ilustruje, w jaki sposób TextView obiekt jest używany do uzyskiwania dostępu do widoku, który implementuje IVsCodeWindowelement . W takim przypadku SVsUIShellOpenDocument usługa jest używana do wywoływania OpenDocumentViaProject i żądania LOGVIEWID_TextView, który uzyskuje wskaźnik do ramki okna. Wskaźnik do obiektu widoku dokumentu jest uzyskiwany przez wywołanie GetProperty metody i określenie wartości VSFPROPID_DocView. W obiekcie QueryInterface widoku dokumentu wywoływana jest wartość .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;
}