Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um editor pode criar diferentes tipos de exibições. Um exemplo é uma janela do editor de código, outro é um designer de formulários.
Uma exibição com várias guias é uma exibição que tem várias guias. Por exemplo, o editor HTML tem duas guias na parte inferior: Design e Origem, cada uma com uma exibição lógica. A exibição de design exibe uma página web renderizada, enquanto a outra exibe o HTML que compõe a página web.
Acessando exibições físicas
Visões físicas hospedam objetos de exibição de documentos, cada um representando uma visão dos dados no buffer, como código ou um formulário. Assim, cada objeto de exibição de documento tem uma exibição física (identificada por algo conhecido como uma cadeia de caracteres de exibição física) e geralmente uma única exibição lógica.
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 exibições lado a lado ou um designer de formulários que tem um modo de exibição GUI/design e um modo de exibição do código por trás do formulário.
Para permitir que o editor acesse todas as exibições físicas 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 do designer de formulários.
Criando exibições com várias guias
Embora um objeto de exibição de documento precise ser associado a uma visualização física por meio de uma string única de visualização, você pode adicionar várias guias dentro da visualização física para permitir a visualização de dados de diferentes formas. Nesta configuração com vários 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 uma exibição com vários guias para um editor, implemente a IVsMultiViewDocumentView interface e associe um GUID de exibição lógica diferente (LogicalViewID) a cada guia criada.
O editor HTML do Visual Studio é um exemplo de um editor com exibição em múltiplas abas. Ele tem abas Design e Origem. 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 .
Ao especificar o modo de exibição lógico apropriado, um VSPackage pode acessar a 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 |
Visualização padrão/primária da fábrica de editores. Todas as fábricas de editores devem dar suporte a esse valor. Essa exibição deve usar a cadeia de caracteres NULL como sua cadeia de caracteres de exibição física. Pelo menos uma exibição lógica deve ser definida para esse valor. |
LOGVIEWID_Debugging |
Exibição de depuração. Normalmente, LOGVIEWID_Debugging mapeia para o mesmo modo de exibição que LOGVIEWID_Code. |
LOGVIEWID_Code |
Exibição iniciada pelo comando Exibir Código . |
LOGVIEWID_Designer |
Exibição iniciada pelo comando Exibir Formulário . |
LOGVIEWID_TextView |
Exibição do editor de texto. Essa é 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.
Ao desligar, o Visual Studio mantém o GUID da fábrica do editor e as cadeias de caracteres de exibição física associadas à janela do documento para que ele possa ser usado para reabrir janelas de documentos quando a solução for aberta novamente. Somente as janelas abertas quando uma solução é fechada são mantidas no arquivo solução (.suo). Esses valores correspondem aos VSFPROPID_guidEditorTypeVSFPROPID_pszPhysicalView valores passados no propid parâmetro no GetProperty método.
Example
Este snippet ilustra como o TextView objeto é usado para acessar uma exibição que implementa IVsCodeWindow. Nesse caso, o serviço SVsUIShellOpenDocument é usado para chamar OpenDocumentViaProject e solicitar LOGVIEWID_TextView, obtendo assim um ponteiro para a moldura de uma 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 do 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 é 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;
}