Partilhar via


Exibição de guia única e multiguias

Um editor pode criar diferentes tipos de modos de exibição. Um exemplo é uma janela do editor de código, outro é um designer de formulários.

Um modo de exibição com várias guias é um modo de exibição que tem várias guias. Por exemplo, o editor de HTML tem duas guias na parte inferior: Design e Código-fonte, cada uma uma exibição lógica. O modo de exibição de design exibe uma página da Web renderizada, enquanto a outra exibe o HTML que compõe a página da Web.

Acessando exibições físicas

Os modos de exibição físicos hospedam objetos de exibição de documento, cada um representando um modo de exibição de dados no buffer, como código ou formulário. Assim, cada objeto de exibição de documento tem um modo de exibição físico (identificado por algo conhecido como uma cadeia de caracteres de exibição física) e, geralmente, um único modo de exibição lógico.

Em alguns casos, porém, uma exibição física pode ter duas ou mais exibições lógicas. Alguns exemplos são um editor que tem uma janela dividida com modos de exibição lado a lado ou um designer de formulários que tem um modo GUI/design e um modo de exibição code-behind-the-form.

Para permitir que o editor acesse todos os modos de exibição físicos disponíveis, você deve criar uma cadeia de caracteres de exibição física exclusiva para cada tipo de objeto de exibição de documento que a fábrica do editor pode criar. Por exemplo, a fábrica do editor do Visual Basic pode criar objetos de exibição de documento para uma janela de código e uma janela de designer de formulários.

Criando modos de exibição com várias guias

Embora um objeto de exibição de documento deva ser associado a um modo de exibição físico por meio de uma cadeia de caracteres de exibição física exclusiva, você pode colocar várias guias no modo de exibição físico para habilitar a exibição de dados de maneiras diferentes. Nessa configuração com várias guias, todas as guias são associadas à mesma cadeia de caracteres de exibição física, mas cada guia recebe um GUID de exibição lógica diferente.

Para criar um modo de exibição com várias guias para um editor, implemente a interface e associe um GUID de exibição lógica diferente (LogicalViewID) a IVsMultiViewDocumentView cada guia criada.

O editor HTML do Visual Studio é um exemplo de um editor com um modo de exibição de várias guias. Ele tem as abas Design e Source . Para habilitar isso, uma exibição lógica diferente é associada a cada guia, LOGICALVIEWID_TextView para a guia Design e LOGICALVIEWID_Code para a guia Origem.

Especificando o modo de exibição lógico apropriado, um VSPackage pode acessar o modo de exibição que corresponde a uma finalidade específica, como criar um formulário, editar código ou depurar código. No entanto, uma das janelas deve ser identificada pela cadeia de caracteres NULL e isso deve corresponder à exibição lógica primária (LOGVIEWID_Primary).

A tabela a seguir lista os valores de exibição lógica disponíveis e seu uso.

LOGVIEWID GUID Uso recomendado
LOGVIEWID_Primary Exibição padrão/primária da fábrica do editor.

Todas as fábricas de editores devem oferecer suporte a esse valor. Esse modo de exibição deve usar a cadeia de caracteres NULL como sua cadeia de exibição física. Pelo menos um modo de exibição lógico deve ser definido com esse valor.
LOGVIEWID_Debugging Modo de exibição de depuração. Normalmente, LOGVIEWID_Debugging mapeia para o mesmo modo de exibição que LOGVIEWID_Codeo .
LOGVIEWID_Code Exibir iniciado pelo comando Exibir código .
LOGVIEWID_Designer Exibição iniciada pelo comando Exibir formulário .
LOGVIEWID_TextView Visualização do editor de texto. Esta é a exibição que retorna IVsCodeWindow, a partir da qual você pode acessar IVsTextView.
LOGVIEWID_UserChooseView Solicita que o usuário escolha qual modo de exibição usar.
LOGVIEWID_ProjectSpecificEditor Passado pela caixa de diálogo Abrir com para

OpenItem

quando o usuário escolhe a entrada "(Editor padrão do projeto)".

Embora os GUIDs de exibição lógica sejam extensíveis, você pode usar apenas os GUIDs de exibição lógica definidos em seu VSPackage.

No desligamento, o Visual Studio retém o GUID da fábrica do editor e as cadeias de exibição físicas associadas à janela do documento para que ele possa ser usado para reabrir janelas de documento quando a solução for reaberta. Somente as janelas abertas quando uma solução é fechada são mantidas no arquivo de solução (.suo). Esses valores correspondem aos VSFPROPID_guidEditorType valores e VSFPROPID_pszPhysicalView passados no parâmetro no propid GetProperty método.

Exemplo

Esse trecho ilustra como o objeto é usado para acessar um modo de exibição que implementa IVsCodeWindowo TextView . Nesse caso, o SVsUIShellOpenDocument serviço é usado para chamar OpenDocumentViaProject e solicitar LOGVIEWID_TextView, que obtém um ponteiro para uma moldura de janela. Um ponteiro para o objeto de exibição de documento é obtido chamando GetProperty e especificando um valor de VSFPROPID_DocView. No objeto de exibição de documento, QueryInterface é chamado para IVsCodeWindow. A expectativa, nesse caso, é que um editor de texto seja retornado e, portanto, o objeto de exibição de documento retornado no GetProperty método seja uma janela 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;
}