Share via


Vistas de una sola pestaña y varias pestañas

Un editor puede crear diferentes tipos de vistas. Un ejemplo es una ventana del editor de código; otra es un diseñador de formularios.

Una vista con varias pestañas es una vista que tiene varias pestañas. Por ejemplo, el editor HTML tiene dos pestañas en la parte inferior: Diseño y origen, cada una de ellas una vista lógica. La vista de diseño muestra una página web representada, mientras que la otra muestra el HTML que consta de la página web.

Acceso a vistas físicas

Las vistas físicas hospedan objetos de vista de documentos, cada una de las cuales representa una vista de datos en el búfer, como el código o un formulario. En consecuencia, cada objeto de vista de documento tiene una vista física (identificada por algo conocido como una cadena de vista física) y, por lo general, una sola vista lógica.

Sin embargo, en algunos casos, una vista física puede tener dos o más vistas lógicas. Algunos ejemplos son un editor que tiene una ventana dividida con vistas en paralelo o un diseñador de formularios que tiene una vista gui/diseño y una vista de código subyacente al formulario.

Para permitir que el editor acceda a todas las vistas físicas disponibles, debe crear una cadena de vista física única para cada tipo de objeto de vista de documento que pueda crear el generador de editores. Por ejemplo, el generador de editores de Visual Basic puede crear objetos de vista de documentos para una ventana de código y una ventana del diseñador de formularios.

Crear vistas con varias pestañas

Aunque un objeto de vista de documento debe estar asociado a una vista física a través de una cadena de vista física única, puede colocar varias pestañas dentro de la vista física para habilitar la visualización de datos de diferentes maneras. En esta configuración con varias pestañas, todas las pestañas están asociadas a la misma cadena de vista física, pero cada pestaña tiene un GUID de vista lógica diferente.

Para crear una vista con varias pestañas para un editor, implemente la IVsMultiViewDocumentView interfaz y, a continuación, asocie un GUID de vista lógica diferente (LogicalViewID) con cada pestaña que cree.

El editor HTML de Visual Studio es un ejemplo de un editor con una vista de varias pestañas. Tiene pestañas Diseño y Origen . Para habilitar esto, se asocia una vista lógica diferente a cada pestaña, LOGICALVIEWID_TextView para la pestaña Diseño y LOGICALVIEWID_Code para la pestaña Origen .

Al especificar la vista lógica adecuada, un VSPackage puede tener acceso a la vista que corresponde a un propósito determinado, como diseñar un formulario, editar código o depurar código. Sin embargo, una de las ventanas debe identificarse mediante la cadena NULL y debe corresponder a la vista lógica principal (LOGVIEWID_Primary).

En la tabla siguiente se enumeran los valores de vista lógica disponibles y su uso.

LOGVIEWID GUID Uso recomendado
LOGVIEWID_Primary Vista predeterminada o principal del generador de editores.

Todos los generadores de editores deben admitir este valor. Esta vista debe usar la cadena NULL como cadena de vista física. Al menos una vista lógica debe establecerse en este valor.
LOGVIEWID_Debugging Vista de depuración. Normalmente, LOGVIEWID_Debugging se asigna a la misma vista que LOGVIEWID_Code.
LOGVIEWID_Code Vista iniciada por el comando Ver código .
LOGVIEWID_Designer Vista iniciada por el comando Ver formulario .
LOGVIEWID_TextView Vista del editor de texto. Esta es la vista que devuelve IVsCodeWindow, desde la que puede acceder a IVsTextView.
LOGVIEWID_UserChooseView Pide al usuario que elija la vista que se va a usar.
LOGVIEWID_ProjectSpecificEditor Pasado por el cuadro de diálogo Abrir con a

OpenItem

cuando el usuario elige la entrada "(Editor predeterminado de Project)".

Aunque los GUID de vista lógica son extensibles, solo puede usar los GUID de vista lógica definidos en VSPackage.

Al apagar, Visual Studio conserva el GUID del generador del editor y las cadenas de vista física asociadas a la ventana del documento para que se puedan usar para volver a abrir ventanas de documentos cuando se vuelva a abrir la solución. Solo las ventanas que están abiertas cuando se cierra una solución se conservan en el archivo de solución (.suo). Estos valores corresponden a los VSFPROPID_guidEditorType valores y VSFPROPID_pszPhysicalView pasados en el propid parámetro en el GetProperty método .

Ejemplo

En este fragmento de código se muestra cómo se usa el TextView objeto para tener acceso a una vista que implementa IVsCodeWindow. En este caso, el SVsUIShellOpenDocument servicio se usa para llamar OpenDocumentViaProject a y solicitar LOGVIEWID_TextView, que obtiene un puntero a un marco de ventana. Se obtiene un puntero al objeto de vista de documento llamando GetProperty a y especificando un valor de VSFPROPID_DocView. Desde el objeto de vista de documento, QueryInterface se llama a para IVsCodeWindow. La expectativa en este caso es que se devuelve un editor de texto y, por tanto, el objeto de vista de documento devuelto en el GetProperty método es una ventana de código.

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