Condividi tramite


Visualizzazioni con schede singole e multiple

Un editor può creare diversi tipi di visualizzazioni. Un esempio è una finestra dell'editor di codice, un'altra è una finestra di progettazione dei moduli.

Una visualizzazione a più schede è una visualizzazione con più schede. Ad esempio, l'editor HTML ha due schede nella parte inferiore: Progettazione e Origine, ognuna una visualizzazione logica. La visualizzazione progettazione visualizza una pagina Web sottoposta a rendering, mentre l'altra visualizza il codice HTML che comprende la pagina Web.

Accesso alle visualizzazioni fisiche

Le visualizzazioni fisiche ospitano oggetti visualizzazione documento, ognuno dei quali rappresenta una visualizzazione dei dati nel buffer, ad esempio il codice o un modulo. Di conseguenza, ogni oggetto visualizzazione documento ha una visualizzazione fisica (identificata da un elemento noto come stringa di visualizzazione fisica) e in genere una singola visualizzazione logica.

In alcuni casi, tuttavia, una visualizzazione fisica può avere due o più visualizzazioni logiche. Alcuni esempi sono un editor con una finestra divisa con visualizzazioni affiancate o una finestra di progettazione dei moduli con una visualizzazione GUI/progettazione e una visualizzazione code-behind-the-form.

Per consentire all'editor di accedere a tutte le visualizzazioni fisiche disponibili, è necessario creare una stringa di visualizzazione fisica univoca per ogni tipo di oggetto visualizzazione documento che la factory dell'editor può creare. Ad esempio, la factory dell'editor di Visual Basic può creare oggetti visualizzazione documento per una finestra di codice e una finestra di progettazione dei moduli.

Creazione di visualizzazioni a schede diverse

Anche se un oggetto visualizzazione documento deve essere associato a una visualizzazione fisica tramite una stringa di visualizzazione fisica univoca, è possibile inserire più schede nella visualizzazione fisica per consentire la visualizzazione dei dati in modi diversi. In questa configurazione a più schede tutte le schede sono associate alla stessa stringa di visualizzazione fisica, ma a ogni scheda viene assegnato un GUID di visualizzazione logica diverso.

Per creare una visualizzazione a schede multipla per un editor, implementare l'interfaccia IVsMultiViewDocumentView e quindi associare un GUID di visualizzazione logica diverso (LogicalViewID) a ogni scheda creata.

L'editor HTML di Visual Studio è un esempio di editor con una visualizzazione a più schede. Include schede Progettazione e Origine . Per abilitare questa operazione, a ogni scheda è associata una visualizzazione logica diversa, LOGICALVIEWID_TextView per la scheda Progettazione e LOGICALVIEWID_Code per la scheda Origine .

Specificando la visualizzazione logica appropriata, un VSPackage può accedere alla visualizzazione corrispondente a uno scopo specifico, ad esempio la progettazione di una maschera, la modifica di codice o il debug del codice. Tuttavia, una delle finestre deve essere identificata dalla stringa NULL e deve corrispondere alla vista logica primaria (LOGVIEWID_Primary).

Nella tabella seguente sono elencati i valori di visualizzazione logica disponibili e il relativo uso.

LOGVIEWID GUID Uso consigliato
LOGVIEWID_Primary Visualizzazione predefinita/primaria della factory dell'editor.

Tutte le factory dell'editor devono supportare questo valore. Questa vista deve usare la stringa NULL come stringa di visualizzazione fisica. Almeno una visualizzazione logica deve essere impostata su questo valore.
LOGVIEWID_Debugging Visualizzazione di debug. In genere, LOGVIEWID_Debugging esegue il mapping alla stessa visualizzazione di LOGVIEWID_Code.
LOGVIEWID_Code Visualizzazione avviata dal comando Visualizza codice .
LOGVIEWID_Designer Visualizzazione avviata dal comando Visualizza modulo .
LOGVIEWID_TextView Visualizzazione editor di testo. Si tratta della visualizzazione che restituisce IVsCodeWindow, da cui è possibile accedere a IVsTextView.
LOGVIEWID_UserChooseView Chiede all'utente di scegliere la visualizzazione da usare.
LOGVIEWID_ProjectSpecificEditor Passato dalla finestra di dialogo Apri con a

OpenItem

quando l'utente sceglie la voce "(Editor predefinito progetto)".

Anche se i GUID di visualizzazione logica sono estendibili, è possibile usare solo i GUID di visualizzazione logica definiti nel pacchetto VSPackage.

All'arresto, Visual Studio mantiene il GUID della factory dell'editor e le stringhe di visualizzazione fisica associate alla finestra del documento in modo che possa essere usato per riaprire le finestre dei documenti quando la soluzione viene riaperta. Solo le finestre aperte quando una soluzione viene chiusa vengono mantenute nel file della soluzione (con estensione suo). Questi valori corrispondono ai VSFPROPID_guidEditorType valori e VSFPROPID_pszPhysicalView passati nel propid parametro nel GetProperty metodo .

Esempio

Questo frammento di codice illustra come viene usato l'oggetto TextView per accedere a una visualizzazione che implementa IVsCodeWindow. In questo caso, il SVsUIShellOpenDocument servizio viene usato per chiamare OpenDocumentViaProject e richiedere LOGVIEWID_TextView, che ottiene un puntatore a un frame di finestra. Un puntatore all'oggetto visualizzazione documento viene ottenuto chiamando GetProperty e specificando un valore di VSFPROPID_DocView. Dall'oggetto visualizzazione documento viene QueryInterface chiamato per IVsCodeWindow. L'aspettativa in questo caso è che viene restituito un editor di testo e quindi l'oggetto visualizzazione documento restituito nel metodo è una finestra di GetProperty codice.

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